Progress语言讲解


2023年12月16日发(作者:西铁城手表售后维修点查询)

目 录

1 PROGRESS数据字典的使用

2 PROGRESS常用命令

2.1 数据类型

2.2 定义命令

2.3 输出显示命令

2.4 数据记录操作命令

2.5 其他命令

2.6 判断、循环

3 PROGESS常用函数

3.1 转换函数

3.2 截取函数

3.3 运算函数

3.4 记录状态函数

3.5 逻辑函数

3.6 mfg/pro的函数

4 Progress基础

4.1 变量定义

4.2 注释

4.3 记录显示

4.4 判断

4.5 循环

4.6 赋值运算

5 Progress进阶

5.1 First-of() 和 last-of()用法

5.2 函数功能

5.3 应用

2

5

5

5

5

6

6

6

7

7

8

8

8

9

9

9

9

141718

1 PROGRESS数据字典的使用

数据字典

建立表

建立字段

建立索引

DUMP/LOAD功能

2 PROGRESS常用命令

2.1 数据类型

char

decimal(deci) format “>>>9.99”

integer(int) format “>>>9”

logical(log)

date format “9999/99/99”

2.2 定义命令

define var part1 as char format “x(8)” init ‘1’.-----------------变量定义

define (new) shared var part1 as char format “x(8)” init ‘1’.------------变量定义

define var part1 like pt_part.----------------类似变量定义

define var qty as decimal extent 10.--------数组定义,初始化 qty = 0

Define buffer part_m for pt_mstr.------------BUFFER定义

2.3 输出显示命令

disp part label ‘零件号’ descry label ‘描述’.

put part at 1.

Skip(n)

Message “加入新记录”

Message "系统控制文件必须维护" VIEW-AS ALERT-BOX INFORMATION(warn/error)

BUTTONS OK title "提示".

2.4 数据记录操作命令

Create

Delete

set

Update

Prompt-for

Assign

Find

break by part by type desc

where

2.5 其他命令

Undo,retry.

Validate(part begins ’1’,”零件号应以1开头”)

begins : if var1 begins ‘a’ then …. 以什么打头

leave

next

100 modulo 3 = 1:取余数

+ - * / = <> <= >= < > : 加、减、乘、除、等于、不等于。。。

2.6 判断、循环

if-then-else 判断

if var1 > var2 then

var1 = 100 .

else

var2 = 100.

If var1 >= var2 then

do:

If var1 > 20 then

do:

F1 = 10.

F2 = 20.

End.

End.

Else do:

end.

DO循环

Do I = 1 to 10:

A = b + c.

B = a / c.

End.

Repeat 循环

Repeat:

A = a + 10.

If a >= 100 then l

eave.

End.

For each 循环

For each pr01m where pr01m_036 > = ‘a1’ and pr01m_036 <= ‘a3’:

If pr01m_002 begins ‘1’ then

next.

Find first dpt_m where pr01m_016 = dpt_no no-lock no-error.

If avail dpt_m then

v_name = dpt_name.

Else

v_name = “”.

Disp pr01m_002 pr01m_003 .

End.

3 PROGESS常用函数

3.1 转换函数

string(100.02):将数字/日期转换成字符

date(month,day,year):转换成日期

date('02/02/10'):转换成日期

year 取日期年

month 取日期月

day 取日期日

today 今天日期

asc 转换成asc函数

asc(“a”)

length 长度函数

length(“sdfaa”)

3.2 截取函数

substr(string,3,4)

trim(string):去掉空格

index1 = lookup(string1,string2)

3.3 运算函数

truncate(100.26,1) = 100.20:某位以后的数字清零

integer(100.23) = 100:四舍五入取整

accum 合计函数

FOR EACH ld_det BREAK BY ld_part:

ACCUM ld_qty_oh(TOTAL BY ld_part).

DISP ld_part ld_qty_oh ACCUM TOTAL BY ld_part ld_qty_oh .

END.

maximum 最大值函数

DISP MINIIMUM("aaa","bbb","kkkk","dd").

minimum 最小值函数

DISP MINIIMUM("aaa","bbb","kkkk","dd").

Round 取整函数

Round(int,2)

Random 随机函数

Randam(int1,int2)

3.4 记录状态函数

first-of 第一条记录

first-of(字段名)

last-of 最后一条记录

last-of(字段名)

available 可以得到记录

available pt_mstr

can-find 可以到记录

locked 记录锁

3.5 逻辑函数

and 与

not 非

or 或者

3.6 mfg/pro的函数

{mfdtitle.i }:菜单变量定义

{mfselprt.i "printer" 132}:打印选择定义

{mfrhead.i} “报表头”

{mfrtrail.i} “报表尾”

{mfnp.i machine_mstr machine_wkctr machine_wkctr machine_code machine_code

machine_code }

4 Progress基础

4.1 变量定义

变量必须在第一次被使用之前定义,可以定义在程序的任何地方!但是通常为了增加程序的可读性,变量定义都放在程序的开始处!

举例:

define variable str01 as char label "DemoString" initial "hello".

def var str02 like str01.

def var dt01 as date extent 5.

def var inte01 as inte format ">>>9".

描述说明:

第一行:str01是变量名,变量名不要与系统关键字重复,字符或者下划线开头;

label 就是后续程序中对变量的描述;

initial 给变量赋初始值。

第二行:def和var都是简写,def是define的简写,var是variable的简写; PROGRESS支持语法简写

like和as的不同点是:as后面直接说明变量类型,而like后面跟另外一个变量或者字段。

第三行:extent 5 ,表示该变量是数组变量。

第四行:format ">>>9" 指定变量格式指定变量格式一个最大的好处就是预留宽度,这个对变量的输入或报表的输出都很有用的。

PROGRESS程序每行结束必须有个“.”号!!!

4.2 注释

注释就是用/* ... */ ,可以嵌套,比如:

/*---注释1

/* 注释2 */

---*/

4.3 记录显示

举例:

如果进入PROGRESS编程模式以后连接了数据库,那么直接显示记录的值即可。

for each TABLE_NAME:

display TABLE_NAME.

end.

/*显示TABLE_NAME所有字段所有记录*/

或者:

find first TABLE_NAME.

display TABLE_NAME.

/*显示TABLE_NAME第一条记录所有字段的值*/

通常显示记录值都是采用这2种方式!当然,可以按要求显示特殊的字段,比如:

FOR EACH pt_mstr WHERE pt_model BEGINS "E" NO-LOCK BREAK BY pt_price:

DISP pt_model pt_price.

END.

描述说明:

1、where 后面带条件,比如 = <> <= >= 等等,这种关系符,适用数字、日期字符串

2、no-lock,这是关键字,你只要记住:

如果接下来需要对记录进行修改,就不要用no-lock这个关键字。如果只是查看数据,请加上no-lock

3、break by ,就是按某个字段排列,默认是按这个字段的升序,如果降序则后面加上 desc,比如:

break by pt_price desc。

如果需要多次排列,那么多by几次就可以,比如:

break by pt_price by pt_date

举例:

另外一个常用的显示或者更新记录的语句是find

find pt_mstr where pt_model = "mainboard" no-lock no-error.

find first pt_mstr where pt_price <= 10 no-error.

find last pt_mstr where pt_price <= 10 no-error.

描述说明:

1、where后面的条件跟for each语句类似;

2、no-lock的作用跟for each的no-lock也是一样的;

3、no-error,通常是find就加上,否则如果不到满足条件的记录,系统会出错误提示;而实际上,通常需要在程序自己判断结果;

4、find first 就是定位第一条满足条件的记录;find last 定位最后一条满足条件的记录;

4、还有一种叫find next,就是定位当前记录的下一条;

5、find 和 find first / find last 不同的是,find后面带的条件,通常是满足TABLE的某个唯一索引。

4.4 判断

举例:

判断最简单了,就是一个if 条件 then ... else ...,比如:

DEFINE VAR str1 AS CHAR INITIAL "CPU".

IF str1="CPU" THEN DISP "cpu".

ELSE DISP "NOT cpu".

当然,这个”条件“可能有很复杂的组合。如果,涉及到的动作比较多,那么做法是用

do: ... end.,

DEFINE VAR str1 AS CHAR INITIAL "CPU".

IF str1="CPU"

THEN DO:

END.

ELSE DO:

END.

DISP str1.

str1="My memory".

DISP "NOT cpu".

str1="My CPU".

DISP "cpu".

if 支持嵌套,怎么嵌套?你自己会了!不是吗?

4.5 循环

PROGRESS的循环功能实在令人不敢恭维,没有when 没有while,没有loop、for。

只有do和repeat,但是do通常不会用来做循环,所以主要介绍repeat:

举例:

通常实现循环的模式:

repeat:

/*处理事务*/

if 条件 then leave. /* 退出循环 */

end.

现在,你试试用find 和 repeat 实现 for each的功能!

REPEAT:

END.

FIND NEXT pt_mstr.

DISP pt_mstr WITH 2 COLUMNS.

DEF VAR i AS INTEGER.

FOR EACH pt_mstr WHERE pt_price > 10 NO-LOCK.

END.

i = i + 1.

DISP pt_part pt_price WITH DOWN FRAME a.

IF i > 200 THEN

LEAVE.

4.6 赋值运算

举例:

+ - * / ,就是 加 减 乘 除了!

ttl_amoount = ttl_ammount + dtl_amount.

x_a = x_b / x_c.

str_ttl = "I'm" + "sure!".

dt01 = today - 1.

dt01 = 3/22/2005. /* 日期 */

当然,日期和字符串不能做乘法或者除法!

5 Progress进阶

5.1 First-of() 和 last-of()用法

【结构】

【数据】

举例:

for each demo break by :

end.

if first-of() then disp .

很明显可以看出来的就是,每个first-of或者last-of对应的字段,必须有for each ... break by来对应它,否则语法错误(即使first-of的字段是索引也会出错)

比如以下语句会出错:

for each demo no-lock:

end.

if first-of() then disp .

描述说明:

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

last-of()一样,不同的是“最后一次出现时发生”!

5.2 函数功能

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

last-of()一样,不同的是“最后一次出现时发生”!

举例:

for each demo break by :

if last-of() then disp demo.

end.

这段程序的结果如下:

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

5.3 应用

练习:

对每个mdlno收货进行合计,然后在mdlno的下一行显示合计数,类似这样的结果:

参考答案:

DEF VAR ttl AS DECI.

OUTPUT TO c:.

FOR EACH demo BREAK BY :

ttl = ttl + .

PUT SKIP .

IF LAST-OF() THEN do:

PUT " 合计" ttl SKIP.

ttl = 0.

END.

END.

OUTPUT CLOSE.

描述说明:

first-of 和 last-of 可以对应多个 break by的字段,比如可以先按mdlno汇总,再按

vendor汇总!


本文发布于:2024-09-23 14:21:27,感谢您对本站的认可!

本文链接:https://www.17tex.com/fanyi/4943.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:记录   变量   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议