【问题标题】:Progress 4gl :Counting Records?Progress 4gl:计数记录?
【发布时间】:2014-12-07 03:13:30
【问题描述】:

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

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

在 SQL 中我试过这样,

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

请帮助我进步。 谢谢。

【问题讨论】:

    标签: progress-4gl openedge progress-db


    【解决方案1】:

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

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

    select count(*) from customer.
    

    但这是很久以前在产品中加入的,实际上只是为了满足 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.
    

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

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

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

    【讨论】:

    • 非常感谢您的回复,汤姆。但我想为所有客户打印。
    • 我试过这个,对于每个 so_mstr ,其中 so_domain="xxx" 被 so_cust 打破。显示 so_cust so_nbr(按 so_cust 计数)。结束。
    • 这是一个例子——如果你想解决你的实际问题,你需要问你真正想要什么。并公开表之间的完整架构和关系。关键是要获得正确的 WHERE 子句。
    • 我不会尝试使用“count”或任何其他聚合关键字。它们使您的代码不可读,并且很难正确处理。只需创建一个变量。它更简单,效果更好。
    • "我不会尝试使用 count" ...我完全同意 TomB 的另一件事!每当我尝试使用这些东西时,我总是最终以“老式方式”重写它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2023-03-20
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多