我想知道我是否可以获得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的代码
// MASK SOCIAL SECURITY NUMBER
SSN = %CHAR(EMPNO);
SSN = %REPLACE('***-**-':SSN:1:5);
答案 0 :(得分:2)
从错误消息中,听起来EMPNO是一个数字变量。 %REPLACE的第二个参数和%SUBST的第一个参数必须是字符串类型(A,C或G)。
如果EMPNO是数字,则只能在其中输入数字。