У меня есть кусок SQL, который я хочу перевести на OCL.Я плохо разбираюсь в SQL, поэтому хочу повысить удобство обслуживания.Мы используем Interbase 2009, Delphi 2007 с разработкой Bold и modeldriven.Теперь я надеюсь, что кто-то здесь хорошо говорит на 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
NOTE : Есть два случая для MessageType, 'IFTMBP' и 'IFTMBF'.
Таким образом, таблица, которая должна быть указана, - ScaniaEdiSolMessage.Он имеет такие атрибуты, как:
- Тип сообщения: Строка
- ChassiNumber: Строка
- ShipFromFinland: Boolean
- Недействительно: Boolean
Он также имеет ссылку на таблицу Parcel с именем ReceivingOwner с BoldId в качестве ключа.
Так что, похоже, в нем перечислены все строки ScaniaEdiSolMessage, а затем есть подзапрос, в котором также перечислены все строки ScaniaEdiSolMessage и назван EdiSolMsg,Тогда это исключает почти все строки.Фактически, приведенный выше запрос дает одно попадание из 28000 записей.
В OCL легко перечислить все экземпляры:
ScaniaEdiSolMessage.allinstances
Также легко фильтровать строки, например, выбрав:
ScaniaEdiSolMessage.allinstances->select(shipFromFinland and not invalidated)
Но я не понимаю, как мне сделать OCL, чтобы соответствовать SQL выше.