他们,
假设我有这三个表*:
ClownOrders
------------
_pk_order_id
status
ClownOrderLines
----------------
_fk_order_id
_fk_clown_car_id
amount
ClownCars
---------------
_pk_clown_car_id
我想在“ClownCars”表格中提供一个计算列,显示此车辆所有订单的总金额,订单状态未被“取消”。
到目前为止的想法
我在“ClownCars”中创建了一个名为zz_g_canceled的新计算字段,它只包含常量“已取消”。
然后我在“ClownOrderLines”中创建了一个名为c_orderstatus的新计算字段,即ClownOrders:status。
然后我创建了一个名为“OpenClownOrderLines”的新表“ClownOrderLines”,并按此标准将其链接到“ClownCars”:
ClownOrderLines._fk_clown_car_id = ClownCars._pk_clown_car_id和ClownOrderLines.c_orderstatus!= ClownCars.zz_g_canceled。
最后我将这个计算字段添加到ClownCars中,名为totalOrdered,它是sum(OpenClownOrderLines :: amount)
但新栏目“totalOrdered”总是显示“?”现在。
*主题已更改为更好地保留您的兴趣
答案 0 :(得分:3)
您不能在关系的下游使用未存储的计算字段。
在这种情况下,您试图通过关系中的OpenClownOrderLines :: c_orderstatus查看ClownCars中的OpenClownOrderLines表事件。
您可以将c_orderstatus设为存储值(文本字段或存储计算),但只要订单状态发生变化,就必须小心更新任何订单行。
(例如,如果状态更改是脚本化的,您可以将其包含在脚本中,但如果您以其他方式设置状态,则可能会遗忘。)
更好的方法是让订单行表计算金额,如果订单已被取消,则将其计为零。
然后汽车表可以安全地汇总所有订单行,知道任何已取消的订单行都不会增加总额:
ClownOrderLines::c_amount_if_open = If ( ClownOrders::status ≠ 'Cancelled' ; amount ; 0 )
ClownCars::totalOrdered = Sum ( ClownOrderLines::c_amount_if_open )