Как использовать функцию%Replace в коде RPG?

Мне было интересно, смогу ли я получить некоторые примеры функции%replace, используемой в rpg. Мои 4-е издание по программированию в 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

Код для% ЗАМЕНА

// МАСКА НОМЕР СОЦИАЛЬНОГО ОБЕСПЕЧЕНИЯ

  SSN = %CHAR(EMPNO);               

  SSN = %REPLACE('***-**-':SSN:1:5);

1 ответ

Решение

Судя по сообщениям об ошибках, EMPNO является числовой переменной. Второй параметр для%REPLACE и первый параметр для%SUBST должны быть строковыми типами (A, C или G).

Если EMPNO является числовым, вы можете поместить в него только цифры.

Другие вопросы по тегам