Прогресс 4gl: Подсчет рекордов?

Я новичок в прогрессе 4gl. у меня есть один запрос, где я должен посчитать количество заказов на продажу для конкретного клиента.

Например: у меня есть таблица как so_mstr, а so_cust - это поле моего имени покупателя, а so_nbr - поле номера моего заказа на продажу.

в SQL я пытался так,

select so_cust,count(distinct so_nbr) from so_mstr group by so_cust.

Пожалуйста, помогите мне в прогрессе. Благодарю.

1 ответ

Решение

Правило № 1 - Прогресс НЕ SQL. Ничто, кроме боли и агонии, не стоит на пути попытки использовать SQL в 4gl.

4gl поддерживает некоторый ограниченный синтаксис SQL-89, такой как:

select count(*) from customer.

но это было введено в продукт очень давно и на самом деле просто для того, чтобы соответствовать оценкам, ориентированным на контрольные списки, с начала 90-х годов. Иногда это полезно для быстрого взлома специального запроса, но не для серьезного использования. IOW "это хорошая демонстрация". Реальный SQL поддерживается через интерфейс SQL-92. Который является отдельным продуктом от 4gl и обычно используется для поддержки инструментов отчетности, таких как Crystal Reports или чего-либо еще.

Если для каждого заказа есть один "so_mstr" и вам необходимо знать количество заказов для каждого клиента, то простой способ подсчета этих записей в 4gl:

define variable i as integer no-undo.

for each so_mstr no-lock where so_mstr.so_domain = "xxx" break by so_mstr.so_cust:
  i = i + 1.
  if last-of( so_mstr.so_cust ) then
    do:
      display so_mstr.so_cust i.
      i = 0.
    end.
end.

Ваш код пытается что-то сделать с "отличным", поэтому моё предположение об уникальности номеров заказов на продажу для каждого клиента может быть ошибочным (но для кого-то это действительно плохой дизайн).

Вы можете делать более сложные вещи с FOR EACH, включая группы перерывов и функции автоматического подсчета, но эти опции не быстрее, и они, IMHO, гораздо менее читабельны. Особенно для тех, кто только начинает работать с 4gl.

(Для производительности вы также можете использовать "списки полей", но это действительно имеет значение, только если соединение осуществляется через глобальную сеть, а не через общую память, и это усложняет синтаксис. Что я не хотел делать для простого примера.)

Другие вопросы по тегам