-
Feldinhalt auf Alpha bzw. Blank prüfen
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
Last edited by DKSPROFI; 22-12-21 at 07:21.
Grund: Ergänzt
-
@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:
Code:
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:
Code:
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
-
D Nm C '0123456789'
D Rp C '##########'
If %Scan('#':%Xlate(Nm:Rp:%Subst(Feld:1:5))) > 0;
Feld = ' bbbbb' + %Trim(Feld);
EndIf;
-
Ich würde es so lösen in free:
Code:
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 .... :-)
kf
-
Wenn es nur darum geht ob der String mit 5 Blanks beginnt der nicht, dann kann man das schön mit embedded SQL machen:
Code:
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 ...
-
Zitat von hel400
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
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
bääähhh,
so lang muss mein Code gar nicht sein und ich behaupte mal, so ist er der Lesbarste und Schnellste, auch wenn Robert's der Raffinierteste sein mag.
Code:
dcl-s pos int(3);
dcl-s ix int(3);
for ix = 1 to 5;
pos = %check('0123456789' : %subst(feld:ix:1));
if pos = 0;
feld = ' ' + feld;
leave;
endif;
endfor;
Auch von mir, Frohe Festtage und ein gutes neues Jahr.
(Hoffentlich gibt es mal aus diesem Corona Loop einen Exit)
Karl.
kf
-
Nochmal ein bisschen unleserlicher Code, diesmal mit REGEXP! (einfacher als der Code von Baldur!)
Code:
Exec SQL Set :YourVar = Case When RegexP_Like(Left(:YourVar, 5), '[A-Z ]{5}')
then ''
Else Space(5)
End Concat :YourValue;
... ansonsten soll sich jeder aussuchen, was ihm am Besten gefällt.
Similar Threads
-
By alex61 in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 20-09-19, 08:43
-
By TheDevil in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 05-06-14, 21:47
-
By Michael1 in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 18-08-05, 14:50
-
By HoScHiE in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 13-10-01, 12:36
-
By HoScHiE in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 02-10-01, 16:16
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks