目 录
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 条评论) |