我有一段要翻译成 OCL 的 SQL。我不擅长 SQL,所以我想通过这个来提高可维护性。我们正在使用带有 Bold 和模型驱动开发的 Interbase 2009、Delphi 2007。现在我希望这里有人会说好的 SQL 和 OCL :-) 原始 SQL:
Select Bold_Id, MessageId, ScaniaId, MessageType, MessageTime, Cancellation, ChassieNumber, UserFriendlyFormat, ReceivingOwner, Invalidated, InvalidationReason,
(Select Parcel.MCurrentStates From Parcel
Where ScaniaEdiSolMessage.ReceivingOwner = Parcel.Bold_Id) as ParcelState From ScaniaEdiSolMessage
Where MessageType = 'IFTMBP' and
not Exists (Select * From ScaniaEdiSolMessage EdiSolMsg
Where EdiSolMsg.ChassieNumber = ScaniaEdiSolMessage.ChassieNumber and EdiSolMsg.ShipFromFinland = ScaniaEdiSolMessage.ShipFromFinland and EdiSolMsg.MessageType = 'IFTMBF') and
invalidated = 0 Order By MessageTime desc
稍作简化后:
Select Bold_Id, (Select Parcel.MCurrentStates From Parcel
where ScaniaEdiSolMessage.ReceivingOwner = Parcel.Bold_Id) From ScaniaEdiSolMessage
Where MessageType = 'IFTMBP' and not Exists (Select * From ScaniaEdiSolMessage
EdiSolMsg Where EdiSolMsg.ChassieNumber = ScaniaEdiSolMessage.ChassieNumber and
EdiSolMsg.ShipFromFinland = ScaniaEdiSolMessage.ShipFromFinland and
EdiSolMsg.MessageType = 'IFTMBF') and invalidated = 0
注意:MessageType 有 2 种情况,“IFTMBP”和“IFTMBF”。
所以要列出的表是 ScaniaEdiSolMessage。它具有以下属性:
- 消息类型:字符串
- 底盘编号:字符串
- ShipFromFinland:布尔值
- 无效:布尔值
它还有一个指向名为 ReceivingOwner 的表 Parcel 的链接,其中 BoldId 作为键。
所以它似乎列出了 ScaniaEdiSolMessage 的所有行,然后有一个子查询也列出了 ScaniaEdiSolMessage 的所有行并将其命名为 EdiSolMsg。然后它几乎排除了所有行。事实上,上面的查询从 28000 条记录中获得了一次命中。
在 OCL 中很容易列出所有实例:
ScaniaEdiSolMessage.allinstances
也很容易通过选择过滤行,例如:
ScaniaEdiSolMessage.allinstances->select(shipFromFinland and not invalidated)
但我不明白我应该如何制作一个 OCL 来匹配上面的 SQL。