进度4gl:计算记录?

时间:2014-10-12 12:16:48

标签: progress-4gl openedge progress-db

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

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

SQL中的

我试过这样,

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

请帮助我进步。  感谢。

1 个答案:

答案 0 :(得分:2)

规则#1 - 进度 SQL。在4gl中尝试使用SQL的过程中只有痛苦和痛苦。

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

select count(*) from customer.

但是很久以前就把它放在了产品中,并且只是为了满足90年代早期的清单导向产品评估。它有时对于即席查询中的快速黑客有用,但不适用于严重的用途。 IOW“它是一个很好的演示”。通过SQL-92接口支持Real 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.

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

你可以使用FOR EACH涉及中断组和自动计数功能做更复杂的事情,但这些选项不是更快,它们是,恕我直言,更不易读。特别是那些刚刚开始使用4gl的人。

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