Farseer

导航

pack/unpack

runbase Framwork用pack和unpack来保存用户上次操作的值,用户上次操作的值会存在SysLastValue表中,这个功能确实蛮酷,不过今天差点被这个东西给整死,在我机子运行上的好好的代码,弄到客户那边去死活run不起来,Application和DataBase都是一样的,认真地跟踪了一遍代码才知道,原来是由于我开发的机子是两层的,客户的环境是三层造成的,太大意了......
两层代码都运行在一个进程中,没有进程间通讯的问题,pack/unpack执行情况:
从数据库里取出上次的数据->调用unpack,并用取得的值初始化Dialog,用户看到上次操作时的值->pack,并把用户的数据写回数据库.
三层:
从数据库里取出上次的数据->调用unpack取出数据->调用pack,发送到client->调用unpack,并用取得的值初始化Dialog,用户看到上次操作时的值->取得用户本次操作所选择的值,调用pack将数据打包->发送到服务器端->调用unpack,进行数据操作->pack,将本次用户的选择存到数据库里.
下面是代码:

class PackUnPackTest extends RunBase
{
    NoYes ifDisplay;
    NoYes ifDisplayNoSave;
    DialogField dialogIfDisplay;
    DialogField dialogIfDisplayNoSave;

    #Define.CurrentVersion(
1)
    #LocalMacro.CurrentList
     ifDisplay
    #EndMacro

}

其中一个DialogField  ifDisplayNoSave没有在CurrentList中.

static void Main(Args arg)
{
     PackUnPackTest PUtest;
     ;
     PUtest 
= new PackUnPackTest();

     
if(PUtest.prompt())
        PUtest.run();

}

上面的Main方法,如果不加server修饰符(当然实际环境中应该用Menuitem的runon属性来定义的,这里论述方便直接在Main上添加),run方法的结果是正确的.

public void run()
{
    super();
    
if(ifDisplay)
        Box::info(
"选中俺了!");
    
else
        Box::info(
"没选中俺!");

    
if(ifDisplayNoSave)
        Box::info(
"选中俺了!");
    
else
        Box::info(
"没选中俺!");

}

如果都选中了,就会显示两次"选中俺了"这样的提示消息.
但是如果添加了server修饰符,无论选不选第二个checkbox,结果都是一样的,第二个提示消息输出"没选中俺".
原因就是因为第二个DialogField没有存到CurrentList中,也就不会从客户端发送到server端,这样每次判断的时候都是默认的No值,sigh.
还有个问题没搞懂,如果在三层模式下,不想保存第二个DialogField的上次输入值,是不是就玩不转了那?等有时间再看一下.
XPO文件也传上来,免得被格掉了.

posted on 2006-08-01 17:41  佛西亚  阅读(803)  评论(3编辑  收藏  举报