如何在 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为数字,则只能输入数字。