如何在 RPG 代码中使用 %Replace 函数?
How to use %Replace function in RPG code?
我想知道我是否可以得到一些在 rpg 中使用的 %replace 函数的例子。我在 rpg IV 书中的第 4 版编程只是简要解释了这一点,这让我很困惑。我正在尝试使用此功能来屏蔽我家庭作业的社会安全号码的前 5 位数字。 SSN 已在 "EMPNO" 下的物理文件中定义,我将在将该信息发送到输出文件之前在 rpg 程序中对其进行修改。
目前我在尝试什么,
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为数字,则只能输入数字。
我想知道我是否可以得到一些在 rpg 中使用的 %replace 函数的例子。我在 rpg IV 书中的第 4 版编程只是简要解释了这一点,这让我很困惑。我正在尝试使用此功能来屏蔽我家庭作业的社会安全号码的前 5 位数字。 SSN 已在 "EMPNO" 下的物理文件中定义,我将在将该信息发送到输出文件之前在 rpg 程序中对其进行修改。
目前我在尝试什么,
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为数字,则只能输入数字。