Progress 4gl :计数记录?

Ank*_*ita 0 progress-4gl progress-db openedge

我是 4gl 的新手。我有一个查询,我必须计算特定客户的销售订单数量。

例如:我的表为 so_mstr,so_cust 是我的客户名称字段,so_nbr 是我的销售订单编号字段。

在 SQL 我试过这样,

select so_cust,count(distinct so_nbr) from so_mstr group by so_cust.
Run Code Online (Sandbox Code Playgroud)

请帮助我进行中。谢谢。

Tom*_*com 5

规则#1——进度不是SQL。在 4gl 中尝试使用 SQL 的道路上只有痛苦和痛苦。

4gl 确实支持一些有限的 SQL-89 语法,例如:

select count(*) from customer.
Run Code Online (Sandbox Code Playgroud)

但那是很久以前的产品,实际上只是为了满足 90 年代初以清单为导向的产品评估。它有时对于临时查询中的快速破解很有用,但不适用于认真使用。IOW“它是一个很好的演示”。通过 SQL-92 接口支持真正的 SQL。这是一个独立于 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.
Run Code Online (Sandbox Code Playgroud)

您的代码正在尝试做一些“不同”的事情,所以我对每个客户的销售订单号的唯一性的假设可能是错误的(但这对某人来说似乎是一个非常糟糕的设计)。

你可以用 FOR EACH 做更复杂的事情,包括中断组和自动计数功能,但这些选项并没有更快,恕我直言,它们的可读性要差得多。特别是对于刚开始使用 4gl 的人。

(为了提高性能,您也可以使用“字段列表”,但这仅在连接通过 WAN 而不是通过共享内存时才重要,并且它使语法复杂化。对于一个简单的例子,我不想这样做。)