QAD Progress编程

更新时间:2024-03-27 15:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

PROGRESS语言

PROGRESS语言是一种非可视化的编程语言,符合4GL规范,具有高级语言的优点,可以进行条件选择(IF、WHERE)、嵌套循环(FOR)、计算(如求和、求平均)等操作,还可以直接进行打印、显示(PUT、DISPLAY),并且不区分大小写。

PROGRESS源程序一般由4部分组成:全局变量定义、图形变量定义(一般是用户指定的查询选择条件)、输出数据的格式和主程序(如何利用数据库中的字段生成用户需要的正确数据)。 全局变量的定义

全局变量用DEFINE VARIABLE 关键字定义。格式如下:

DEFINE VARIABLE W1 LIKE(数据格式INTEGER,CHARACTER??) DEFINE VARIALBE W2 AS VARIABLE2

使用AS可以直接引用已经定义好的数据格式。比如我们要把某个变量定义成和表中的字段类型一致时,可直接定义如下: DEFINE VARIALBE1 AS 表中定义的字段

这样我们就不用再到后台数据库中去查询该字段的数据格式,提高了编程速度。如果这个变量在调用过程中也要用到,则分别定义如下: //在主过程中

DEFINE SHARED VARIABLE W1 LIKE (数据格式INTEGER,CHARACTER??) //在调用过程中

DEFINE NEW SHARED VARIABLE W1 LIKE (数据格式INTEGER,CHARACTER??) 变量的主要数据类型如下表所示: 数据类型 缺省格式 示例

字符型(Character) X(8) Dongnan 日期型(Data) 99/99/99 03/02/99 布尔型(Logical) Yes/No Yes 浮点型(Decimal) ->>,>>9.99 12.00 整型(Integer) ->,>>>,>>.9 12

图形变量的定义

图型变量的定义主要是把已经定义好的变量在界面上显示出来。 /*账户余额查询报表中部分源程序*/ FORM /* 显示一个FORM */ /* 定义一个相当于容器的框 */ RECT-FRAME AT ROW 1 COLUMN 1.25

RECT-FRAME-LABEL AT ROW 1 COLUMN 3 NO-LABEL VIEW-AS TEXT SIZE-PIXELS 1 BY 1 SKIP(.1) /*GUI*/

/* 把变量entity的选择条件显示出来*/

entity colon 25 label ‘会计单位’ entity1 colon 50 label “至” cname colon 25 label‘摘要’

acc colon 25 label ‘账户’acc1 colon 50 label “至” sub colon 25 label ‘分账户’ sub1 colon 50 label “至” ctr colon 25 label ‘成本中心’ ctr1 colon 50 label “至” begdt colon 25 label ‘生效日期’ enddt colon 50 label “至” subflag colon 25 label ‘汇总分账户’ ccflag colon 25 label ‘汇总成本中心’ rpt_curr colon 25 label ‘货币’

with frame a side-labels attr-space width 80 NO-BOX THREE-D /*GUI*/ cname colon 25 label ‘摘要’ 第一行在窗口中的显示如下:

摘要

方框中是供用户输入的选择条件。 报表格式的定义

报表格式的定义非常简单,只要用at和to标出相对位置即可: FORM /*GUI*/ header “期初借方余额” to 65 “期初贷方余额” to 85 “期间活动金额” to 92 “借方活动金额” to 109 “贷方活动金额” to 128 “期末借方余额” to 148 “期末贷方余额” to 164 skip “Account Description” at 1 “账户 摘要 ” at 1

“--------------- ” at 1 “---------------” to 85 “-------------- ” to 134 “-------------- ” to 164

with STREAM-IO /*GUI*/ frame phead1 page-top width 186.

at和to 表示数据在frame phead1 上的相对位置。不同之处在于,at后边的数据表示从该点开始,而to后边的数据表示到该点结束。特别要注意的是,在PROGRESS中,只能画横线,不能画竖线。 数据处理

对于数据的处理,本文主要介绍如何读取数据,以及在编程时需要注意的地方。 我们以账户余额查询报表为例。当在数据库的表中查找数据时,使用下述语句: FOR EACH (表) WHERE (条件) //对表中数据进行处理

//对符合条件的每个数据进行处理 END

只访问表中指定的一个数据:

FIND FIRST OR LAST (表) WHERE (条件)。 //对表中数据进行处理 END。

查找条件之间用OR 或者AND 连接。

在PROGRESS中,有两对语句FIRST 和FIRST-OF、LAST和LAST-OF,这两个判断语句非常重要,常用于判断循环的开始还是结束以及循环中的分类是开始还是已经结束。

FIRST(BREAK-GROUP ):当前的循环是循环体的第一次循环则返回TRUE,如果不是则返回FALSE;

FIRST-OF(BREAK-GROUP ):当前的循环是循环中的分类的第一次循环则返回TRUE,如果不是则返回FALSE; LAST(BREAK-GROUP ):当前的循环是循环体的最后循环则返回TRUE,如果不是则返回FALSE;

LAST-OF(BREAK-GROUP ):当前的循环是循环中的分类的最后一次循环则返回TRUE,如果不是则返回FALSE。

如果程序需要处理大量的数据,可以使用调用过程。调用过程可以采用*.P或者*.I文件。它们的区别在于*.I文件是包含文件,在编译时不生成相应的*.R文件;而*.P文件生成相应的*.R文件。

注意:如果在过程中多次使用到同一个表,必须定义一个BUFFER格式: DEFINE BUFFER WW LIKE (表名)

WW为表的别名。如果不定义BUFFER,编译时将出现“TABLE 无法辨别!”的警告。

PROGRESS编程其实很简单(二)

PROGRESS程序架构。

PROGRESS启动应用程序,通常都是先启动一个主程序,比如mf.p,这个mf.p做一些全局变量设置,并初始化应用程序菜单。当用户执行菜单功能时,实际上是运行菜单所指定的程序!在这种模式下,PROGRESS的程序一般都不大,结构明了可读性很强,每个程序目的非常明确,但是也要遵循一定的准则,方便以后的阅读和修改。

一、程序扩展名的设定。

.p 主程序(可直接运行,或者编译以后挂主菜单被调用)

.i 子程序(经常使用的执行某一特定功能,或者为了使主程序易于阅读脱离出来) .v 验证程序

.w Windows的程序(Windows版的Progress支持可视化的组件编程,组件拉一拉放一放,就自动生成.w的文件了) .r 编译后的程序(菜单调用时,实际上是执行.r的程序)

二、程序的命名规则。

主程序格式: aa + bb + cc + dd.p 其中:

aa --- 系统模块ID bb --- 系统功能

cc --- 程序类型(mt -维护、iq -查询或者rp -报表等) dd --- 序列号

子程序格式:通常是 主程序a.i 主程序b.i 这样子

//关于程序的命名,个人觉得也没必要一定要遵循特定格式,一家公司有自己固定的命名方式,容易区分即可;如果是咨询公司或者系统集成公司,则要先了解客户的命名习惯和规则;同理,下面的“程序头”。

三、程序头。

以注释的形式,标明尽可能多的程序相关的信息,比如:程序名(路径,不过路径一般都是企业自己规定好了)、作者、菜单号、功能(菜单标题)、创建日期、修改日志等。至于格式,也就是POSE,爱怎么摆怎么摆,清楚明了即可。但是,在同一家公司,风格应该统一。另外,关于修改日志,个人觉得最好在程序头和程序体,都明显说明一下修改的日期和原因,要点。(注释不记入程序长度,所以不要担心程序太长,:p )

四、维护类程序模板。

注意:为方便说明,注释暂时用“//”,但是在PORGRESS程序里是错误的哈! define variables.

{mfdtitle.i} //程序头,全局变量定义等,是标准QAD的菜单程序就请加上这个,不要问为什么 form with frame a. //定义格局(包含输入输出) Mainloop: repeat:

prompt-for ? editing: //通常这里输入主要字段(如果比如订单号,料件名称等) {mfnp.i} //前后记录显示功能,常用 end.

/* ADD/MODI/DELETE */ assign global…

find …

if not available ? //新记录

{mfmsg.i 1 1} //类似mfmsg的子程序,都是信息提示类 create … assign … end.

Status = stline{2}.

update go-on (F5 or Ctrl-D) //继续维护剩余字段

if F5 or CTRL-D then do: //判断是否按了删除键,一般定义是F5或者Ctrl + D del-yn = yes.

{mfmsg01.i 11 1 del-yn} end. End.

Status input.

五、报表类程序的模板。

{mfdtitle.i}

form definition [selection criteria] part colon 15 part1 colon 40 label {t001.i} effdate colon 15 effdate1 colon 40 label {t001.i} with frame a side-labels width 80.

//以上4行定义用户输入“限制报表输出”的条件,比如生效日期啊什么的 repeat:

if part1 = hi_char then part1 = “”. //如果用户不输任何东西,则默认最大字符或者最小字符,以下类似 if effdate = low_date then effdate = ?. if effdate1 = hi_date then effdate1 = ?. data statements [selection criteria] bcdparm = \

{mfquoter.i part } //BATCH专用,至今没用过,体会不到好处,哪位帮忙解释一下? {mfquoter.i part1 } {mfquoter.i effdate} {mfquoter.i effdate1 }

{mfselbpr.i “printer” 132} //选择打印机的子程序 if part1 = “” then part1 = hi_char. if effdate = ? Then effdate = low_date. if effdate1 = ? Then effdate1 = hi_date. {mfphead.i or mfphead2.i} //报表头 for each… display

{mfrpchk.i} or {mfrpexit..i} //报表结束 end.

{mfrtrail.i} or {mftr0801.i} or {mfreset.i} //报表结束、打印结束等 end.

六、查询类程序模板。

这个比报表来得要简单些了: {mfdtitle.i}

form definition [selection criteria] with frame a side-labels width 80. repeat:

data statement [selection criteria] with frame a. {mfselprt.i “terminal” 80 } for each [selection criteria] display …

{mfrpchk.i} (max page) end.

{mfreset.i} (scroll output) {mfmsg.i 8 1} end.

这里先写一些常用命令:让大家见笑了。 create update/set insert display repeat...end for each ...end delete

prompt-for 须与input匹配 find first(last)

where .....= input .....与using等同 input

with n column , with no-lable ,no-error ,not available except assign message

if ............then ...........else define variable label \EQ 就是=的意思 begins \以..开头的

matches \是通配符,以F开头的 matches \此处是与F匹配的

use-index 后跟必须为表的索引,以升序来显示 by ......后跟任意字段,以升序显示 by ......descending 以降序显示

by substring(lname,2,3)以lname的第2个字符起,后3个字符来升序显示 of 左右表单中相同的字段作比较 with 1 down一次只显示一笔 hide 隐藏

with frame a 定义frame a ,指定显示frame undo , retry 取消操作,恢复原有信息 do:................end.组合命令 attr-space 每个字段之间空格 no-attr-space 无空格 initial 在定义变量时赋值 next下一个字段名 leave 离开,推出

down 可逐个向下显示,但位置不同,显示效果不同 pause 暂停 , pause n 暂停n秒后自动向下 viesw frame显示 frame no-box 不加外框 side-labels 单行显示 overlay覆盖 top-only最上层显示

with row 7 colon 20距顶7行,距左20列 retain n保留n笔资料 color display 变色显示 auto-return 自动跳到下一笔 @指定显示栏位

blank 输入时屏幕上不显示输入内容 validate验证 NE 为..........

EXM: validate(lname NE \

意为:lname为空时,资料不接受,提示“Please Enter a name”。 column-label 与 !配合使用 to n在n结束 , at n 在n 起始

DEF WORKFILE X和DEF TEMP-TABLE X有什么区别呢, 我用TEMP-TABLE 用的多一些

简要地讲:前者是占用内存空间,后者使用磁盘空间。 Workfile 不能定义索引; Temp-table可以

with frame a 定义frame a ,指定显示frame undo , retry 取消操作,恢复原有信息 do:................end.组合命令 attr-space 每个字段之间空格 no-attr-space 无空格 initial 在定义变量时赋值 next下一个字段名 leave 离开,推出

down 可逐个向下显示,但位置不同,显示效果不同 pause 暂停 , pause n 暂停n秒后自动向下 viesw frame显示 frame no-box 不加外框 side-labels 单行显示 overlay覆盖 top-only最上层显示

with row 7 colon 20距顶7行,距左20列 retain n保留n笔资料 color display 变色显示 auto-return 自动跳到下一笔 @指定显示栏位

blank 输入时屏幕上不显示输入内容 validate验证 NE 为..........

EXM: validate(lname NE \

意为:lname为空时,资料不接受,提示“Please Enter a name”。 column-label 与 !配合使用 to n在n结束 , at n 在n 起始

DEF WORKFILE X和DEF TEMP-TABLE X有什么区别呢, 我用TEMP-TABLE 用的多一些

简要地讲:前者是占用内存空间,后者使用磁盘空间。 Workfile 不能定义索引; Temp-table可以

本文来源:https://www.bwwdw.com/article/obzr.html

Top