您的位置:首页 > 编程语言

PROGRESS编程其实很简单(三)

2010-05-17 14:24 169 查看
这章,重点解释PROGRESS报表的精髓 first-of() & last-of() 。
首先给出本章教程用到的示例信息---demo表的结构和数据。
因为测试环境只连接了一个数据库,所以本文所有对字段的引用都直接写出来而没有特别指明表名,如果是多数据库环境,则需要带表名。
(比如数据库名是dtbl,表名是demo,那么对字段的引用应该是:dtbl.demo.mdlno)
【结构】



【数据】



1、first-of() & last-of()的语法;

先看示例:
for each demo break by demo.vend:
if first-of(demo.vend) then disp demo.vend.
end.


/*结果是显示hp和ibm两条记录*/
很明显可以看出来的就是,每个first-of或者last-of对应的字段,必须有for each ... break by来对应它,否则语法错误(即使first-of的字段是索引也会出错)。
比如以下语句会出错:
for each demo no-lock:
if first-of(demo.vend) then disp demo.vend.
end.


2、函数的功能;

first-of()函数的功能,就是通过break by 对该字段进行排序,然后对该字段相同的记录进行“预览”,当第一次出现时发生!比如,示例中,break by首先对demo.vend进行排序,这样会出现很多vend是“hp”和“ibm”的记录,当第一次出现“hp”记录和第一次出现“ibm”记录时,各显示一下该vend名称。
last-of()一样,不同的是“最后一次出现时发生”!
请看示例:
for each demo break by demo.mdlno:
if last-of(demo.mdlno) then disp demo.
end.


这段程序的结果如下:



通过收货日期和数量等,可以看到,每条记录,都是相同“mdlno”的最后一条

3、应用;

通过以上分析,不知道大家有没有懂的真正的意思呢?
现在如果要实现这样的报表,那又该怎么写程序呢?
对每个mdlno收货进行合计,然后在mdlno的下一行显示合计数,类似这样的结果:



不看答案自己想想看。
参考答案(为方便阅读暂不用accum()函数):
DEF VAR ttl AS DECI.
OUTPUT TO c:\demoout.txt.
FOR EACH demo BREAK BY demo.mdlno:
ttl = ttl + demo.qty.
PUT demo.mdlno demo.rcvdt demo.qty SKIP .
IF LAST-OF(demo.mdlno) THEN do:
PUT "                     合计" ttl SKIP.
ttl = 0.
END.
END.
OUTPUT CLOSE.


说明:first-of 和 last-of 可以对应多个 break by的字段,比如可以先按mdlno汇总,再按 vendor汇总!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: