View Full Version : Feldinhalt auf Alpha bzw. Blank prüfen
FNeurieser
22-12-21, 06:34
Hallo allerseits,
und wieder einmal habe ich eine Frage an Euch:
ich habe ein 25 stelliges Alhpa-Feld und muss prüfen ob die ersten 5 Stellen davon Alphawerte bzw. Blanks enthalten. Ist dies nicht der Fall, müssen dem Feld 5 Blanks vorangestellt werden.
b = Blank
Beispiel 1 - Feldwert: 'A123456789012345678901234'
hier sind die Felder 2 bis 5 numerisch, also muss das Ergebnis so lauten:
'bbbbbA1234567890123456789'
Beispiel 2 - Feldwert: 'A 12345678901234567890123'
hier ist zwar das 1. Feld Alpha, das 2. Blank aber der Rest numerisch daher als Ergebnis:
'bbbbbA 123456789012345678'
Beispiel 3 - Feldwert: 'A B C12345678901234567890'
Feld 1, 3 und 5 Alpha, Feld 2 und 4 Blank und somit korrekt, daher als Ergebnis:
'A B C12345678901234567890'
Wie kann ich das in free-RPG umsetzen?
Danke schon mal für Eure Mithilfe
LG
Franz-Georg
Moin,
mit SQL
Exec SQL Update Datei Set Feld = Replace(Wert , Neuer Wert)
oder
Feldwert = %ScanRpl (Suchwert : Neuer Wert )) : %Trim(Feldwert));
mfg
DKSPROFI
FNeurieser
22-12-21, 07:49
@dskprofi,
danke, aber das bringt mich nicht wirklich weiter. Der Feldwert ist ja variabel und der neue Wert besteht ja aus 5 Leerzeichen und dem ursprünglichen Feldwert, wenn in den ersten 5 Stellen des ursprünglichen Feldwertes kein Alphazeichen oder Blank vorkommt. Die ersten 5 Stellen des alten Feldwertes müssen alle entweder Alphazeichen (A-Z) oder eben Blank sein. Da kann keine Variable für einen Suchwert definiert werden. Ich habe das jetzt wie folgt gelöst:
Zuerst die Definition der DS:
D $ArtChk DS
D $OTNCheck 1A Dim(25)
*
D $ArtNeu DS
D $OTNNeu 1A Dim(25)
*
*---------------------------------------------------------------
***** Constants
*---------------------------------------------------------------
D AlphaChk C CONST ('ABCDEFGHIJKLMNOPQRSTUVWXYZ-
D ÖÄÜ ')
und danach diese Subroutine:
SROTNCheck begsr;
$ArtChk = S081XFLANR;
#i = %check(AlphaChk : $ArtChk);
if #i < 5;
for #i = 1 to 5;
$OTNNeu(#i) = ' ';
endfor;
for #j = 1 to 20;
#i += 1;
$OTNNeu(#i) = $OTNCheck(#j);
endfor;
endif;
S081XFLANR = $ArtNeu;
endsr;
So funktioniert das für mich.
LG
Franz-Georg
RobertMack
22-12-21, 08:45
D Nm C '0123456789'
D Rp C '##########'
If %Scan('#':%Xlate(Nm:Rp:%Subst(Feld:1:5))) > 0;
Feld = ' bbbbb' + %Trim(Feld);
EndIf;
camouflage
22-12-21, 08:45
Ich würde es so lösen in free:
dcl-s feld1 char(25) inz('A123456789012345678901234');
dcl-s feld2 char(25) inz('A 12345678901234567890123');
dcl-s feld3 char(25) inz('A B C12345678901234567890');
dcl-s wrkfld char(25) inz;
dcl-s outfld char(25) inz;
dcl-s pos int(3);
dcl-s ix int(3);
wrkfld = feld1;
outfld = wrkfld;
for ix = 1 to 5;
pos = %check('0123456789' : %subst(wrkfld:ix:1));
if pos = 0;
clear outfld;
outfld = ' ' + %subst(wrkfld:1:%len(wrkfld)-5);
leave;
endif;
endfor;
Das kann man natürlich noch wunderbar in eine Funktion einbetten,
aber etwas lass ich Dir auch noch über .... :-)
Wenn es nur darum geht ob der String mit 5 Blanks beginnt der nicht, dann kann man das schön mit embedded SQL machen:
Exec SQL Set :YourVar = Case When Left(:YourVar, 5) <> Space(5)
Then Space(5)
Else ''
End
concat :YourVar
Wie wäre es mit RegEx per SQL?
Da kannst du dann entsprechende Ausdrücke verwenden:
^[a-zA-Z ]{5}\d*$
Wert muss mit 5 Alpah oder blank anfangen und muss bis zum Ende Ziffern enthalten.
Wenn die Prüfung keinen Match enthält, ist dann halt führende Blanks einzufühgen.
Somit per SQL:
dcl-s Match varchar(100);
dcl-s Check varchar(100);
exec sql set : Match = regexp_substr(:check, '^[a-zA-Z ]{5}\d*$');
if Match = *blank;
Check = '_____' + Check; // _ = Blank
Also im Wettbewerb "wer schafft den unleserlichsten Code" gibt's ja hier schon etliche Anwärter ...
Also im Wettbewerb "wer schafft den unleserlichsten Code" gibt's ja hier schon etliche Anwärter ...
Nicht herummaulen, sondern selber besser machen!
@Birgitta
heute hast Du mal die Aufgabe nicht ganz verstanden
@hel400
aber toll was es alles gibt oder?
@Baldur
Früher (als wir noch einen Kaiser hatten) wollt ich immer RegEx lernen. Wer kann sich solch eine, sicherlich sehr mächtige, Syntax merken
@Camouflage
mit Schleife, eindeutig zu lang (aber lesbar)
@Robert
1 mit Sternchen! Einfach, lesbar kurz. Wie man das von einem Robert erwartet!
Schöne Feiertage, guten Rutsch
Robi