Как конвертировать значение A00073 в 9973 в процессе 4gl
У меня есть столбец, имеющий несколько значений, таких как A0045,A00065 . Я хочу преобразовать его в 9945, 9965. Необходимо удалить все 0 и символьное значение и добавить 99 до этого значения.. Пожалуйста, помогите..
5 ответов
Это можно сделать разными способами. Вот один из способов (может быть, не самый лучший). Поскольку у меня нет базы данных, я создал временную таблицу.
def temp-table tt
field val as char.
create tt.
tt.val = "A0045".
create tt.
tt.val = "A00065".
for each tt:
run filter_zero(input-output val).
val = replace(val,"A","99").
DISP val.
end.
procedure filter_zero:
define input-output parameter val as character.
// remvoe all zeroes
repeat while val matches("*0*"):
val = replace(val,"0","").
end.
end procedure.
Приведенный ниже код удаляет также заглавные (AZ) и строчные буквы (az) и "0":
DEF TEMP-TABLE test
FIELD str1 AS CHAR.
DEF VAR newStr AS CHAR NO-UNDO.
DEF VAR i AS INT NO-UNDO.
CREATE test.
ASSIGN test.str1 = "A0045".
CREATE test.
ASSIGN test.str1 = "A00065".
FOR EACH test:
DO i = 65 TO 90: /* A - Z */
IF SUBSTR(test.str1, 1, 1) EQ CHR(i) THEN
DO:
test.str1 = REPLACE(test.str1, CHR(i), "").
END.
END.
DO i = 97 TO 122: /* a - z */
IF SUBSTR(test.str1, 1, 1) EQ CHR(i) THEN
DO:
test.str1 = REPLACE(test.str1, CHR(i), "").
END.
END.
/* Removes all 0 and add 99 before the value */
test.str1 = REPLACE(test.str1, "0", "").
ASSIGN test.str1 = "99" + test.str1.
DISP test.
END.
DEFINE VARIABLE word AS CHARACTER NO-UNDO.
SET word.
word = REPLACE(word,SUBSTRING(word,1,R-INDEX(word,"0")),"99").
/* If you want to remove all words before last zero
(including last zero also) * /
MESSAGE word
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
Пожалуйста, дайте мне знать, если это работает для вас, Progress не установлен, поэтому не может скомпилировать и протестировать.
/ * A0045 -> 9945 A00065 -> 9965 * /
DEFINE VARIABLE v_RawData AS CHARACTER NO-UNDO.
DEFINE VARIABLE v_InpData AS CHARACTER NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
ASSIGN v_RawData = "A0045,A00065".
DO i =1 TO NUM-ENTRIES(v_RawData):
ASSIGN v_InpData = ENTRY(i,v_RawData).
DO j = 1 TO LENGTH(v_InpData):
IF ASC(SUBSTRING(v_InpData,j,1)) > 48 AND
ASC(SUBSTRING(v_InpData,j,1)) < 58 THEN
DO:
LEAVE.
END.
END.
MESSAGE REPLACE(v_InpData,SUBSTRING(v_InpData,1,j - 1),"99").
END.
Определить переменное слово как символ no-undo.
определить переменную i как целое число не отменить.
присвоить слово = "A00065".
/ ******* Удалить все ноль ********/
слово = заменить (слово, подстрока (слово, индекс (слово, "0"), (r-индекс (слово, "0") - 1)), "").
do i = 65 до 90: если подстрока (word,1,1) = chr(i), тогда выполните:
word = replace(word,substring(word,1,1),"99").
leave.
конец.
конец.
отображать слово.