[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Apr 2003
    Beiträge
    195

    Question 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

  2. #2
    Registriert seit
    Nov 2004
    Beiträge
    325
    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

  3. #3
    Registriert seit
    Apr 2003
    Beiträge
    195
    @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

  4. #4
    Registriert seit
    Jan 2003
    Beiträge
    746
    D Nm C '0123456789'
    D Rp C '##########'

    If %Scan('#':%Xlate(Nm:Rp:%Subst(Feld:1:5))) > 0;
    Feld = ' bbbbb' + %Trim(Feld);
    EndIf;

  5. #5
    Registriert seit
    Jan 2007
    Beiträge
    905
    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

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Dec 2014
    Beiträge
    310
    Also im Wettbewerb "wer schafft den unleserlichsten Code" gibt's ja hier schon etliche Anwärter ...

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von hel400 Beitrag anzeigen
    Also im Wettbewerb "wer schafft den unleserlichsten Code" gibt's ja hier schon etliche Anwärter ...
    Nicht herummaulen, sondern selber besser machen!
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  10. #10
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    @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!)

  11. #11
    Registriert seit
    Jan 2007
    Beiträge
    905
    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

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. Sonderzeichen in Alpha-Feld
    By alex61 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 20-09-19, 08:43
  2. CPYTOIMPF Blank beim Export aber Inhalt von Feld = leer
    By TheDevil in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 05-06-14, 21:47
  3. Query/400 Umwandeln von Alpha in Num
    By Michael1 in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 18-08-05, 14:50
  4. SQL-Alpha in Numeric
    By HoScHiE in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 13-10-01, 12:36
  5. Alpha in numeric - SQL/QRY
    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
  •