bbs.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


精华帖子 RPG带参数CALL的问题


  首页 » 论坛 » AS400 »
[打印] [收藏] [本帖文本页] [推荐此主题给朋友]

有一个RPG程序A,需要传入参数运行的.其中有一个参数是数值型A1.另一个是字符型B1.
为什么在使用如下命令CALL A PARM(A1 'B') 时会发生 decimal-data error in field错误?



三种方法:
1.写个CL程序,大致如下
PGM
DCL   VAR(V1)   TYPE(*DEC) LENGTH(5 0)
CHGVAR VAR(V1) VALUE(12345)
CALL PGM(YOURRPG) PARM(V1 'B')
ENDPGM

2.把RPG参数定义成字符型的,然后在RPG里头在转换成数值型,那么在命令行CALL就没问题了
*ENTRY       PLIST
                   PARM              V1            5
                   PARM              V2            1
                   MOVE     V1     VV            5 0

3.在命令行直接输入,也可以,不过稍微有些复杂
输入格式与你定义的数值型变量长度有关,假如是偶数长度,比如说吧:
(1)有一个数值型6位长,你想输入的参数是20061229和B,那么传参应该是CALL PGM(YOURRPG) PARM(X'020061229F' 'B') ,F表示正的,前面需要补0;
(2)有一个数值型5位长,你想输入的参数是2006122和B,那么传参应该是CALL PGM(YOURRPG) PARM(X'20061229F' 'B') ,F表示正的,前面不需要补0
【注:一般格式是,偶数位长X'0nnnn……nnF',前面补0,;奇数位长X'nnn……nnF',前面不需要补0。后面一位表示符号,F表示整数,D表示负数】

[ 本帖最后由 USING_AS400 于 2006-12-28 20:59 编辑 ]
__________________________________
QQ: 252652963



不错,很管用.



再补充一下,传入的数值型还分P型和S型,如果是P型的,那么传入规则就如上第3点所述,
如果是S型,那么直接按字符型传入即可
如:
D V1                 S               8S 0
*ENTRY       PLIST
                   PARM              V1            
                   PARM              V2            1
CALL PGM(YOURRPG) PARM('00001229' 'B')
CALL PGM(YOURRPG) PARM('-0001229' 'B')
长度不够的左补0,如果传入负数,第一位放负号,所以负数的长度会少一位
__________________________________
QQ: 252652963



以下帖子也包含这方面的内容,可以作为补充。
http://bbs.chinaunix.net/viewthr ... amp;highlight=aeiou

  1. 命令行CALL程序时传递数字参数总结—aeiou

  2. 设程序 PgmA 有参数 Parm1, Parm2:

  3. 1)parm1(7S 0) = 276,parm2(7S 2) = 15.73

  4. 传递方式:CALL  PGMA PARM('0000276'  '0001573')

  5. 2)parm1(7S 0) = -276,parm2(6S 2) = -15.73

  6. 传递方式:CALL  PGMA PARM('-000276'  '-01573')

  7. 3)parm1(7P 0) = 276,  parm2(7P 2) = 15.73

  8. 传递方式:CALL  PGMA PARM( X'0000276F'  X'0001573F')

  9. 4)parm1(6P 0) =  276 , parm2(6P 2)=15.73

  10. 传递方式:CALL  PGMA PARM( X'F000276F'  X'F001573F')

  11. 5)parm1(7P 0) =  -276 , parm2(6P 2)=-15.73

  12. 传递方式:CALL  PGMA PARM( X'0000276B'  X'F001573B')

  13. 总结:

  14. 对于S类型的参数,只要按照字符串的形式,在没有数字的位置补0,不用输入小数点,就可以得到正确的结果,如果是负数,在第一位输入负号 - 即可,但是会占用一个数字位,7位的负数就只能输入6位数字了。

  15. 对于P类型的参数,数字部分按照S类型的一样输入,还需要在字符串前加 X,并且如果长度为奇数,需要给字符串加 F 后缀,如果长度为偶数,需要在字符串的前后都加 F。如果是负数的,需要把字符串后面的F变为B。(X表示按16进制取值,由于P类型的数据存储方式是半个字节存储一个数字,所以需要在前后加其它的字母补齐空位。)
复制代码
__________________________________
     ☆    ☆
 ☆   ☆ ☆ ☆
秉烛夜谈,天道酬勤。。。
       ☆    ☆
              ☆


  首页 » 论坛 » AS400 »
Copyright © 2001-2010 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

GMT+8, 2010-02-09 22:52, Processed in 0.023799 second(s), 8 queries, Gzip enabled.