Anmelden

View Full Version : Feldinhalt auf Alpha bzw. Blank prüfen



Seiten : [1] 2 3

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

DKSPROFI
22-12-21, 07:17
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 .... :-)

B.Hauser
22-12-21, 09:33
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

Fuerchau
22-12-21, 11:00
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

hel400
22-12-21, 13:18
Also im Wettbewerb "wer schafft den unleserlichsten Code" gibt's ja hier schon etliche Anwärter ...

B.Hauser
22-12-21, 14:03
Also im Wettbewerb "wer schafft den unleserlichsten Code" gibt's ja hier schon etliche Anwärter ...

Nicht herummaulen, sondern selber besser machen!

Robi
22-12-21, 14:40
@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