Informix ISQL执行指令:表的编辑后与表的添加更新后

Informix ISQL执行指令:表的编辑后与表的添加更新后,informix,Informix,INFORMIX-SQL 7.3执行屏幕: 根据文档,在“表的添加或更新后”控制块中,其指令在将行添加或更新到表之前执行,而在“表的添加或更新后”控制块中,其指令在将行添加或更新到表之后执行。据推测,这意味着任何改变链接到table.columns的字段标记值的指令都不会提交到表中,但是链接到displayonly字段的字段标记会改变吗 然而,当使用“添加表更新后”时,我放置了一些指令,这些指令改变了链接到table.columns的字段标记的值,它们的显示值和提交值也发生了变化!我本以为“添加

INFORMIX-SQL 7.3执行屏幕:

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

然而,当使用“添加表更新后”时,我放置了一些指令,这些指令改变了链接到table.columns的字段标记的值,它们的显示值和提交值也发生了变化!我本以为“添加表更新后”只会改变displayonly字段


  • “z”是事务表中的一列吗
  • “z”中的值导致“q”(又名transaction.trx_type)的值发生变化,并且修改后的值存储在数据库中,这是一个问题吗
  • “z”中的值是事务表的一部分吗
  • 您是否使用查询语言选项或简单(默认)表单验证了数据库中的值确实发生了更改
看起来可能是因为该指令也在显示后使用,因此当从数据库检索值时,“q”中显示的值将是与“z”中存储的值对应的映射值。您必须检查原始数据以隐藏该映射

如果这不是问题,请:

  • 修改问题以显示“z”来自何处
  • 还要准确描述你所做和看到的事情
  • 确认修改了数据库中的数据,而不是屏幕上的数据

  • 你能看看这个表格加表格对你的作用和对我的一样吗

    表事务 形式 实验 [括号内的数字由IDS/Perform自动生成。]

    • 添加一行数据(1),V,E,23
    • 观察显示屏是否为:1、E、E、23
    • 退出表单
    • 观察表中的数据为:1,V,E,23
    • 重新输入表单并查询数据
    • 将数据更新为:(1),T,T,37
    • 观察显示屏是否为:1,T,T,37
    • 退出表单
    • 观察表中的数据为:1,T,T,37
    • 重新输入表单并查询数据
    • 将数据更新为:(1),P,1,49
    • 观察显示屏是否为:1,E,1,49
    • 退出表单
    • 观察表中的数据是:1,P,1,49
    • 重新输入表单并查询数据
    • 观察显示屏是否为:1,E,1,49
    • 选择“更新”,并观察显示更改为:1,P,1,49
    我使用以下步骤完成了“观察表中的数据为”步骤:

    sqlcmd -d stores -e 'select * from transaction'
    
    这将生成如下行(反映不同的运行):

    这是我的SQLCMD程序,不是微软的同名新贵。对于DB Access,您可以做或多或少相同的事情,只是噪音更大(13行无关的输出),最好将SELECT语句写入文件中,并将其作为参数提供:

    $ 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.
    
    $
    
    结论 这是我使用ISQL 7.50.FC1在Solaris 10(SPARC)上观察到的结果;它与手册所描述的内容相匹配,也是我在回答的原始部分所建议的可能是问题-您在表单上看到的不是数据库中的内容(因为说明部分)

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


    删除评论前转录评论:

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

    有了测试用例(表模式和显示问题的执行屏幕),您就可以转到IBM技术支持,使用“Look-当表单很小时,它可以正常工作;而Look,当表单很大时,它不能正常工作”。然后,bug应该是可跟踪的。您需要包括如何复制类似于我给您的错误的说明。同时运行两个表单——一个简单,一个复杂,并显示bug——来显示数据是如何存储和显示的,这是没有问题的。你可以用“表格A”和“表格B”来描述这些步骤,表格A是绝对可以的,表格B被认为是有缺陷的。因此,在表格B中添加具有特定值的记录;之后显示表格B中显示的内容;以表格A的形式显示数据库中存储的内容;表明他们在应该的时候没有什么不同


    请记住,那些将要解决问题的人对产品的经验比你或我都少,所以请尽量简单。删除尽可能多的属性;请留下评论,以确定数据类型等。

    请给出一个最简单的示例,说明您正在做什么?我想看看属性和说明部分的相关部分。
    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
    
    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.
    
    $