代码之家  ›  专栏  ›  技术社区  ›  Joe R.

ISQL Perform指令:表的编辑后与表的添加更新后

  •  1
  • Joe R.  · 技术社区  · 14 年前

    INFORMIX-SQL 7.3执行屏幕:

    根据文献记载,在“表的添加或更新之后”控制块中,其指令在行被添加或更新到表之前执行,而在“表的添加或更新之后”控制块中,其指令在行被添加或更新到表之后执行。假设,这意味着任何改变链接到table.columns的字段标记值的指令都不会提交到表中,但是链接到displayonly字段的字段标记会改变吗?

    但是,当使用“在添加表的更新之后”时,我放置了一些指令,这些指令改变了链接到table.columns的字段标记的值,并且它们的显示值和提交值也改变了!我原以为“添加表更新后”只会改变displayonly字段。


    TABLES
        customer
        transaction
        branch
        interest
        dates
    
    ATTRIBUTES
    [...]
    q  = transaction.trx_type, INCLUDE=("E","C","V","P","T"), ...;
    tb = transaction.trx_int_table,     
         LOOKUP f1   = ta_days1_f,
                t1   = ta_days1_t,
                i1   = ta_int1,
                [...]
          JOINING *interest.int_table, ...;
    [...]
    
    INSTRUCTIONS
    
    customer MASTER OF transaction
    transaction MASTER OF customer
    delimiters ". ";
    
    AFTER QUERY DISPLAY ADD UPDATE OF transaction 
    
        if z = "E" then let q = "E"
        if z = "C" then let q = "C" 
        if z = "1" then let q = "E"
    
    [...]
    END
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Jonathan Leffler    14 年前
    • “z”是事务表中的一列吗?
    • 问题是“z”中的值导致“q”的值发生变化(即transaction.trx\u类型),并且修改后的值存储在数据库中?
    • 您是否验证了DB中的值确实发生了更改-使用查询语言选项或简单(默认)表单?

    看起来可能是因为在显示之后也使用了指令,所以当从DB中检索值时,“q”中显示的值将是与“z”中存储的值对应的映射值。您必须检查原始数据以隐藏映射。

    如果这不是问题所在,请:

    1. 修改这个问题以显示“z”来自何处。
    2. 确认修改了数据库中的数据,而不是屏幕上的数据。

    表事务

    CREATE TABLE TRANSACTION
    (
        trx_id        SERIAL  NOT NULL,
        trx_type      CHAR(1) NOT NULL,
        trx_last_type CHAR(1) NOT NULL,
        trx_int_table INTEGER NOT NULL
    );
    

    形式

    DATABASE stores
    SCREEN SIZE 24 BY 80
    {
    trx_id              [f000]
    trx_type            [q]
    trx_last_type       [z]
    trx_int_table       [f001       ]
    }
    END
    TABLES
        transaction
    ATTRIBUTES
    f000 = transaction.trx_id;
    q    = transaction.trx_type,      UPSHIFT, AUTONEXT,
                                      INCLUDE=("E","C","V","P","T");
    z    = transaction.trx_last_type, UPSHIFT, AUTONEXT,
                                      INCLUDE=("E","C","V","P","T","1");
    f001 = transaction.trx_int_table;
    
    INSTRUCTIONS
    AFTER ADD UPDATE DISPLAY QUERY OF transaction
        IF z = "E" THEN LET q = "E"
        IF z = "C" THEN LET q = "C" 
        IF z = "1" THEN LET q = "E"
    END
    

    [带圆括号的数字由IDS/Perform自动生成。]

    • 退出窗体。
    • 注意表中的数据是:1,V,E,23。
    • 将数据更新为:(1),T,T,37。
    • 退出窗体。
    • 重新输入表单并查询数据。
    • 将数据更新为:(1),P,1,49
    • 观察显示:1,E,1,49。
    • 观察表中数据为:1,P,1,49。
    • 重新输入表单并查询数据。
    • 选择“更新”,观察显示是否更改为:1,P,1,49。

    我使用以下步骤执行了“观察表中的数据是”步骤:

    sqlcmd -d stores -e 'select * from transaction'
    

    1|V|E|23
    1|P|1|49
    

    $ echo "select * from transaction" > check.sql
    $ dbaccess stores check
    
    Database selected.
    
    
    
         trx_id trx_type trx_last_type trx_int_table 
    
              1 P        1                        49
    
    1 row(s) retrieved.
    
    
    Database closed.
    
    $
    

    这是我在使用isql7.50.FC1的solaris10(SPARC)上观察到的;它与手册所描述的内容相匹配,也是我在原始部分所建议的,答案可能是问题所在-您在表单上看到的不是数据库中的内容(因为“说明”部分)。

    你看到不同的东西了吗?如果是这样,那么ISQL中可能有一个bug已经被修复了。从技术上讲,我相信isql7.30已经不受支持了。你能升级到比那更新的版本吗(我不确定7.32是否仍然受支持,但你真的应该升级到7.50;当前版本是7.50.FC4。)


    在某种程度上,你复制我的结果是件好事。坏消息是,在更大的形式,我们有不同的行为。我希望ISQL能够验证所有的限制,比如列的数量等等。但是,考虑到bug,它们有可能没有得到正确的验证,或者可能有一个单独的问题只在较大的表单中显示出来。因此,您需要确保您拥有产品的受支持版本,并且问题会在其中重现。理想情况下,您将有一个较小版本的表(或者至少是表单)来显示问题,或者有一个更小的(但不像我的示例那样小)版本来显示没有问题。

    请记住,那些谁将解决这个问题有较少的经验比你或我的产品-所以保持尽可能简单。删除尽可能多的属性;留下注释以标识数据类型等。