SQL-эквивалент «этого» оператора ABL

Кто-то может понять это утверждение ABL ...

FOR EACH <table> BREAK BY <field as breakgroup>: 
   ....
   IF FIRST-OF(<breakgroup>) THEN DO:
       ....
   END.
   ....
   IF LAST-OF(<breakgroup>) THEN DO:
       ....
   END.
   ....
END.

Приведенный выше код в основном перебирает отдельные записи в таблице, а затем запускает некоторые коды (....) во время определенных частей выполнения. Интересно отметить операторы FIRST-OF и LAST-OF, в которых изменяется значение <breakgroup>, что полезно для агрегирования данных.

Кто-нибудь знает, как реализовать/воспроизвести ту же логику с помощью SQL, возможно, с помощью некоторого VBA?


person user2201485    schedule 23.03.2013    source источник


Ответы (1)


Во-первых, стоит отметить, что SQL, в отличие от OpenEdge ABL, не является 4GL. Он не должен «выполнять код» как таковой, поэтому вам придется использовать другой язык программирования для выполнения операторов SQL в базе данных, извлечения выбранных записей, а затем манипулирования ими на любом языке, который вы можете использовать.

Чтобы получить эквивалент оператора ABL FIRST-OF или LAST-OF, вам пригодятся функции SQL FIRST() и LAST() (Первый() и Последний() объясни их.)

По сути, это означает, что вам нужно будет сделать как минимум три разных оператора SQL Select, чтобы выбрать все записи таблицы, которые вы хотите, один, чтобы выбрать первый из данной «группы» (группа, в конце концов, просто подвыбор записей, отвечающих определенным критериям) и один для выбора последнего из такой группы. Например

SELECT LAST(CustomerType) WHERE CustomerType = "ValuedCustomer"

Теперь, если вы хотите использовать VBA в качестве языка программирования, вы можете выполнять операторы SQL, например, с помощью такой команды:

DoCmd.RunSQL "SELECT LAST(CustomerType) WHERE CustomerType = 'ValuedCustomer'"

Вот запись MSDN для этой команды!

Надеюсь, это помогло!

person LyrixDeRaven    schedule 25.03.2013