如果在此更新中实际发生了更改,我必须检查保存我的4GL程序。有时用户只会更新并保存,但实际上没有对表进行更新。
我认为在整个更新期间,它必须执行commit work
将更改滚动到表中。
如果确实提交了某些内容,我有什么方法可以在更新结束时查看?要么?还有其他建议吗?
我无法保存previous_data
,然后与current_data
进行比较,因为在不同的地方有很多代码可以进行更新。
谢谢!
答案 0 :(得分:0)
您可以在完成后以及执行任何其他SQL操作(例如COMMIT)之前立即检查SQLCA记录中受UPDATE影响的行数。这可能仍然会计算身份'变化',但它最接近你想要的东西。
答案 1 :(得分:0)
我对这个问题的解释是你有类似
的东西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,然后进行字符串比较来进行比较,因此这些技术也可以使前/后比较成为一个衬里。
否则,如果要在执行数据库语句后进行测试,可能会为您启用触发器。仅当UPDATE中发生了真正的更改时,才创建触发器以将记录插入审计表。