[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    85
    Hab das jetzt mal so umgesetzt, aber die
    BLANKS bekomme ich dadurch nicht raus.
    Werden die BLANKS nicht erkannt bei CHECK?

    Ich könnte jetzt noch die Blanks mit %SCAN rausfiltern oder gibts da noch ne möglichkeit?

    Danke auf jedenfall schon mal für den Weg hierhin!!!

  2. #2
    Registriert seit
    May 2007
    Beiträge
    82
    hallo nochmal,

    also beim OpCode bemängelt der CHECK auch blanks und gibt einen entsprechenden Returncode. Bei der BIF-Funktion bin ich mir nicht ganz sicher, da ich diese noch nie benutzt habe (wegen zu niedrigen Versionsstand). Es müsste aber doch eigentlich analog zum OpCode funktionieren.

    Ich teste das mal auf unserer Produktionsmaschine, die unter V5 läuft. Habe ich aber erst morgen Zeit für übrig (wegen Feierabend).

    Bis dann
    Ulli

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ich würde mir das doch sehr einfach machen:

    d MyNum 18p 0
    d MyChar 18
    d MyInd 5I 0
    d MyDig 1

    MyNum=*zero;
    for MyInd=1 to %size(MyChar);
    MyDig = %subst(MyChar:MyInd:1);
    if %check('0123456789':myDig)=*zero;
    MyNum = MyNum*10+%dec(MyDig:1:0);
    endif;
    next;

    Nicht nur negativ denken, sondern positiv (also eher auf gültig als ungültig prüfen).
    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

  4. #4
    Registriert seit
    May 2007
    Beiträge
    82

    Perfektes Beispiel

    Gutes Beispiel, womit dann auch bewiesen wäre, dass %CHECK auch mit blanks funktioniert.

    Statt %size(MyChar) würde ich allerdings eher %len(%trimr(MyChar)) verwenden, um die Schleife zu optimieren.

    ulli

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Die Performance ist da eher vernachlässigbar, da bei deiner Methode die Variable erst mal temporär in varsize umkopiert wird, die restlichen Leerzeichen entfernt werden, dann die länge berechnet und anschließend die Variable wieder verworfen wird.
    Ausserdem werden die linksstehenden Leerzeichen ja trotzdem bearbeitet.

    %size wird bereits zur Compile-Zeit ausgelöst.

    Für die Performance-Freaks:

    d MyDS DS
    d MyNum 18p 0
    d MyChar 18
    d MyInd 5I 0
    d MyDig 1
    d MyZDig 1 0 overlay(MyDig)

    :
    MyNum = MyNum*10+MyZDig;
    :
    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

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    Wenn's um die Performance geht, würde ich zunächst entweder die Built-in-Funktion %INT oder %DEC verwenden um die alphanumerische Nr. zu konvertieren. Sollten in dem String ungültige Zeichen vorhanden sein, erfolgt ein Abbruch. Diesen kann man über eine Monitor-Group abfangen werden. Anstatt im Fehlerfall jedes Zeichen einzeln zu prüfen, würde ich direkt nach den ungültigen Zeichen suchen und diese aus dem String entfernen.

    PHP-Code:
    D Digits          C                   const('1234567890 ')    
    D Pos             S              3U 0                         
     
    *************************************************************
     /
    Free                                                        
      Monitor
    ;  
        
    Clear MyNum;
        If 
    MyAlpha <> *Blanks;
           
    MyNum = %Int(MyAlpha);
        EndIf;                                                  
      
    On-Error;                                     
        
    DoU Pos = *Zeros;                                         
            
    Pos = %Check(DigitsMyAlpha);                        
            If 
    Pos <> *Zeros;                                     
               
    MyAlpha = %Replace(''MyAlphaPos1); //Entfernen ungült. Zeichen          
            
    EndIf;                                                
        
    EndDo;                                                    
        
    MyNum = %Int(MyAlpha);   
      
    EndMon;                                                     
    /
    End-Free 
    Birgitta
    Birgitta Hauser

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

  7. #7
    Registriert seit
    Jul 2003
    Beiträge
    338

    Red face

    Falls das Ergebnis alphanumerisc sein soll, dann eine kleine Abwandlung von Baldurs ausgezeichneter Lösung:


    d MyNum 18
    d MyChar 18
    d MyInd 5I 0
    d MyDig 1

    MyNum = *blanks;
    for MyInd =1 to %size(MyChar);
    MyDig = %subst(MyChar:MyInd:1);
    if %check('0123456789':myDig) = *zero;
    MyNum = %trim(MyNum) + MyDig;
    endif;
    next;

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wie immer, gibt es viele Varianten, ob es tatsächlich messbare Unterschiede gibt, k.A., aber wenn in 99,9% aller Fälle Sonderzeichen in der Nummer vorhanden sind, ist der erste Test eben meistens bereits unnötig.

    Auch was die Umwandlung nach CHAR angeht, so ist Ludgers Lösung nicht ganz so gut , besser wäre am Ende:

    a) MyChar = %char(MyNum); // Linksbündig ohne Vornullen
    b) MyChar = %editc(MyNum:'X'); // Mit vornullen

    Somit entfällt das ständige trimmen und catten.
    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

Similar Threads

  1. RPG: Client Infos lesen?
    By robertki in forum NEWSboard Programmierung
    Antworten: 25
    Letzter Beitrag: 19-01-07, 08:42
  2. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 10:58
  3. RPG goes Web
    By jth in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 21-12-06, 11:13
  4. Anfänger Frage - Autowert?
    By Alex79 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 28-07-05, 15:45
  5. Frage zu RPG: Aufruf RPG-Programm mit Parametern
    By hs in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 09-10-01, 12:06

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •