-
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.
-
Hier noch ein weiteres Beispiel:
Code:
EXEC SQL SET :rpg_var = regexp_replace (:rpg_var, '^(.{5})(?=[A-Z ])', ' $1'))
Kurze Beschreibung:
regexp_replace({Source String}, {Such Pattern}, {Ersetzen mit ...})
Suchpattern:
^ --> Anfang der Zeichenkette, sonst hättest du ein ungewolltes Verhalten, wenn du später auch noch 5 Buchstaben/Blanks hast
(.{5}) --> Beliebiges Zeichen 5 mal
(?=[A-Z ]) --> Prüft ob der vorherige Wert (Beliebige 5 Zeichen) auf A-Z und Blank
' $1' --> Wenn die Prüfung TRUE ergibt, wird es mit diesem Wert ersetzt.
lg Andreas
-
und nochmal rein RPG
**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 Ausgabe varchar(50) inz;
dcl-s pos zoned( 5: 0 );
pos = 1;
ausgabe = feld1;
dou pos > 5;
if %subst(feld1 : pos:1) >= x'F0' and %subst(feld1 : pos:1) <= x'F9';
ausgabe = ' ' + %subst(ausgabe :1:25-pos);
endif;
pos += 1;
enddo;
Viele Wege führen nach Rom bzw. zum Ergebnis
Programmierung
-
... da führen einige an Rom vorbei (wenn der String nicht Knast(#)-frei ist, Sonderzeichen enthält, Steuerzeichen enthält, mit -12345 anfängt oder 365,25 beginnt): knapp vorbei ist auch daneben.
D*B
-
Ich glaube das muss ein Praktiker beantworten :-)
Wenn ich mir deine Konstante "AlphaChk" anschaue, dann sieht man ja schon was für Zeichen in den ersten 5 Stellen geprüft werden sollen. Um das nicht all zu kryptisch zu machen hätte ich das so gelöst:
Einfach die einzelnen Zeichen der ersten 5 Stellen prüfen ob sie in deiner Konstante vorhanden sind.
if %scan(%subst(Feld:1:1):AlphaChk) = 0 or %scan(%subst(Feld:2:1):AlphaChk) = 0
or %scan(%subst(Feld:3:1):AlphaChk) = 0 or %scan(%subst(Feld:4:1):AlphaChk) = 0
or %scan(%subst(Feld:5:1):AlphaChk) = 0;
Feld = 'bbbbb' + %trimr(Feld);
endif;
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