检查 Informix 4GL 程序更新后是否提交了某些内容

Check if something got committed after an update in Informix 4GL program

我必须在保存我的 4GL 程序时检查此更新中是否确实进行了更改。有时用户只会更新并保存,但实际上没有对 table 进行更新。

我假设在整个更新过程中它必须执行 commit work 以将更改滚动到 table。

有什么方法可以让我在更新结束时检查是否确实提交了某些内容?要么?还有其他建议吗?

我无法保存 previous_data 然后与 current_data 进行比较,因为在不同的地方有太多代码可以完成更新。

谢谢!

您可以在更新完成后立即检查 SQLCA 记录以了解受更新影响的行数,然后再执行任何其他 SQL 操作(例如提交)。这可能仍然算作身份 'changes',但它最接近您想要的可用内容。

我对这个问题的解释是你有类似的东西

INPUT ...
    ...
END INPUT 
IF int_flag THEN
    # Don't update database
ELSE
    # Update database
END IF

如果用户接受对话框,将执行更新数据库的代码。如果用户没有对 INPUT 进行任何更改,那么这可能被认为是浪费时间。

我知道在 Genero 中,我们添加了语法,以便您可以更好地检测对话框中发生的更改,从而仅在发生更改时更新数据库。 http://www.4js.com/online_documentation/fjs-fgl-manual-html/#c_fgl_prog_dialogs_touched_flag.html

如果仍在使用旧的 4gl,field_touched 应该可供您使用。我知道我们可以做到

AFTER INPUT 
    IF int_flag THEN
        EXIT INPUT
    END IF
    IF field_touched(*) THEN
        # User has made a change in the dialog  

并且通过使用 * 测试对话框中的所有字段而不必明确列出它们,您可能必须明确列出字段。因此,在对话之后进行测试可能比您想象的要简单。

类似地,对于具有记录和数组的复杂数据结构,在 Genero 中我们可以通过解析为 JSON 或 XML,然后再解析为字符串来进行比较,因此这些技术也可以使 before/after 对比一衬里。

否则,如果您想在数据库语句执行后进行测试,触发器可能是您的一个选择。创建触发器以将记录插入审计 table 仅当 UPDATE 中发生真正的更改时。