Как использовать функцию%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 является числовым, вы можете поместить в него только цифры.