Ibm midrange 如何在RPG代码中使用%Replace函数?

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

我想知道我是否可以得到一些在rpg中使用%replace函数的例子。我在rpg IV书中的第四版编程只是简单地解释了这一点,这让我非常困惑。我试图用这个函数来掩盖我的家庭作业中社保号码的前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是数字,则只能在其中输入数字。

我认为最好使用子字符串….%subst(empno:1:6)=“xxx xx”您将SSN声明为一个12个字符的常量。查看%subst部分,以这种方式对SSN进行编码似乎很简单。我仍然需要为新SSN声明一个新变量。顺便说一下,我把SSN常数拿了出来。获取“%SUBST的第一个参数EMPNO无效;内置函数被忽略。”错误修复错误消息ID RNF0382描述的错误后的结果是什么?该问题询问了一些示例,但似乎忽略了中的示例,或者至少没有说明它们有什么问题。也许从未见过?语言参考是在“书”中查找任何不清楚内容的第一个地方。我评论中的链接指向八个示例。他们到底出了什么问题还不清楚。在了解IBM标准示例的错误之前,我们无法给出好的示例。我们会浪费时间,只给出同样的没有帮助的坏例子。IBM的例子很难理解吗?