A到Z排序 比如下来到ABCD 为什么到4excel 不同位数 排序变成#value

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)欢迎您光临本小站。希望您在这里可以找到自己想要的信息。。。
> 匹配中文字符的正则表达式: [A-Za-z0-9 \\u4e00-\\u9fa5]
\uxxxx这种格式是Unicode写法,表示一个字符,其中xxxx表示一个16进制数字,范围所0~65535. Unicode十六进制数只能包含数字0~9、大写字母A~F或者小写字母A~F。需要注意到是:Unicode的大小端问题,一般都是小端在前,例如 \u5c0f 表示汉语中的 '小'字,转换成10进制就是9215,所以在byte数组中应该是1592.
这里是几个主要非英文语系字符范围(google上找到的):
2E80~33FFh:中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符,中日韩的符号、标点、带圈或带括符文数字、月份,以及日本的假名组合、单位、年号、月份、日期、时间等。
3400~4DFFh:中日韩认同表意文字扩充A区,总计收容6,582个中日韩汉字。
4E00~9FFFh:中日韩认同表意文字区,总计收容20,902个中日韩汉字。
A000~A4FFh:彝族文字区,收容中国南方彝族文字和字根。
AC00~D7FFh:韩文拼音组合字区,收容以韩文音符拼成的文字。
F900~FAFFh:中日韩兼容表意文字区,总计收容302个中日韩汉字。
FB00~FFFDh:文字表现形式区,收容组合拉丁文字、希伯来文、阿拉伯文、中日韩直式标点、小符号、半角符号、全角符号等。
比如需要匹配所有中日韩非符号字符,那么正则表达式应该是^[/u3400-/u9FFF]+$ 理论上没错, 可是我到msn.co.ko随便复制了个韩文下来, 发现根本不对, 诡异 再到msn.co.jp复制了个'お', 也不得行..
然后把范围扩大到^[/u2E80-/u9FFF]+$, 这样倒是都通过了, 这个应该就是匹配中日韩文字的正则表达式了, 包括我們臺灣省還在盲目使用的繁體中文
而关于中文的正则表达式, 应该是^[/u4E00-/u9FFF]+$, 和论坛里常被人提起的^[/u4E00-/u9FA5]+$很接近
需要注意的是论坛里说的^[/u4E00-/u9FA5]+$这是专门用于匹配简体中文的正则表达式, 实际上繁体字也在里面, 我用测试器测试了下'中華人民共和國', 也通过了, 当然, ^[/u4E00-/u9FFF]+$也是一样的结果
匹配双字节字符(包括汉字在内):[^x00-xff]&  评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)&  匹配空白行的正则表达式:ns*r&  评注:可以用来删除空白行&  匹配HTML标记的正则表达式:&(S*?)[^&]*&.*?|&.*? /&&  评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力&  匹配首尾空白字符的正则表达式:^s*|s*$&  评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式&  匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*&  评注:表单验证时很实用&  匹配网址URL的正则表达式:[a-zA-z]+://[^s]*&  评注:网上流传的版本功能很有限,上面这个基本可以满足需求&  匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$&  评注:表单验证时很实用&  匹配国内电话号码:d{3}-d{8}|d{4}-d{7}&  评注:匹配形式如
或 021-&  匹配腾讯QQ号:[1-9][0-9]{4,}&  评注:腾讯QQ号从10000开始&  匹配中国邮政编码:[1-9]d{5}(?!d)&  评注:中国邮政编码为6位数字&  匹配身份证:d{15}|d{18}&  评注:中国的身份证为15位或18位&  匹配ip地址:d+.d+.d+.d+&  评注:提取ip地址时有用&  匹配特定数字:&  ^[1-9]d*$    //匹配正整数&  ^-[1-9]d*$   //匹配负整数&  ^-?[1-9]d*$   //匹配整数&  ^[1-9]d*|0$  //匹配非负整数(正整数 + 0)&  ^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)&  ^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数&  ^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数&  ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数&  ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)&  ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)&  评注:处理大量数据时有用,具体应用时注意修正&  匹配特定字符串:&  ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串&  ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串&  ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串&  ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串&  ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串&  在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:&  只能输入数字:“^[0-9]*$”&  只能输入n位的数字:“^d{n}$”&  只能输入至少n位数字:“^d{n,}$”&  只能输入m-n位的数字:“^d{m,n}$”&  只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”&  只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”&  只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”&  只能输入非零的正整数:“^+?[1-9][0-9]*$”&  只能输入非零的负整数:“^-[1-9][0-9]*$”&  只能输入长度为3的字符:“^.{3}$”&  只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”&  只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”&  只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”&  只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”&  只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”&  验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,&  只能包含字符、数字和下划线。&  验证是否含有^%&',;=?$&等字符:“[^%&',;=?$x22]+”&  只能输入汉字:“^[u4e00-u9fa5],{0,}$”&  验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”&  验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”&  验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$”&  正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,&  “XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。&  验证身份证号(15位或18位数字):“^d{15}|d{}18$”&  验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12”&  验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”&  正确格式为:“01”“09”和“1”“31”。&  匹配中文字符的正则表达式: [u4e00-u9fa5]&  匹配双字节字符(包括汉字在内):[^x00-xff]&  匹配空行的正则表达式:n[s| ]*r&  匹配HTML标记的正则表达式:/&(.*)&.*|&(.*) /&/&  匹配首尾空格的正则表达式:(^s*)|(s*$)&  匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*&  匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?&  (1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)&  String.prototype.len=function(){return this.replace([^x00-xff]/g,&aa&).}&  (2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现&  String.prototype.trim = function()&  {&  return this.replace(/(^s*)|(s*$)/g, &&);&  }&  (3)应用:利用正则表达式分解和转换IP地址&  function IP2V(ip) //IP地址转换成对应数值&  {&  re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式&  if(re.test(ip))&  {&  return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1&  }&  else&  {&  throw new Error(&Not a valid IP address!&)&  }&  }&  (4)应用:从URL地址中提取文件名的javascript程序&  s=&http://www.9499.net/page1.htm&;&  s=s.replace(/(.*/){0,}([^.]+).*/ig,&$2&) ;//Page1.htm&  (5)应用:利用正则表达式限制网页表单里的文本框输入内容& 
 用正则表达式限制只能输入中文:onkeyup=&value=value.replace(/[^u4E00-u9FA5]/g,')
&onbeforepaste=&clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,'))&& 
 用正则表达式限制只能输入全角字符: onkeyup=&value=value.replace(/[^uFF00-uFFFF]/g,')
&onbeforepaste=&clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,'))&& 
 用正则表达式限制只能输入数字:onkeyup=&value=value.replace(/[^d]/g,') &onbeforepaste=
&clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,'))&& 
 用正则表达式限制只能输入数字和英文:onkeyup=&value=value.replace(/[W]/g,')
&onbeforepaste=&clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,'
转载请注明: &
or分享 (0)
选择分类目录
我的商城&&(3)
投资理财&&(13)
文学天地&&(4)
新闻快报&&(33)
&&&IT新闻&&(29)
生活杂谈&&(35)
编程乐园&&(595)
&&&web开发&&(120)
&&&&&&html&&(7)
&&&&&&Java Web&&(66)
&&&&&&javascript&&(12)
&&&&&&知识点&&(20)
&&&开发语言&&(130)
&&&&&&c++&&(4)
&&&&&&java&&(113)
&&&&&&概念分析&&(13)
&&&操作系统&&(81)
&&&&&&Linux&&(74)
&&&&&&windows&&(5)
&&&数据库&&(31)
&&&&&&mysql&&(15)
&&&&&&nosql&&(6)
&&&&&&oracle&&(4)
&&&码农人生&&(35)
&&&编程内功&&(197)
&&&&&&大数据云计算&&(9)
&&&&&&数据结构算法&&(4)
&&&&&&架构&设计模式&&(181)
&&&&&&软件工程&&(2)AS400程序员RPGIV培训手册( 中级)_甜梦文库
AS400程序员RPGIV培训手册( 中级)
AS/400 程序员培训手册(中级)作者: 万一飞(Chinaunix 网友:胖有型) 目1? 2?录3?简单说明................................................................................................................................... 5? 程序代码行的编写 ................................................................................................................... 5? 2.1? 最简单的 RPGLE 程序 ............................................................................................ 5? 2.2? 举例准备 ................................................................................................................... 5? 2.3? 简单的程序流程 ....................................................................................................... 6? 2.4? 常见的程序流程 ....................................................................................................... 7? 2.5? F 行说明 ................................................................................................................... 8? 2.5.1? 内容说明 ........................................................................................................... 8? 2.5.2? 常用例子 ......................................................................................................... 11? 2.5.3? 补充说明 ......................................................................................................... 12? 2.6? D 行说明 ................................................................................................................. 12? 2.6.1? 内容说明 ......................................................................................................... 12? 2.6.2? 常用例子 ......................................................................................................... 15? 2.6.3? 补充说明 ......................................................................................................... 16? 2.7? 入口参数 ................................................................................................................. 16? 2.8? C 行说明 ................................................................................................................. 18? 2.8.1? 写在前面 ......................................................................................................... 18? 2.8.2? 内容说明 ......................................................................................................... 19? 2.8.3? ILE 操作码分类:.......................................................................................... 20? 2.8.4? ILE 操作码 ..................................................................................................... 21? 2.8.4.1? A--C ......................................................................................................... 21? 2.8.4.2? D--E .......................................................................................................... 29? 2.8.4.3? F--N .......................................................................................................... 34? 2.8.4.4? O--R ......................................................................................................... 41? 2.8.4.5? S--Z .......................................................................................................... 45? 和程序相关的数据库知识 ..................................................................................................... 51? 3.1? LF(逻辑文件) .................................................................................................... 51? 3.1.1? 逻辑文件概念 ................................................................................................. 51? 3.1.2? 逻辑文件对效率的影响 ................................................................................. 53? 3.2? MEMBER ............................................................................................................... 53? 3.3? 游标......................................................................................................................... 54? 3.3.1? 游标的概念 ..................................................................................................... 54? 3.3.2? 不同操作码对应的游标的处理 ..................................................................... 54? 3.3.3? “有且仅有”的游标 ..................................................................................... 55? 3.3.4? LOVAL、HIVAL 对应的游标操作 ............................................................... 55? 3.4? 事务处理 -- COMMIT ........................................................................................... 56? 3.4.1? 概念描述 ......................................................................................................... 56? 3.4.2? 使用方法 ......................................................................................................... 56? 4?5?6? 7?3.4.3? 注意事项 ......................................................................................................... 57? 3.5? 关于锁表的问题 LCKW ....................................................................................... 58? DEBUG 调试以及常见出错信息 .......................................................................................... 58? 4.1? 写在前面 ................................................................................................................. 58? 4.2? 常规用法 ................................................................................................................. 59? 4.2.1? 程序编译 ......................................................................................................... 59? 4.2.2? 执行 DEBUG 命令 ......................................................................................... 59? 4.2.3? 运行程序 ......................................................................................................... 59? 4.2.4? 在 DEBUG 模式中进行调试 ......................................................................... 60? 4.2.5? 跟踪被当前程序调用的程序 ......................................................................... 60? 4.2.6? 一定要退出 DEBUG 模式 ............................................................................. 61? 4.2.7? 补充 ................................................................................................................. 61? 4.3? 跟踪批处理程序( From qingzhou) ......................................................................... 62? 4.4? 常见的出错信息 ..................................................................................................... 62? 4.4.1? 编译程序时的出错信息 ................................................................................. 62? 4.4.2? 运行时的出错信息 ......................................................................................... 64? CL、CMD .............................................................................................................................. 64? 5.1? CL 程序................................................................................................................... 64? 5.1.1? 基本认识 ......................................................................................................... 64? 5.1.2? CL 程序的常用语法及命令: ....................................................................... 65? 5.1.3? 不常用的语法 ................................................................................................. 67? 5.2? CMD ....................................................................................................................... 68? 屏幕文件及使用..................................................................................................................... 69? 实用技巧................................................................................................................................. 74? 7.1? 数组......................................................................................................................... 74? 7.1.1? 简述 ................................................................................................................. 74? 7.1.2? 定义 ................................................................................................................. 74? 7.1.3? 初始化 ............................................................................................................. 75? 7.1.4? 使用方法 ......................................................................................................... 75? 7.1.5? 补充 ................................................................................................................. 76? 7.2? 结构体..................................................................................................................... 76? 7.2.1? 简述 ................................................................................................................. 76? 7.2.2? 结构体的定义 ................................................................................................. 77? 7.2.3? 初始化 ............................................................................................................. 77? 7.2.4? 使用方法 ......................................................................................................... 78? 7.2.5? 结构体中的数组 ............................................................................................. 79? 7.2.6? 定义时,独立变量与结构体变量的区别 ..................................................... 79? 7.2.7? 不带 OCCURS 关键字的结构体定义 ........................................................... 80? 7.3? 按内部序号来读文件 ............................................................................................. 80? 7.3.1? 简述 ................................................................................................................. 80? 7.3.2? 定义 ................................................................................................................. 81? 7.3.3? 使用方法 ......................................................................................................... 81? 7.4? 常驻内存命令 SETOBJACC ................................................................................. 83? 7.4.1? 简述 ................................................................................................................. 83? 8?7.4.2? 命令说明 ......................................................................................................... 83? 7.4.3? 使用说明 ......................................................................................................... 84? 7.4.4? 补充说明 ......................................................................................................... 84? 7.5? 数据队列的使用 ..................................................................................................... 84? 7.5.1? 数据队列的说明 ............................................................................................. 84? 7.5.2? CRTDTAQ 建立数据队列............................................................................. 85? 7.5.3? DLTDTAQ 删除数据队列 ............................................................................. 85? 7.5.4? 系统 API ......................................................................................................... 86? 7.5.4.1? QSNDDTAQ 发送数据队列 ................................................................ 86? 7.5.4.2? QRCVDTAQ 接收数据队列 ................................................................ 86? 7.5.4.3? QCLRDTAQ 清除数据队列 ................................................................ 87? 7.5.4.4? QMHQRDQD 检索数据队列 ................................................................ 87? 7.6? 使用系统 API 的入手方法 .................................................................................... 87? 7.6.1? 调用说明 ......................................................................................................... 87? 7.6.2? 关于 USR SPACE ........................................................................................... 88? 7.6.3? 一些可能常用的 API ..................................................................................... 88? 其它......................................................................................................................................... 89? 8.1? 报表打印 ................................................................................................................. 89? 8.2? SQLRPGLE ............................................................................................................ 93? 8.3? SAVF,备份与恢复 ............................................................................................... 95? 8.4? 菜单--MENU .......................................................................................................... 96? 8.5? 实用命令 ................................................................................................................. 96? 8.6? 关于代码风格的几点想法 ..................................................................................... 99? 1 简单说明RPG 的全称:Report Program Generator 内部交流、亦可作培训使用。对用户作如下假定: 1、 能 COPY、修改、编译源代码(RPGLE、CLP) ,并能运行编译后的程序 2、 能 COPY、修改、编译文件(PF、LF、PRTF、DSPF) ; 3、 对数据文件(PF)有简单的认识(FIELD RECORD PF) ,并知道 LF 与 PF 的 对应关系。2 程序代码行的编写2.1 最简单的 RPGLE 程序为便于理解,这里写一个最简单的 RPGLE 程序 CL0N01Factor1+++++++Opcode&ExtFactor2+++++++Result++++++++Len++D+HiLoEq *************** Beginning of data ************************************* 0001.00 C 'HELLO WORLD' DSPLY 0002.00 C RETURN ****************** End of data **************************************** 这个程序编译成功,并调用(CALL 程序名) ,就是在屏幕上反白显示“HELLO WORLD”字样。 (其中,绿色字样,是系统自动显示的,下同) 与自由风格的 C 语言不同,RPGLE 中的编码,是有一定的格式,如果写错,将会在当 前代码行上高亮反绿显示。初学者如果不太清楚从何处开始下手,可以使用“F4”键查看 (F4 键只有用 2 进入的编辑状态才有效,用 5 进入的查看状态是无效的) Level N01 Factor 1 Operation Factor 2 Result 'HELLO WORLD' DSPLY Decimal Length Positions HI LO EQ Comment 关于每一项所对应的内容代表什么意思,该如何填写,即如何写程序,将会在下面的具 体讲解。2.2 举例准备列出表名,字段,以方便下面的举例。 假设有 PF 文件叫 PFFHS,文件的记录格式叫 FMTFHS 每条记录,都是由 FHS01、FHS02、FHS03 三个字段组成,每个字段都是两位长的字符 型变量。 逻辑文件 PFFHSL1 的键值为 FHS01 逻辑文件 PFFHSL2 的键值为 FHS02 逻辑文件 PFFHSL3 的键值为 FHS01、FHS02 注: 文件的记录格式, 可以理解为给这个文件整条记录起的一个名字; 或者是说将每条记录 视都视做一个类型相同大变量,然后给这个大变量起的名字。所以文件的记录格式信息中, 包含有一条记录由多少个字段组成,总计长度是多少这样的信息。 文件的记录格式,与各个字段同时定义。 (写文件的源码时) 文件的记录格式在 RPGLE 的程序中,不能与文件名相同。2.3 简单的程序流程为方便起见,系统自动显示的就不再贴出来了,只贴代码段。 FPFFHS UF E DISK C READ FMTFHS C EVAL FHS01=”01” C UPDATE FMTFHS C SETON LR C RETURN 这个程序的意思,是说读 PFFHS 这个文件,然后将读到的第一条记录中的 FHS01 这个 字段的值修改为“01” 。 “SETON LR” ,LR 的位置可在 HI、LO、EQ 中任选一处。意思是指将打开指 示器*INLR,即赋值使指示器*INLR 的值等于 1。等价于 “ EVAL *INLR=’1’ ” , 意思是强制将内存中的数据写到磁盘中。 (基于效率因素,系统在修改文件时,会先将修改 的结果先放在内存中,在同一程序中,读取数据也是先从内存中查询。 )LR,取自是 Last Record RETURN,表示程序结束,在后面“操作码”一节中,会有讲述。 如果不太明白,就记住 C SETON LR C RETURN 或 C EVAL *INLR=’1’ C RETURN 这两句话加在一起,表示程序结束就可以了。 从这个程序中,我们可以看到,RPGLE 的程序,大致上可以分为两个部分: 1、 声明、定义部分:声明程序中使用到的文件(F 行) ,定义程序中使用的变量(D 行) 2、 程序运行部分 :即 C 行,也就是程序段。 在 RPGLE 程序中,F 行必须在 D 行前面,D 行必须在 C 行前面。 程序执行的起始顺序,将从定义部分之后,第一个 C 行开始,顺序向下执行。 程序中的 F 行、D 行都不是必须项,一个程序可以没有 F 行(如仅完成计算功能的公 共函数,比如计算利息) ,也可以没有 D 行(没有需要特别定义的变量,或者所有变量都在 C 行进行定义) ,但不应该没有 C 行,因为 F 行与 D 行都属于非执行行,是起定义作用;C 行是执行行。没有 C 行的程序,是无执行意义的。2.4 常见的程序流程FPFFHS UF D LSFLD01 C C C C C C C SUB#UPD C C C C E S EVAL EXSR EVAL EXSR SETON RETURN BEGSR READ EVAL UPDATE ENDSR DISK 2 LSFLD01=’01’ SUB#UPD LSFLD02=’02’ SUB#UPD //声明文件 PFFHS //定义临时变量 LSFLD01 //给变量 LSFLD01 赋值 //执行子过程 SUB#UPD //给变量 LSFLD02 赋值 //执行子过程 SUB#UPD LR //数据写入磁盘 //程序结束 //子过程 SUB#UPD 开始 //读 PFFHS 文件 //给字段 FLD01 赋值 //修改文件 //子过程结束FMTFHS FLD01=LSFLD01 FMTFHS“//”后面的,只是简单的解释,如果自已动手写,不需要输入这些内容。 系统在运行这个程序时,是按如下的顺序来执行: 1. 首句 EVAL 赋值语句,直接执行; 2. 当系统发现操作码“EXSR”时,根据后面的变量名“SUB#UPD” ,去查找对应的 “SUB#UPD BEGSR”语句; 3. 然后从“SUB#UPD BEGSR”之后,顺序向下执行,直至“ENDSR”语句 4. 执行到“ENDSR”之后,将会再回到当初的“EXSR SUB#UPD”处,继续向下 执行,直到 RETURN 语句为止 这里提出一点要注意,如果子过程中,又执行了自身,即在 SUB#UPD 程序中,又出现 了“EXSR SUB#UPD” 是可以编译通过的, , 但在执行过程中, 系统会因为无法定位, 而出现死循环, 直至报错异常中断退出。 也就是 RPGLE 的程序中, 子过程不允许出现递归。 2.5 F 行说明 2.5.1 内容说明首位填上 F,然后按 F4,会出现如下内容: File Type Record Length File Designation Limits Processing End of File Length of Key Field File Addition Record Address TypeFilename File Format File Organization CommentSequenceDeviceKeywords各项的含义分别是: Filename: 需要声明的文件名,必须顶格,文件名必须唯一,也就是程序中对同样的文件名不能声 明两次。 File Type: 声明文件的处理类型。必须填写。允许的选项有: I: 输入型,即只读文件,对声明的文件只取其记录的值,不对记录进行修改 U: 修改型,即对声明的文件进行修改操作(删除记录属于修改操作的一种) O: 输出型,即只写,对声明的文件只进行写操作。 C:混合型,用于对屏幕文件的定义。 (混合型,即输入/输出型,以屏幕文件为例,也 就是读取屏幕文件的一些输入字段信息, 同时也可以输出一些字段的值到屏幕文件中, 但不 能对屏幕文件自身进行修改,所以与上面的 U 是有区别的) File Designation: 文件的指定方式,允许的选项有: 不填:表示这是一个输出文件,即“File Type”项为“O”时,此项不填 P:表明声明的文件是主文件,这个很少用,cycle 相关 S:表明声明的文件是次文件,这个没用过,cycle 相关 R:Record address file,记录地址文件?没用过 T:数组或表文件?不懂,没用过 F:常用,具体含义不知道该如何翻译(Full procedural file) 简单来说,不考虑 cycle(循环控制),这样理解就够了: 当“File Type”为 I,U,C 时,这里填“F” 当“File Type ”为 O 时,这里不填写 End of File: 程序结束前,对记录的处理方式。可以不填,或填“E” 。但从英文解释上来看,不敢 妄下定论,似乎不填,表示在程序结束前,要处理所有文件的所有记录(含 LF?) ;填 E, 表示只处理这个文件的所有记录? 总之,此项一般是不填。 File Addtion: 是否会增加文件中的记录,即是否会对文件进行写操作。 可以不填,或填“A” 当 File Type 为“O”时,系统自动默认此项为“A” ,不必填写; 当 File Type 为“I” ,或“U”时,这项内容可以填“A” ,也可以不填。不填,即表示不 会增加文件中的记录,也就是没有写操作;填“A”时,即表示会增加文件中的记录,也就 是会对文件进行写操作。 Sequence: 针对 cycle 使用的,表示排序顺序。(Cycle 我没有用过,估计可能是使用控制起来,程 序代码不那么直观,不利于上手和维护,所以现在已经不流行使用了。) 当定义为非 cycle 文件时,即“File Designation”项非“P”“S”时,此项必须为空; 、 当定义为 cycle 文件时,即“File Designation”项为“P” 、或“S”时,此项可填空、A、 D。A 表示升序,D 表示降序。 因为 CYCLE 现在已不常用,所以通常不填。 File Format 文件格式,不能为空,允许的值有: E: 声明的文件,是外部描述的文件(即文件在程序运行之前就已存在?) F: 声明的文件,是一个程序描述文件?(不知道什么意思,没用过) 这里通常填“E” ,即为外部描述文件 Record Length “File Format”为“F”时,才需要填写。没用过 通常不填 Limit Processing 不懂。 通常不填。 Length of Key Field 查询时,索引键值的长度 如果“File Format”项等于“E” ,即外部描述文件时,此项不填 如果“File Format”项等于“F” ,便不需要按 KEY 值查询时,此项也不填 如果“File Format”项等于“F” ,需要按 KEY 值查询时,此项填写 KEY 值的长度 (1―2000) 。 因为一般都使用外部描述文件,所以这里一般都不填写。 Record Address Type 记录寻址类型,好象是对文件键值的描述。允许的值如下: 空: 不使用 KEY 值, 在程序段中, 不会对文件的查询定位操作, “SETLL” 如 、 “CHAIN” 操作码都不会用的时,该项填空。 K: 使用 KEY 值,即表示会对声明的文件进行查询定位操作,此时声明的文件必须有 键值,即必须为逻辑文件(LF 文件) ,或在生成文件时,已加入了 KEY 值。 (下面的选项应该是程序描述文件才会使用) A: KEY 值为字符型 D:KEY 值为日期型 F:KEY 值为数字型 G:KEY 值为非英文字符 P:KEY 值为压缩型数字 T:KEY 值为时间型 Z:KEY 值为 timestamp? 总之,如果要按照键值对声明的文件进行查询定位操作(即程序中使用了 CHAIN、 SETLL 操作码,则此项需要填写“K” ;如不需要进行查询操作,则不填。,此项填“K” ) 时,声明的文件必须含有 KEY 值。 File Organization 不知道,一般不填 Device 声明文件的存放位置,必须填写,允许的值有: DISK: 磁盘文件,即文件存储在磁盘上,最常见的; PRINTER: 打印文件,提供打印输出描述,以及对打印设备访问。打印报表用这个; WORKSTN: workstation,工作站,显示文件。屏幕文件(DSPF)的定义用这个值 (下面这两种我没用过的) SEQ: 磁带文件,文件存储在磁带上。 SPECIAL: 特殊文件, 我现在也不是很清楚具体使用方式。 blogliou 说, 据 这种类型, 是允许指定一种不能被 RPG 直接操作的输入/输出设备。比如可以通过 SPECIAL 文件,在 RPGLE 程序中实现象读写磁盘一样,对 DTAQ 进行程序间数据交换。 Keyword 可以不填,常用的值有(这里只列出几个常用的) : COMMIT 该文件记录的数据操作进行日志处理(关于日志处理,后面会章节会讲到) RENAME 对文件记录格式名进行重命名。比如说程序中需要同时声明 PFFHSL1,PFFHSL2 这两个逻辑文件。这两个逻辑文件的记录格式名都是一样(通常和 PF 一样,即都为 FMTFHS;不过也可以定义成不同。如果不同,当然就不需要使用 RENAME 键字了) 。 那么, 为了能让系统区分, 就必须对其中一个的记录格式名进行重命名。 RENAME 的语法:RENAME(旧记录格式名:新记录格名) ,如下: FPFFHSL1 IF E DISK FPFFHSL2 IF E DISK RENAME(FMTFHS:FMTFHS2 新记录格式可以自由定义,只要在该程序中无同名的即可。RENAME 并不会真正 的更改文件的记录格式名, 仅是在当前运行程序中进行重命名。 对同时运行的其它程序 无影响 USROPN 对于声明的文件,由用户自行打开。如果不填写此关键字,系统将会在程序最最开 始(执行第一句 C 行语句前) ,自动执行“OPEN 文件” 的操作,在程序结束后,自 动执行“CLOSE 文件”的操作。而填写此关键字之后,OPEN,CLOSE 的操作将由用 户在 C 行程序段中,自行处理。如果用户未执行 OPEN 操作,就执行 CHAIN、READ、 SETLL 等语句,在编译程序时就会报错。程序在结束之前,必须关闭所有已打开的文 件,所以用起来会比较繁琐。USROPN 常作用于对文件的解锁,在同一程序中打开同 一文件的不同 MEMBER 等,属于一个较高级的用法,可在实际操作中慢慢体会。 OPEN,CLOSE 的操作码,对应的是文件名,不是记录格式名。即 C OPEN PFFHSL1 C CLOSE PFFHSL1 而不是 C OPEN FMTFHS Comment 注释说明。源自 RPG,在 RPG 中是有作用的,可以对程序作简短的说明,但在 RPGLE 中,其实已经没有作用了,此项不用填。 (填了也没用)2.5.2常用例子对文件进行只读的声明: FPFFHS IF E DISK 对文件进行修改的声明: FPFFHS UF E DISK 对文件进行只写的声明: FPFFHS O E DISK 对文件进行修改,以及增加记录的操作: FPFFHS UF A E DISK 对文件进行查询,增加记录的操作,并对文件进行查询操作: FPFFHSL1 IF A E K DISK 声明两个记录格式相同的文件,并对其中之一进行重命名 FPFFHSL1 IF E K DISK FPFFHSL2 IF E K DISK RENAME(FMTFHS:FMTFHS2) 注:在声明时,两个文件不一定要上下紧接着;随便改哪一个文件对应的记录格式 都可以;新旧记录格式名用冒号隔开,新记录格式名可自行定义,无规则。 对文件的修改操作进行日志处理: FPFFHSL2 UF E K DISK COMMIT cycle 类文件的声明: FPFFHSL2 IP E K DISK 这样文件声明为 P 之后, 程序中不需要写循环读文件, 也不需要写 RETURN, 设指示器 INLR, 也就是 FPFFHSL2 IP E K DISK C READ 记录格式名 等价于 FPFFHSL2 IF E K DISK C DOW 1=1 C READ 记录格式名 EQ 指示器 C IF EQ 指示器=’1’ C LEAVE C ENDIF C CENDDO RETURN2.5.3补充说明声明的文件,可以同时使用多个 keyword 关键字,并可以不在同一行(但必须紧接在声 明的文件的下面) ,如下: FPFFHSL2 IF E DISK RENAME(FMTFHS:FMTFHS2) F COMMIT 即表示文件 PFFHSL2,同时使用了 RENAME、COMMIT 两个关键字。如果写得下,也可以写在同一行,以空格键分开,如下 FPFFHSL2 IF E DISK COMMIT RENAME(FMTFHS:FMTFHS2)2.6 D 行说明首行填“D” ,然后按 F4,会出现如下内容: Declaration Name E S/U Type Internal Data Type Comment Decimal Positions To / LengthFromKeywords2.6.1内容说明Name: 定义的变量的名字,该名字可以不顶格写。 (即允许有缩进) E: 标识定义的变量是否源自外部数据结构。可以不填,或填“E” 上面的解释可能有点饶口,其实这个地方的意思,就是说: 如果是程序内部自行定义一个临时变量,此处不填; 如果是引用的一个外部文件作为数据结构,那么这里就要填“E” ;同时“Declaration Type”处,就要填“DS” ,即定义为一个结构; “Keywords”处要使用 EXTNAME 关键字 所谓“引用一个外部文件作为数据结构” ,也就是说定义一个结构,整个结构中的变量, 参照外部文件来定义。 所谓结构,可以理解为一个“由多个变量组合而成的大变量” 。 举例而言: D MYDS E DS EXTNAME(PFFHS) 和 D MYDS DS D FHS01 1 2(1 在 From 项;2 在 To / length 项) D FHS02 3 4 D FHS03 5 6 是等价的,都是定义一个结构变量 MYDS(名字可以自行定义) ,这个结构变量是由三 个字符型变量 FHS01,FHS02,FHS03 拼成的。 第一种定义方法,就是引用外部文件“PFFHS”作为数据结构的定义,注意使用到了 “EXTNAME”关键字,而且“E”项的值为“E” 。 而第二种定义方法,就是直接定义一个结构“MYDS” 。注意没有使用外部文件时, “E” 项的值为空。 S/U: 不知道,一般都填空。 Declaration Type: 定义变量的类型,允许的值如下: 不填: 非以下内容:数据结构、常量、独立变量、数组、表。此项为空时,好象只能 用来表示当前定义的变量是属于结构的一个变量。在下面会举例 DS: 数据结构,即定义一个结构变量,这个之前已讲过 C: 常量 常量只能使用字符,不需要定义常量的长度、类型。常量的内容写在 “Keywords” 处, 并使用 CONST 关键字, 在程序段中, 不能对常量进行赋值操作。 D MYNUM C CONST('abcdefghijklmn') 就是定义一个叫做 MYNUM 的常量,这个常量包含字母 a--n。 PI: 不知道,没有用过 PR: 不知道,没用过 S: 定义以下内容:独立变量、数组、表 定义一个叫 MYFIELD1 的变量,变量为 1 位长的字符型 D MYFIELD1 S 1 //1 在“To/length”项 定义一个叫 MYARRAY 的数组,共含 3 条记录,每条记录为 1 位字符型 D MYARRAY S 1 DIM(3) //DIM 在“Keywords”项 表的定义没有用过 总之,这一项,最常用的,就是“DS”“S”与空。即结构体与独立变量,其它选项较 、 少用到。 From: 当“Declaration Type”项为“S”时,表示独立变量、数组,此项不填 当“Declaration Type”项为“DS”时,表示结构,此项仍然不填 当“Declaration Type”项为空时,表示当前定义的变量,属于上面定义的结构,此时, 此项可以填写,也可以不填写。 当填写时, “From”项表示变量在结构中的起始位置,右对齐; “To/length”表示变量在 结构中的结束位置,也是右对齐。 当不填写时, “To/length”表示直接定义为变量长度。 举例: D MYDS DS D DSFLD01 1 2 //1 在“From”项,2 在“To/length”项 D DSFLD02 3 4 与 D MYDS DS D DSFLD01 2 //2 在“To/length”项 D DSFLD02 2 其实是等价的,都是定义一个结构变量 MYDS,这个结构变量中,包含了两个变量 DSFLD01,DSFLD02,这两个变量都是两位长字符。所不同的是,第一种定义方法,是指 定了变量在结构中的位置;而第二种方法,是直接指定变量的长度和类型 注意到上面的定义中,DSFLD01、DSFLD02 的 Declaration Type 为空,也就是表示这 两个字段是属于上面定义的结构 MYDS。如果此项为“S” ,即表示这个变量与结构无关 D MYDS DS D DSFLD01 2 //2 在“To/length”项 D DSFLD02 S 2 在这个定义中,变量 DSFLD02 就是一个独立的变量,与结构 MYDS 无关。 Length: 上面已讲述在定义结构时的使用方法。 在定义非结构时,此项的内容即为定义变量的长度。右对齐 Internal Data Type: 定义变量的类型,允许的值有: 空:变量定义为字符型、压缩型数字 A: 变量定义为字符型 B: 二进制?不知道 D: 变量定义为日期型 F: 变量定义为浮点型? G: 变量定义为图型?(非英文?汉字?) I: 变量定义为带符号的整数 N: 变量定义为指示器变量?(没用过) P: 变量定义为压缩型数字 S: 变量定义为普通的数型 T: 变量定义为时间型 U: 变量定义为无符号的整数 Z: 变量定义为日期+时间型(格式:年-月-日-时.分.秒.微秒) *: 变量定义为指针型 其实我最常用, 就是不填, 因为一般的程序, 有字符和数字这两种类型变量, 就足够了。 Decimal Positions: 当变量定义为数字型时,用来标志小数的位数。 当“To/Length”项为 3, “Internal Data Type”项为空时 此项为空,表示定义的变量为 3 位长的字符型 D MYFLD01 S 3 //定义为 3 位字符型 此项不为空(右对齐) ,表示定义的变量为数字型 D MYFLD01 S 3 2 //定义数字型变量,1 位整数,2 位 小数(总长为 3 位) Keywords: 关键字,可以不填,常用的值如下: (同样,这里我也只列出几个常用的,这里先不做 详细说明,仅供参考,在后面的例子,看看就知道用法了) CONST: 定义常量的值 DIM: 定义数组 EXTNAME:引用外部文件作为数据结构变量 EXTFLD: 对引用了外部文件作为数据结构的某个变量,进行重命名 LIKE: 定义变量时,参照已存在的变量定义 OCCURS: 定义结构体变量时,指定的结构体变量的记录条数 INZ: 定义变量时,赋值初始值 DATFMT: 定义日期变量时,指定日期格式 *MDY (mm/dd/yy) *DMY (dd/mm/yy) *YMD (yy/mm/dd) *JUL (yy/ddd) *ISO (yyyy-mm-dd) *USA (mm/dd/yyyy) *EUR (dd.mm.yyyy) *JIS (yyyy-mm-dd) Comment 注释项,源自 RPG,不用填,因为填了也没用。2.6.2常用例子定义一个 10 位长的字符型变量: D MYFLD S 10 定义一个 10 位长,其中含 2 位小数的字符型变量,并使其初始值为 1 D MYFLD S 10 2 INZ(1) 定义一个每条记录为 5 位长字符型变量,共 10 条记录的数组 D MYFLD S 5 DIM(10) 定义一个 10 位长的字符型变量,再定义一个变量,参照前一变量定义 D MYFLD01 S 10 D MYFLD02 S LIKE(MYFLD01) 定义一个结构,由一个 3 位长的字符变量,和一个 10 位长,其中 2 位小数的数字变量组成 D MYDS DS D MYDS01 3 D MYDS02 10 2 定义一个结构变量,结构内容参照外部文件 PFFHS D MYDS E DS EXTNAME(PFFHS) 定义一个结构变量,结构内容参照外部文件 PFFHS,并且将第二个字段重命名为 FHS999 D MYDS E DS EXTNAME(PFFHS) D FHS999 E DS EXTFLD(FHS02) 定义一个日期型变量,格式为 yyyy-mm-dd D MYDATE S D DATFMT(*ISO) 2.6.3补充说明变量的定义,除了在 D 行定义之外,还可以在 C 行通过赋值语句直接定义 如 D FLD01 S 2 INZ(‘01’) 与 C MOVE ‘01’ FLD01 2 //2 在 length 处,右对齐 是等价的 定义结构之后, 可以将结构变量视为一个普通的变量进行赋值来改变结构变量的值, 也 可以通过对组成结构变量的变量进行赋值,来达到修改结构变量的值的目的。 如: D MYDS DS D MYFLD01 2 D MYFLD02 2 在 C 行中,这两句是等价的 C EVAL %SUBST(MYDS:3:2)=’01’ C EVAL MYFLD02=’01’ 第一句是直接改结构变量 MYDS 的后两位的值(当然,此时 MYFLD02 的值也变化了) 第二句是对 MYFLD02 进行赋值,同样,赋完值之后,MYDS 的后两位也变为’01’ 在需要频繁进行数字与字符之间转换时,偷懒的人会通过定义这样的结构来达到目的: D MYDS DS D MYFLD01 1 8 D MYFLD02 1 80 比如说, MYFLD01 赋值为’’之后, 给 MYFLD02 也就自动等于 ; 然后给 MYFLD02 加 1 之后,MYFLD02 等于 ,MYFLD01 的值也自动等 于’’。可以认为结构变量 MYDS 是字符型(即一直等于 MYFLD01 的值) 这种方法,当需要字符型变量时,就使用 MYFLD01;当需要数字变量时,就使用 MYFLD02,不过我总觉得有点类似于作弊,一般没用。 关于数组、结构体的内容,因为要说起来内容还颇多,而也属于略为高级一些的用法, 所以将在后面专设章节讲述。2.7入口参数程序可以通过“*ENTRY”定义入口参数,或称之为接口参数,来传递数据。 假设有程序 FHS01ILE,其中入口参数的定义如下: C *ENTRY PLIST C PARM FLD01 3 C PARM FLD02 4 其中: *ENTRY 在“Factor 1”项; PLIST 在“Operation”项; PARM 在“Operation”项; FLD01、FLD02 都在“Result”项 上述定义,表示这个程序通过两个字段与其它外部程序沟通。那么别的程序(如 FHS02ILE)在调用程序 FHS01ILE 时,就要带上两个字符型变量,如 C CALL ‘FHS01ILE’ C PARM FHSFLD01 3 C PARM FHSFLD02 4 在两个程序里,这两个变量名可以不同(比如说一边叫 FHSFLD01,FHSFLD02; 一边叫 FLD01,FLD02) ,但长度,类型必须匹配。 如果在 FHS02ILE 中,FHSFLD01 等于’123’,FHSFLD02 等于’abcd’,那么系统在 运行 CALL 语句,执行程序 FHS01ILE 时,将会对字段 FLD01 初始化赋值,使其一开 始就等于’123’,字段 FLD02 等于’abcd’。 如果 FHS01ILE 程序中, FLD01、 对 FLD02 进行了改动, 比如 FLD01 最后等于’789’, FLD02 最后等于’efgh’,那么程序 FHS02ILE 在调用完 FHS01ILE 之后,FHSFLD01、 FHSFLD02 这两个字段也同样会改变,成为’789’,和’efgh’ 也就是入口参数的变化是可以传递的,其实应该很好理解吧。 入口参数的定义,可以写在程序的任何一处,而程序的执行,始终是从 C 行的顺 序第一行开始执行,与入口参数所在的位置无关。 FHS02ILE 也可以使用一个大变量来调用 FHS01ILE,只要总长相等即可(这种方 法仅限于被调用的程序 FHS01ILE 的入口参数全部为字符型才可使用,仅仅只是不会 错,不建议这样使用。 C CALL ‘FHS01ILE’ PARM FHSFLD01 7 其实从上面的例子可以看出, 入口参数可以使用结构的形式来表达, 所以下面这种 写法也不会有错。 (如果被调用程序有数字型变量,只要在定义结构时也定义为数字型 即可) D MYDS DS D DS01 3 D DS02 4 C CALl ‘FHS01ILE’ C PARM MYDS 不过要注意,如果 RPG 程序调用 C 程序,那么入口参数必须严格按照 C 程序中的 来, 比如 C 程序中带了两个字符型参数, 那么 RPG 程序中也必须是两个字段入口参数, 不能使用由两个字符变量组成的结构。原理可以自行想想。 既然可以使用结构做为入口参数, 当然, 也可以参照外部文件来定义结构做为入口 参数 D MYDS E C CALL DS ‘FHS01ILE’ EXTNAME(PFFHS) C PARM MYDS 与 C CALL ‘FHS01ILE’ C PARM FHS01 2 C PARM FHS02 2 C PARM FHS03 2 是等价的。 可以看到,参照外部文件定义结构做为入口参数时,可以有效的节省代码行,而且 不会出现遗漏。所以在实际使用中,常会看到,将一些公共程序的入口参数定义成一个 PF 文件。而调用它的程序,就参照这个 PF 文件,定义结构做为调用的接口参数。 当接口参数不一致时,如 FHS02ILE 中漏了第二个参数时: C CALL ‘FHS01ILE’ C PARM FHS01 3 此时, 并不是一开始运行 FHS01ILE 程序, 系统判断入口参数不符就报错; 实际上, 此时,FLD01 的值还是正确的,但 FLD02 的值就处于一个未初始化的状态。于是,当 代码执行到与 FLD02 有关的操作码时,才会报错;如果 FHS01ILE 在运行的过程中, 因为逻辑判断(如 IF 条件判断)的关系,而未执行任何与 FLD02 有关的操作码,那么 程序会正常运行完毕,不会有报错。 这时,FHS02ILE 调用了程序 FHS01ILE 之后,程序中原有的接口参数的数据就可 能因为这次调用程序而发生错位,从而导致数据的错误、混乱。数据的错误、混乱其实 还不是最大的问题,更大的问题在于“这时我们不知道数据已经出错了” 。解决之道, 也是如上所说,对于调用频繁,且入口参数较多的公共程序,考虑将其入口参数写成一 个 PF 文件。这样调整入口参数时,只要修改 PF 文件并重新编译,再编译相关程序即 可(至少发生遗漏时,程序会报错异常中断,不会出现错误的数据而不自知)2.8 C 行说明 2.8.1 写在前面终于说到程序的执行部分,也是我们写程序的平时接触的最多的一部分: “C”行 了。在这里,我想先说一下我个人的看法: 400 系统,提供了一些语法,可以大大减少程序代码行数。但是如果这个用法并不 普遍,那么并不建议使用(当然自己用来练习无妨) ,否则会给其它读代码的人带来困 难, 同时也会给自己带来麻烦 (比如出了问题, 别人看不懂, 自然会打电话来问原作者) 基于这样的道理,同样,我认为 FREE 格式的程序,虽然可以自由书写,有缩进等 优势, 但是除非整个项目组所有成员都已熟练掌握 FREE 格式的程序, 或已进行过完善、 系统的 FREE 格式的培训,才能正式使用。如果只是知道几个与 RPG,RPGLE 对应的 语法就用来进行实际处理, 可能会造成的维护的不便, 尤其是在出现一些不那么明显的 错误之后。 至于 cycle,不知道是不是基于这个原因,现在用得也比较少了。感觉 RPGLE 中, 至少有一半的内容是与 cycle 相关的。 2.8.2Level内容说明N01 Factor 1 Decimal PositionsOperationFactor 2ResultLengthHILOEQCommentLevel: 和 cycle 相关,没研究过,一般不填 N01: 这个含义比较丰富,我只用过其中一种: 首位不带 N,后面填写 01―99 的数字时,表示相应的指示器打开时,执行后面的操作, 如: C 12 EVAL FHS01=’01’ 等价于 IF *IN12=’1’ EVAL FHS01=’01’ ENDIF 首位带 N,后面填写 01―99 的数字,表示相应的指示器关闭时,执行后面的操作 要注意,该项内容仅作用于该行操作码。如果指示器打开后,需要执行多条语句,那么 每条语句前面,该项都要赋值。 即 C IF *IN12=’1’ C EVAL FHS01=’01’ C EVAL FHS02=’02’ C ENDIF 如果用这种方式来表达,就要写作 C 12 EVAL FHS01=’01’ C 12 EVAL FHS02=’02’ 所以说,根据指示器状态来执行的语句,在执行少量操作码时,可以使用这种方法;如 果语句较多,修改起来不方便,还是直接用 IF―ENDIF 的判断语句比较合适。 该项还有针对其它指示器的用法,看上去似乎又是与 CYCLE 相关,暂不介绍了。 Factor 1: 操作内容一,将在后面与操作码一起讲 Operation: 操作码,后面有专门章节讲解操作码 Factor 2: 操作内容二,同上 Result: 操作结果,同上 Length: 长度。 变量的定义,除了在 D 行定义之外,还可以在 C 行通过赋值语句直接定义 如 D FLD01 S 2 INZ(‘01’) 与 C MOVE ‘01’ FLD01 2 //2 在 length 处,右对齐 是等价的 一个变量,在整个程序中,只要定义一次就可以了,对定义的顺序没有强制要求。 Decimal Positions: 与 length 相呼应, 当此项有值时, 表示定义的是一个数字型变量, 该项表示小数位长度。 如 C Z-ADD 2 FLD02 3 2 即是说,将 FLD02 定义为一个 3 位长,其中 1 位整数,2 位小数的数字变量,并赋值 为 2.00 HI、LO、EQ 这是三个指示器位置项。可赋值的内容是从 01―99,在以后的说明中,如果 HI 项填写 10,LO 项填写 20,EQ 项填写 30,那么我所说的 HI 指示器,即是指*IN10,LO 指示器即 是*IN20,EQ 指示器即是*IN30,依此类推。 (也就是说,HI 指示器,并不是*INHI,事实 上,也没有*INHI 这个指示器) Comment: 注释行,源自 RPG,不用填,填了也没用。2.8.31.ILE 操作码分类:2. 3.4. 5.程序流程控制 DO、DOU、DOUxx、DOW、DOWxx、ITER、LEVAE IF、ELSE、ELSEIF、IFxx、ORxx、ANDxx SELECT、WHEN、WHENxx、OTHER、 ENDxx、 GOTO、TAG 、 EXSR、BEGSR、ENDSR CABxx 初始化操作 CLEAR、RESET 文件操作 OPEN、CLOSE、 CHAIN、SETGT、SETLL、 READ、READC、READE、READP、READPE、 DELETE、UPDATE、WRITE 、UNLOCK ROLBK、COMMIT、 EXFMT、 ACQ、EXCEPT、FEOD、FORCE、NEXT、POST、REL 程序调用 CALL、CALLB、CALLP、PARM、PLIST、RETURN 赋值语句 6. 7.8. 9. 10. 11. 12. 13. 14.MOVE、MOVEA、MOVEL、 EVAL 字符操作 CAT、CHECK、CHECKR、SCAN、SUBST、XLATE 数字操作 ADD、DIV(除) 、MULT(乘) 、MVR(除法取余) 、SQRT(开方) 、SUB、XFOOT、 Z-ADD、Z-SUB 数组操作符 LOOKUP、MOVEA、SORTA、XFOOT 数据区操作(没用过) IN、OUT、UNLOCK 日期操作 ADDDUR、EXTRCT、SUBDUR、TEST 指示器操作 SETOFF、SETON 信息操作(前两个没用过) DUMP、SHTDN、TIME、DSPLY 内存管理操作(完全没用过) ALLOC、DEALLOC、REALLOC 位操作(没用过) BITOFF、BITON、TESTB2.8.4ILE 操作码A--C2.8.4.1ACQ {(E)} (Acquire) 取地址位。其实 400 的程序中也有指针型变量,那么也就会有地址位,这个命令是取地 址位的。我试过,不过不知道取出了地址位能干嘛,所以没有实际运用过。 ADD {(H)} (Add) 加法操作 1. 基本语法: Factory 1 Operation Factory 2 Result FHS01 ADD FHS02 FHS03 // RPG 的语法 等价于 EVAL FHS03=FHS01+FHS02 //RPGLE 的语法 FHS01、FHS02、FHS03 必须都为数字型变量(P 型,或 S 型) ,或者就是数字 意思是将 Factory 1 项的数据,加上 Factory 2 项的数据,赋值到 Result 项上 2. 语法二: 如果这样写的话: Factory 1 Operation Factory 2 Result ADD FHS02 FHS03 就等价于: EVAL FHS03=FHS03+FHS02 即 Factory 1 项未填时,就表示将 Result 项的数据,加上 Factory 2 项的数据,然后 赋值到 Result 项上 3. 四舍五入: (H)表示四舍五入,如 FHS02=12.50(4,2) ,FHS03=3(2,0) ,那么 ADD(H) FHS02 FHS03 执行之后,FHS03=16(因为进位了) 而 ADD FHS02 FHS03 执行之后,FHS03=15 不过实际使用中,我们都尽可能使相加的字段小数位数相等,所以 ADD 操作码一 般都没有使用到四舍五入的功能。 4. 可以在 ADD 操作时,对 Result 项的变量进行定义 Factory 1 Operation Factory 2 Result FHS01 ADD FHS02 FHS03 10 2 EVAL 语句不能对在赋值的同时,对变量进行定义。 关于结果数据超长时的问题: 当加出的结果超长,比如 FHS03 定义为 3,2(1 位整数,2 位小数,下同)时, 再假设 FHS01=10,FHS02=4。那么 FHS01+FHS02 本来应该等于 14,但用 ADD 操作 之后,系统会自动将超长位截去,即 FHS03 最后等于 4; 而用 EVAL 语句时, 系统判断超长后, 会直接报错 “The target for a numeric operation is too small to hold the result” ,然后异常中断。 使用 ADD 操作码程序不会异常中断,但有可能发生了错误的数据我们也不知道; 使用 EVAL 操作码可以避免产生错误的数据,但程序会异常中断,需要进行人工干预。 可根据实际情况选择使用 ADD 还是 EVAL. ADDDUR {(E)} (Add Duration) 日期时间相加 1. 对日期型变量进行加操作,比如说已定义日期型变量 MYDATE1,MYDATE2,将 MYDATE1 的日期加上 3 天,赋值到 MYDATE2 中: Factory 1 Operation Factory 2 Result MYDATE1 ADDDUR 3:*D MYDATE2 其中,Factory 1,Result 项,都必须为日期型变量(即在 D 行,Internal Data Type 项为“D” ) 2. 与 ADD 操作码相同,Factory 1 项为空时,表示直接在 Result 项上进行日期相加, 如将 MYDATE1 直接加上 3 个月(即结果也是赋值到 MYDATE1 中): Factory 1 Operation Factory 2 Result ADDDUR 3:*M MYDATE1 3. 日期型变量的参数含义: *D 表示天,也可用*DAYS *M 表示月,也可用*MONTHS *Y 表示年,也可用*YEARS 4. 除了日期型之外,还有时间型,日期时间型,都可以使用 ADDDUR 操作码. 在 D 行,Internal Data Type 定义为“T” ,表示时间型(时、分、秒) Internal Data Type 定义为“Z” ,表示日期时间型(年、月、日、时、分、秒、微秒) 在使用 ADDDUR 操作码,时间型的参数如下: 5. *H 表示小时,也可用*HOURS *MN 表示分钟,也可用*MINUTES *S 表示秒, 也可用*SECONDS 而日期时间型,除了可以使用*Y、*M、*D、*H、*MN、*S(以及相应的全称) 之外,还可以对微秒进行处理,参数为*MS,或*MSECONDS 5. Factory 2 项中的数字,可以使用负数,使用负数时,表示减去相应的年、月、日, 不过通常我会使用 SUBDUR 这个操作码来进行日期的减法,语法与 ADDDUR 相 同 6. 既然说到这里,就顺便说一下对于日期型变量(时间型,日期时间型也类似)的处 理。 在实际运用时, 常需要将日期型变量与 8 位数字型变量转换。 这时要使用 MOVE 操作码。如 MOVE 日期型变量 数字型变量,反之也是。不能用 Z-ADD。 ALLOC {(E)} (Allocate Storage) 好象是给指针型变量分配空间的,没有用过 ANDxx (And) 条件判断语句―“与” 1. 在 RPG 的用法中,有 ANDEQ,ANDNE 之类的,与 IF 语句一起联用。 Factory 1 Operation Factory 2 Result FLD01 IFEQ ‘A’ FLD02 ANDEQ ‘B’ 。。处理内容 。 ENDIF 2. AND 后面跟的 xx,可以有如下用法: EQ Factory 1 = Factory2 NE Factory 1 && Factory2 GT Factory 1 & Factory2 LT Factory 1 & Factory2 GE Factory 1 &= Factory 2 LE Factory 1 &= Factory 2 3. 不过在实际上,因为 RPGLE 可以使用类似自由语言的风格,而且可以使用括号来 处理逻辑判断先后顺序(这个是我用 RPG 写起来比较麻烦的,尤其是 ANDxx 与 ORxx 的关系,很复杂的判断写起来就不那么顺畅) ,所以一般都不会这么写,而 是用如下的风格: Factory 1 Operation Factory 2 Result IF FLD&FLD2 AND FLD2&FLD3 AND (FLD3&=FLD4 OR FLD4&&FLD5) 。。处理内容 。 ENDIF 可以看出,逻辑判断的内容,可以用括号括起来以区分先后顺序; 判断的语句,允许有空格:FLD1 & FLD2,与 FLD1&FLD2 是相同的 但 AND 前后,必须要有空格 当逻辑判断条件太长,一行写不下要分行写时,AND 在上一行,还是下一行,都 没有关系。 Operation 项用 EVAL 操作码时,再按 F4,会看到 Factory2 项变成了一个很长的 Extended Factory2 项,而原来的 Result、Length、Decimal Positions、HI、LO、EQ 项都 没了。 我们的逻辑判断语句,就都写在这个 Extended Factory 2 项中 BEGSR (Beginning of Subroutine) 子过程的开始处 Factory 1 Operation Factory 2 Result BEGSR 子过程名 在前面,讲述程序流程时,已经对子过程进行了解释。这里,BEGSR 本身用法没什么 特别的,只是要注意有 BEGSR 语句,就一定要有 ENDSR 对应。否则程序编译会报错。所 以这里建议,如果是自已从头到尾写一个程序,最好写了 BEGSR 语句后,马上写一个 ENDSR,然后再来写中间的内容,避免遗漏。 在程序中,可以写一个子过程,但是不调用它。 (也允许就是子过程没有相应的 EXSR 语句) 也允许写一个空的子过程。 也就是 BEGSR 语句与 ENDSR 语句之间没有别的执行语句 ( 了) BITOFF (Set Bits Off) 没用过 BITON (Set Bits On) 没用过 CABxx (Compare and Branch) 没用过 CALL {(E)} (Call a Program) 调用外部程序 Factory 1 Operation Factory 2 Result CALL ‘外部程序名’ 1. 如果是直接调用外部程序, 那么程序名称需要用单引号括起来, 且该程序必须存在。 如 CALL ‘FHSILE01’ 就表示调用“FHSILE01”这个外部程序 2. 如果没有用单引号,如 CALL FHSILE01 就表示,FHSILE01 这时是个字符型变量(即并非调用“FHSILE01 这个程序) ,调 用的是变量内容所代表的程序。如: FHSILE01=’FHS01’时,表示调用“FHS01”这个外部程序; FHSILE01=’FHS02’时,表示调用“FHS02”这外外部程序 也就是说,CALL 操作码调用的程序名,可以是一个变量名。 3. 被调用的外部程序如果有接口参数,那么 CALL 操作码之后,也需要有“PARM” 操作码相对应。详细内容可参考之前的“入口参数”一节。 4. 这一点要注意:虽然 400 的程序段代码中,是不区分大小写;但调用的程序名,要 区分大写小。即’FHSILE01’,与 fhsile01,表示的是两个不同的程序。在使用时要 注意,尤其是程序名使用字符变量来表达时,可能会因为大小写的问题而导致 CALL 不到想 CALL 的程序,从而导致程序异常中断。 CALLB {(D | E)} (Call a Bound Procedure) 也没用过,不过有不少人用,望举例说明 CALLP {(M | R | E)} (Call a Program or Procedure) 也没用过,不过有不少人用,望举例说明 CASxx (Conditionally Invoke Subroutine) 带条件的调用子过程 1. 表示根据 xx 项对 Factory 1 与 Factory 2 进行判断,当符合条件时,执行 Result 处 的子过程。需要配合“END”或“ENDCS”语句来表示条件判断的结束。不需要 “SELECT”操作码。 2. 举例如下: Factory 1 Operation Factory 2 Result FLD01 CASEQ ‘1’ SUB01 FLD01 CASEQ ‘2’ SUB02 CAS SUB03 ENDCS 表示当 FLD01 等于’1’时,执行子过程 SUB01; 当 FLD01 等于’2’时,执行子过程 SUB02; 当不满足以上两个条件时,执行子过程 SUB03 最后的“ENDCS”必须要有,表示条件判断结束;但不需要 SELECT。 上面这段语句,与下面这一段是等价的: Factory 1 Operation Factory 2 Result SELECT WHEN FLD01=’1’ EXSR SUB01 WHEN FLD01=’2’ EXSR SUB02 OTHER EXSR SUB03 ENDSL 3. 可以看出来,CASxx 这种语句,是用于逻辑判断仅一个条件时的分支处理,这样 的写法在代码的阅读上会很直观。 而当逻辑判断大于一个条件时, 这个语句就不适 用了。 CAT {(P)} (Concatenate Two Character Strings) 字符连接 1. 基本语法: Factory 1 Operation Factory 2 Result FLD01 CAT FLD02:0 FLD03 这句话的意思,是将 FLD02 拼在 FLD01 后面,中间没有空格,然后将拼出的结果 赋值到 FLD03 中。 FLD02:0,表示 FLD02 与 FLD01 之间的空格数为 0,依此类推 FLD02:1,就表示 FLD01 后面加一个空格,再拼上 FLD02 FLD02:3,就表示 FLD01 后面加三个空格,再拼上 FLD02 Factory 1 项,与 Factory 2 项可以是字符型变量,也可以就是字符。当是字符时, 需要用单引号将字符括起来 2. 其实根据 RPG 的语法,大家应该也可以想得到,Factory1 项如果不填值,就表示 将 Factory 2 项的内容直接拼在 Result 项上,这里就不举例了。 3. 字段 FLD01 如果内容后面有空格,如“ABC ” ,那么在 CAT 操作时,系统会自 动将后面的空格截去,只取’ABC’。举例: FLD01=’ABC ‘ (8 位字符型) , FLD02=’1’ (1 位字符型) , FLD03=’’ (8 位字符型) 那么,执行了下述语句之后 FLD01 CAT FLD02:0 FLD03 FLD03 就等于’ABC1 ’ 而如果执行: FLD01 CAT FLD02:1 FLD03 FLD03 就等于’ABC 1 ‘ (C 与 1 之间有一个空格) 4. 表示空格个数时,可以使用数字型的变量来表达,如 EVAL N=1 FLD01 CAT FLD02:N FLD03 5. CAT 操作码, 其实也可以通过 EVAL 来实现部分。 比如将 FLD01 与 FLD02 拼起来, 中间无空格,赋值到 FLD03 中,也可以写做: EVAL FLD03=FLD01 + FLD02 6. EVAL 操作码的优势,在于可以在一行语句中,就把多个字符拼在一起,如: EVAL FLD05=FLD01+FLD02+FLD03+FLD04 如果要用 CAT 写,就要写多行,不简洁。 7. EVAL 操作码的不足之处,在于只能进行最简单的拼接,无法自动将字符后面的空 格去除,如: FLD01=’ABC ‘ (8 位字符型) , FLD02=’1’ (1 位字符型) , FLD03=’’ (8 位字符型) 在执行语句 EVAL FLD03=FLD01+FLD02 后, FLD03=’ABC ‘ 因为 FLD01 是 8 位,FLD03 也是 8 位,在操作时,不能去掉 ABC 后面的 5 位空 格,此时后面再拼 FLD02 已无意义,所以 FLD03 仍是’ABC ‘ CHAIN {(N | E)} (Random Retrieval from a File) 按键值对文件记录进行查询定位 1. 基本语法: 举例,对逻辑文件 PFFHSL1 进行定位操作。逻辑文件 PFFHSL1,是以 FHS01 为 键值,文件记录格式名叫 FMTFHS Factory 1 Operation Factory 2 Result HI LO EQ FHS01 CHAIN FMTFHS 17 18 这个例子中,FHS01 应该是一个与文件 PFFHSL1 中键值(FLD01)类型、长度都 相等的一个字符型变量,或者字符。 Factory 2 项中,要填文件的记录格式名,而不是文件名 HI 指示器表示是否查询到相应记录,查询不成功时,打开 HI 指示器 LO 指示器表示查询时,文件是否被锁。文件被锁时,打开 LO 指示器 也就是说: *IN17=’0’,表示查询到了目标记录。 *IN17=’1’, *IN18=’0’,表示无相应的目标记录 *IN17=’1’, *IN18=’1’, 表示查询时,文件被锁(不确定有没有相应的目标记录) 2. 用修改方式声明的文件,当查询成功后,目标记录被锁定,其它程序无法以修改的 方式定位到当前目标记录上。 (但可以用只读的方式定位) 3. LO 指示器,仅于用修改方式声明的文件。对于只读方式声明的文件其实无意义 4. 如果用修改方式声明文件,但在 LO 处未填写指示器,且有程序锁住目标记录时, 当前程序会根据 PF 中定义的 WAITRCD(Maximum record wait time)参数,等待相 应的秒数(如 WAITRCD 处为 10, 即表示锁表时, 等待 10 秒; 如果填的是*IMMED, 就表示不等待,一判断目标记录被锁就结束操作);如果在等待时间内,对方仍未 解锁,当前程序就会异常中断退出;如果 LO 处填写指示器,那么程序就不会中断 退出,且 LO 指示器打开。 5. 当 FHS01 键值,在文件 PFFHSL1 中,对应有多条记录时(即键值不唯一) ,程序 将会按照文件的内部记录号由小到大的顺序,定位到符合条件的第一条记录。 6. 当一个逻辑文件, KEY 值有多项时, 可以使用 KLIST 操作码先定义一个组合键值, 然后再用这个组合键值来进行 CHAIN 操作。需要注意,组合键值中,必须每一个 成员字段都与目标记录所对应的字段相等,才能查询成功。 (所以组合键值,通常 使用 SETLL 定位较多) 7. 当用修改方式声明文件,但希望进行不锁记录的查询操作时,可以将 CHAIN 操作 码写为 CHAIN(N) ,这个括号(N) ,就表示当前的查询定位,不对记录进行锁定 操作(也就是用只读的方式来处理目标记录,所以只能取出目标记录的信息,不能 做修改;如果要修改目标记录的话,还必须进行一个 CHAIN 操作) 8. 这一条要特别注意: 当没有填写 HI 指示器时,RPGLE 是允许编译通过的。而在某些情况之下(以前见 过) ,运行程序时,如果 CHIAN 操作成功,找到了符合条件的记录时,没有任何 问题;但如果 CHAIN 操作没有找到符合条件的记录时,实际上系统会按照键值的 排序以及内部记录号,定位到下一条记录上,这时再取出来的数据,就统统都是下 一条记录的数据。所以,除非有绝对的把握,CHAIN 操作肯定成功,否则就一定 要养成填写 HI 指示器的良好习惯。 (不好意思,这里好象又写错了,几经测试仍未测出这种情况,不过印象中的确出 现过这种找到错误记录的情况,可能具体情况/条件记混了) 。 CHECK {(E)} (Check Characters) 检查目标变量中的字符 1. 基本语法: Factory 1 Operation Factory 2 Result HI LO EQ FLD01 CHECK FLD02:2 N 42 语句 CHECK 的意思,是指字段 FLD02 中,从第二位字符开始,向右查找(含第二 位字符),是否包含有 FLD01 中没有的字符。 如果的确有在 FLD01 中没有的字符,将字符所在位置赋值到变量 N 中,同时打开 EQ 指示器; 如果从第二位字开始,向右读取的所有字符,都可以在变量 FLD01 中找到,那么 N 为 0,EQ 指示器处于关闭状态。 “FLD02:2”表示从变量 FLD02 的第二位开始,向右作比较。如果仅仅只是 “FLD02” ,那么就表示从变量 FLD02 的首位开始,向右查找 实例 假设 FLD01 为 8 位长字符,且当前值为’’ 而 FLD02 为 5 位长字符,且当前值为’A3456’ 那么执行上述 CHECK 操作后,N=0, *IN42=’0’(从第二位开始,3456 都存在于 变量 FLD01 中) 2. 假设 FLD01 为 8 位长字符,且当前值为’’ 而 FLD02 为 5 位长字符,且当前值为’34ABDC’ 那么执行 CHECK 操作后,N=3,*IN42=’1’ ( 即 第 三 位 “ A ” 不 存 在 于 变 量 , FLD01 中) CHECKR {(E)} (Check Reverse) 反向检查目标变量中的字符 1. 基本语法: Factory 1 Operation Factory 2 Result HI LO EQ FLD01 CHECKR FLD02:3 N 42 语句 CHECKR 的意思,是指字段 FLD02 中,从第三位字符开始,向左查找(含第 三位字符),是否包含有 FLD01 中没有的字符。 (基本与 CHECK 类似,所不同的,就 是 CHECK 是自左向右的查找;而 CHECKR 是自右向左查找) 如果有,将字符所在位置赋值到变量 N 中,同时打开 EQ 指示器; 如果从第二位字开始,向左读取的所有字符,都可以在变量 FLD01 中找到,那么 N 为 0,EQ 指示器处于关闭状态。 “FLD02:3”表示从变量 FLD02 的第三位开始,向左作比较。如果仅仅只是 “FLD02” ,那么就表示从变量 FLD02 的末位开始,向左查找 实例 假设 FLD01 为 8 位长字符,且当前值为’’ 而 FLD02 为 5 位长字符,且当前值为’23A56’ 那么执行上述 CHECK 操作后,N=0, *IN42=’0’(从第三位开始,向左,23 都存 在于变量 FLD01 中) 2. 假设 FLD01 为 8 位长字符,且当前值为’’ 而 FLD02 为 5 位长字符,且当前值为’BC3B45’ 那么执行 CHECK 操作后,N=2,*IN42=’1’ (即第二位 “C”不存在于变量 FLD01 , 中) 计算字符实际长段 根据 CHECKR 的这个操作码的用法,我们可以使用它来取出变量截去尾部空格后 的实际长度: Factory 1 Operation Factory 2 Result HI LO EQ ‘‘ CHECKR FLD02 N 42 Factory 1 项,是一个空格字符。 N 表示的意思是:从变量 FLD02 的尾部,向前数第一个非空格字符,在 FLD02 中 所处的位置。那么这个 N 当然就是变量 FLD02 的实际长度; 如果指示器未打开,那么说明整行都是空,实际长度为 0,也没错。 有趣吧。 CLEAR (Clear) 清除内容 1. 基本语法 Factory 1 Operation Factory 2 Result CLEAR 目标名 这个目标名,可以是程序中定义的结构、文件的记录格式名。 3. 所谓文件的记录格式名,包括了程序中声明的磁盘文件、打印报表文件、屏幕文件 CLEAR 操作的意思,就是将目标所对应的所有变量/字段都赋上空值。 2. 对结构体的清空 关于结构体,后面会另设章节专门讲述,这里只说明对结构体初始化清空 Factory 1 Operation Factory 2 Result CLEAR *ALL 目标名 CLOSE {(E)} (Close Files) 关闭文件 1. 基本语法 Factory 1 Operation Factory 2 Result CLOSE 目标文件名 2. CLOSE 所对应的,是文件名,不是文件的记录格式名,要注意 3. CLOSE 操作码,仅适用于声明文件时,keyword 使用“USROPN”关键字的文件 4. 每一个 CLOSE 的操作,在之前都必须有 OPEN 文件的操作。也就是,文件必须打 开了之后,才能关闭。不能关闭未打开的文件 5. 允许使用*ALL 变量,来表达关闭所有已打开的文件: CLOSE *ALL COMMIT {(E)} (Commit) 日志事务处理的确认操作 1. 基本语法 Factory 1 Operation Factory 2 Result COMMIT 2. 该操作码无其它参数,就是指对事务处理进行确认操作。 3. ILE 程序中,COMMIT 操作可随时进行,也允许在没有声明 COMMIT 类型的文件 的情况下,仍进行 COMMIT 操作(对该进程这前的事务进行确认处理)f 4. 关于日志的确认操作,在后面会另设专门章节讲述。 COMP (Compare) 比较 1. 基本语法: 将 Factory 1 与 Factory 2 进行比较。 当 Factory 1 & Factory 2 时,打开 HI 指示器; 当 Factory 1 = Factory 2 时,打开 LO 指示器; 当 Factory 1 & Factory 2 时,打开 EQ 指示器。 Factory 1 Operation Factory 2 Result HI LO EQ FLD01 COMP FLD02 56 57 58 当 FLD01=2,FLD02=1 时,*IN56=’1’, *IN57=’0’, *IN58=’0’ 当 FLD01=2,FLD02=2 时,*IN56=’0’, *IN57=’0’, *IN58=’1’ 当 FLD01=1,FLD02=2 时,*IN56=’0’, *IN57=’1’, *IN58=’0’ 字符也可以进行比较, 好象是按字母排序, 然后将内码相加, 再比较 (类似于 ASCII 码一样,不过不是特别清楚这个规律,所以一般没用) 坦白说,我觉得这个操作码有点无聊。2.8.4.2D--EDEALLOC {(E | N)} (De-allocate Storage) 没用过,好象是对定义的指针型变量,对其分配地址空间之后,用这个操作码可以回收 空间。 DEFINE (Field Definition) 根据已知的字段,来定义新字段,如下: Factory 1 Operation Factory 2 Result HI LO EQ *LIKE DEFINE FLD01 FLD02 这句话的意思,就是说“象定义字段 FLD01 一样,定义字段 FLD02 的类型、长度” 这个字段 FLD01,必须是个已定义的字段/变量。 DELETE {(E)} (Delete Record) 删除当前记录,语法如下: Factory 1 Operation Factory 2 Result HI LO EQ DELETE 文件记录格式名 这里,在做 DELETE 操作前,必须先定位到具体的记录上(使用 CHAIN、READ 等语 句) ;同时,文件在 F 行必须使用修改的方式来声明。 当文件定位到目标记录时,目标记录会被锁定,此时,目标记录无法被其它程序修改; 如果执行了 DELETE 操作,自然会解锁,不过别的程序也找不到目标记录了(因为被删除) 实际使用中, 通常并不会对文件中的记录进行物理删除, 而是修改某个标识状态的字段 的值,所以使用这条命令要慎重。 DIV {(H)} (Divide) 数学运算―除 DIV 操作码,表示数学运算的“除” ,常与操作码 MVR 一起来使用。 Factory 1 Operation Factory 2 Result HI LO EQ FLD01 DIV FLD02 N MVR M 上面两句话的意思,是说,用 FLD01 来除 FLD02,将商赋值到变量 N 中,将余数,赋 值到变量 M 中。(N,M 都是数字型变量) 再具体一点,如果 FLD01 = 10, FLD02 = 3,执行完这两句操作码之后 N=3 (10 / 3 的商) M=1 (10 / 3 的余数) DO (Do) 循环 我最常用的循环方法之一,适用于已知循环次数的循环,与 ENDDO 搭配使用,每一个 DO,必须要配合一个 ENDDO。基本语法如下 Factory 1 Operation Factory 2 Result HI LO EQ 1 DO 10 循环中处理的内容 ENDDO 上面的意思,就是说固定循环 10 次。 不过呢, 在实际使用中, 我们常常需要知道当前循环到了第几次处理, 这里, 可以: Factory 1 Operation Factory 2 Result HI LO EQ 1 DO 10 N 处理过程 ENDDO 这个 N,是一个整数型变量(小数位为 0 的 P 型吧) ,它所表示的就是循环的次数。 如第一次循环,N=1;第二次循环,N=2 所以, 1 DO 1,就表示只循环一次,而不是表示死循环。 DOU {(M | R)} (Do Until) 还是循环 也是循环,不过当满足 Extend Factory 2 项的条件之后,结束循环。如下: Factory 1 Operation Factory 2 Result HI LO EQ DOU FLD01&FLD02 处理过程 ENDDO 上面这句话, 就是说当 FLD01 小于或等于 FLD02 时, 进行循环; 当满足条件, FLD01 即 大于 FLD02 时,结束循环。 在 RPGLE 的写法中,这个条件可以写得很复杂。当然,很复杂的时候,要记得多用括 号,以免得逻辑判断与设计不一致。 DOUxx (Do Until) 又是循环 这应该是 RPG 的写法,上面的循环也可以写做: FLD01 DOUGT FLD02 ENDDO 不过,正如果前面所说的“ANDxx”操作码一样,RPGLE 的表示手法可以比 RPG 更直 观,更好维护,所以这里也是一样的原理,有了“DOU”之后,我们就可以不用“DOUxx” 了。 DOW {(M | R)} (Do While) 循环,又见循环 这个循环的意思,与 DOU 正好相反,它的意思是满足 Extend Fatcory 2 项的条件时, 才进行循环,不满足条件时,不循环 Factory 1 Operation Factory 2 Result HI LO EQ DOW FLD01&FLD02 处理过程 ENDDO 上面这句话,就是说当 FLD01 小于或等于 FLD02 时,不进行循环循环;当满足条件, 即 FLD01 大于 FLD02 时,才进行循环。 在 RPGLE 的写法中,这个条件可以写得很复杂。当然,很复杂的时候,要记得多用括 号,以免得逻辑判断与设计不一致。 注意:在实际使用过程中,我常常只使用 DO,DOW 这两种循环。而且使用 DOW 时, 常常使其条件永远成立(即死循环,比如说 1=1 就永远成立,那么 DOW 1=1 就是个 死循环) ,然后在循环体中用 IF 语句判断何时退出循环(使用 LEAVE 语句) ,我认为这样 会比较直观,而且很少会在逻辑上出错。还是那句话,我宁愿多写几行代码,而免去每次 读到这里的时候都要想想逻辑上有没有问题的麻烦。 DOWxx (Do While) 最后一个循环了 跟 DOU 与 DOUxx 的关系一样,有了 DOW 之后,就不需要 DOWxx 了,不多说了。 DSPLY {(E)} (Display Function) 屏幕显示 Factory 1 Operation Factory 2 Result HI LO EQ FLD01 DSPLY 就是在屏幕上,显示 FLD01 的内容。FLD01 可以是字符、数字型变量。也可以直接就 是字符、数字。 DUMP (Program Dump) 没用过 ELSE (Else) 逻辑判断语句 常见用法: Factory 1 Operation Factory 2 Result HI LO EQ IF 条件判断 处理内容一 ELSE 处理内容二 ENDIF 不满足条件判断的时候,就执行 ELSE 与 ENDIF 之间的处理内容二; 满足条件判断时,执行 IF 与 ELSE 之间的处理内容一。 IF 与它最临近的 ELSE、ENDIF 配对; 同理,ELSE 也是与它最临近的 IF、ENDIF 配对。 注意多层 IF 嵌套时的逻辑判断,这个要自己多尝试,不讲了。 ELSEIF {(M | R)} (Else/If) 逻辑判断语句 与 ELSE 类似,不过将条件判断语句也写在了同一行。 ELSEIF 不需要相应的 ENDIF 语句。即 IF 条件判断 1 处理内容一 ELSEIF 条件判断 2 处理内容二 ELSE 处理内容三 ENDIF 当程序满足条件判断 1,将执行 IF 与 ELSEIF 之间的处理内容一; 当程序不满足条件判断 1,满足条件判断 2,执行 ELSEIF 与 ELSE 之间的处理内容二; 当程序连条件判断 2 的内容都不满足时, 执行 ELSE 与 ENDIF 之间的内容处理内容三。 也就是说,这时的 ELSE,是和 ELSEIF 进行配对的,要注意。 ENDyy (End a Structured Group) ENDIF 对应 IF、IFxx ENDSR 对应 BEGSR ENDDO 对应 DO、DOW、DOU、DOUxx、DOWxx ENDSC 对应 CASxx ENDSL 对应 SELECT ENDFOR 对应 FOR ENDSR (End of Subroutine) 子过程结束语句 EVAL {(H | M | R)} (Evaluation) 赋值语句 1. 基本语法: Factory 1 Operation Factory 2 Result HI LO EQ EVAL FLD01=FLD02 赋值,使用 FLD01 的值,等于 FLD02 的值。FLD01 与 FLD02 的类型必须相}

我要回帖

更多关于 三位数排序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信