Прогресс 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.
(Для производительности вы также можете использовать "списки полей", но это действительно имеет значение, только если соединение осуществляется через глобальную сеть, а не через общую память, и это усложняет синтаксис. Что я не хотел делать для простого примера.)