0

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

我会假设在整个更新过程中,它必须commit work将更改滚动到表中。

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

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

谢谢!

4

2 回答 2

0

您可以在 UPDATE 完成后和执行任何其他 SQL 操作(例如 COMMIT)之前立即检查 SQLCA 记录以了解受 UPDATE 影响的行数。这可能仍然会计算身份“更改”,但它是最接近您想要的可用值的近似值。

于 2016-03-15T15:09:41.667 回答
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 中发生真正的更改时,才创建触发器以将记录插入审计表。

于 2016-03-15T22:49:15.283 回答