Ibm midrange 如何在RPG代码中使用%Replace函数?
我想知道我是否可以得到一些在rpg中使用%replace函数的例子。我在rpg IV书中的第四版编程只是简单地解释了这一点,这让我非常困惑。我试图用这个函数来掩盖我的家庭作业中社保号码的前5位数字。SSN已经在“EMPNO”下的物理文件中定义,在将该信息发送到输出文件之前,我将在rpg程序中修改它 到目前为止,我一直在努力Ibm midrange 如何在RPG代码中使用%Replace函数?,ibm-midrange,rpgle,rpg,Ibm Midrange,Rpgle,Rpg,我想知道我是否可以得到一些在rpg中使用%replace函数的例子。我在rpg IV书中的第四版编程只是简单地解释了这一点,这让我非常困惑。我试图用这个函数来掩盖我的家庭作业中社保号码的前5位数字。SSN已经在“EMPNO”下的物理文件中定义,在将该信息发送到输出文件之前,我将在rpg程序中修改它 到目前为止,我一直在努力 D SSN C '***-**- ' // The format for the %Replace
D SSN C '***-**- '
// The format for the %Replace function is " %REPLACE(newstring:oldstring{:start{:length}})
EMPNO = %REPLACE(SSN:EMPNO:1:5);
然后给出了一个错误
*RNF0382 30 61 003017 The second parameter EMPNO for %REPLACE is not valid.
*RNF7416 30 61 003017 The types of the right and left hand side do not match in the EVAL operation.
这是我的整个计划,可能会更好地解释我想要实现的目标,这个计划基本上只是为小时工生成一个工资登记簿
// This program generates a payroll register for Wexler University's hourly employees
// from the data file WUHRLYP
// ----------------------------------------------------- Files
FWUHRLYP IF E K DISK
FPROG054PUPO E PRINTER OFLIND(*IN99)
// ----------------------------------------------------- Standalone Variables
D Endofpage S N INZ(*On)
D TODAY S D INZ(*Sys)
D FULLNAME S 18
D TAXES S 6 2 INZ(*ZERO)
D REGPAY S 6 2 INZ(*ZERO)
D OVERTIMERATE S 6 1 INZ(*ZERO)
D OVERPAY S 6 2 INZ(*ZERO)
// ----------------------------------------------------- Constants
D LOWERCASE C 'abcdefghijklmnopqrstuvwxyz'
D UPPERCASE C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
D FEDTAXRATE C Const(.18)
D STATETAXRATE C Const(.05)
D FICARATE C Const(.0751)
// ----------------------------------------------------- Calculation Specs
/Free
Read WUHRLYP;
Dow Not %Eof(WUHRLYP);
IF ENDOFPAGE;
WRITE HEADINGS;
ENDOFPAGE = *OFF;
ENDIF;
// CONVERT LNAME TO TO PROPER CASE
LNAME = %XLATE(UPPERCASE:LOWERCASE:LNAME:2);
// CONCATENATE THE FIRST INITIAL & LNAME
FULLNAME = FNAME + '.' + ' ' + %TRIM(LNAME);
// MASK SOCIAL SECURITY NUMBER
EMPNO = %REPLACE(SSN:EMPNO:1:5);
// CALCULATE REGULAR AND OVERTIME PAY THEN GROSS PAY
EVAL(H) REGPAY = REGHRS * RATE;
EVAL(H) OVERTIMERATE = RATE + (RATE/2);
EVAL(H) OVERPAY = OTHRS * OVERTIMERATE;
// CALCULATE GROSS PAY, DEDUCTIONS, THEN NET PAY
EVAL(H) GROSS = REGPAY + OVERPAY;
EVAL(H) FEDERAL = GROSS * FEDTAXRATE;
EVAL(H) STATE = GROSS * STATETAXRATE;
EVAL(H) FICA = GROSS * FICARATE;
EVAL(H) TAXES = FEDERAL + STATE + FICA;
EVAL(H) NET = GROSS - TAXES;
// CALCULATE RUNNING TOTAL OF PAY AND TAXES
GROSSTOT += GROSS;
FEDTOT += FEDERAL;
STATETOT += STATE;
FICATOT += FICA;
NETTOT += NET;
// POPULATE FINITIAL VARIABLE
FINITIAL = FNAME;
// WRITE DETAIL
WRITE DETAIL;
// ZERO OUT VARIABLES
GROSS = *ZEROS;
FEDERAL = *ZEROS;
STATE = *ZEROS;
FICA = *ZEROS;
NET = *ZEROS;
REGPAY = *ZEROS;
OVERPAY = *ZEROS;
OVERTIMERATE = *ZEROS;
TAXES = *ZEROS;
// READ NEXT RECORD
READ WUHRLYP;
ENDDO;
// WRITE TOTALS
IF ENDOFPAGE;
WRITE HEADINGS;
ENDOFPAGE = *OFF;
ENDIF;
WRITE TOTALS;
// CLOSE DATA FILE AND CLEAR UP RESOURCES
*INLR = *ON;
RETURN;
/End-Free
我试着尽可能地格式化代码,RPG可能有点挑剔。感谢先进的家伙
答复
抱歉这么晚重播,伙计们一直很忙,但我终于明白了。事实证明,EMPNO是一个数值变量,我必须将变量“SSN”设置为字符,并将SSN=设置为EMPNO。感谢所有的帮助,这是新的代码,以防其他人在这个问题上存根
新变量
D SSN S 11A
%REPLACE的代码
//伪装社会保险号码
SSN = %CHAR(EMPNO);
SSN = %REPLACE('***-**-':SSN:1:5);
从错误消息中,听起来EMPNO是一个数字变量。%REPLACE的第二个参数和%SUBST的第一个参数必须是字符串类型(A、C或G)
如果EMPNO是数字,则只能在其中输入数字。我认为最好使用子字符串….%subst(empno:1:6)=“xxx xx”您将SSN声明为一个12个字符的常量。查看%subst部分,以这种方式对SSN进行编码似乎很简单。我仍然需要为新SSN声明一个新变量。顺便说一下,我把SSN常数拿了出来。获取“%SUBST的第一个参数EMPNO无效;内置函数被忽略。”错误修复错误消息ID RNF0382描述的错误后的结果是什么?该问题询问了一些示例,但似乎忽略了中的示例,或者至少没有说明它们有什么问题。也许从未见过?语言参考是在“书”中查找任何不清楚内容的第一个地方。我评论中的链接指向八个示例。他们到底出了什么问题还不清楚。在了解IBM标准示例的错误之前,我们无法给出好的示例。我们会浪费时间,只给出同样的没有帮助的坏例子。IBM的例子很难理解吗?