如何在RPG代码中使用%Replace功能?

时间:2015-11-17 19:47:44

标签: ibm-midrange rpgle rpg

我想知道我是否可以获得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);

1 个答案:

答案 0 :(得分:2)

从错误消息中,听起来EMPNO是一个数字变量。 %REPLACE的第二个参数和%SUBST的第一个参数必须是字符串类型(A,C或G)。

如果EMPNO是数字,则只能在其中输入数字。