[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    850
    Hallo KM,

    Du könntest den %Subst mit einer Schleife benutzen

    %subst(feld:30-index:1)

    Wenn die Feldlänge 30 Stellen ist erhälst Du von rechts
    nach links jede Stelle .

    Gruss Michael

  2. #2
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.012
    Hallo Michael,

    genauso habe ich es momentan auch gelöst. Ich dachte nur es gäbe vielleicht einen passenden Befehl oder eine Funktion dafür, so dass ich mir die Schleife sparen könnte.

    Trotzdem vielen Dank,

    KM

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Um eine Schleife kommst du allerdings nicht herum, aber wie wäre es trotzdem %scan zu nutzen ?

    d fPos s 5p 0
    d nPos s 5p 0
    d mField s 30
    d mScan s 10

    /free
    fPos = *zero;
    for nPos = 1 to %size(mField);
    nPos = %scan(mScan:mField:nPos);
    if nPos > *zero;
    fPos = nPos;
    iter;
    endif;
    leave;
    endfor;
    if fPos > *zero;
    // gefunden
    endif;
    /end-free
    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
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.012
    Ja gut, das würde sicher auch funktionieren. Aber ich wollte jetzt nicht zu sehr auf dem SCAN herumreiten, sondern nur eine einfache Möglichkeit finden ein Zeichen von rechts zu finden.

    Danke,
    KM

  5. #5
    Registriert seit
    Jun 2004
    Beiträge
    2
    Dieses und ähnliche Probleme habe ich mit ILE/C gelöst:
    1. ein ILE/C-Modul erstellen
    2. daraus ein Serviceprogramm machen
    3. Prototyp-Datei erstellen
    4. in RPG oder sonst wo anwenden
    Fertig.
    Diese Objekte stelle ich dir gerne zur Verfügung. Bitte Mail an: thomas.wachler-thomsen@experian.de
    Gruß
    Thomas

    Hier die Quellenbeispiele:
    /*------------------------------------------------------------------------------
    Zeichenkette von rechts beginnend absuchen
    Als Ergebnis wird die Position zurückgegeben
    ----------------------------------------------------------------------------*/
    unsigned int SCANR(char search[ ], char source[ ], unsigned int slen)
    {
    unsigned int i;

    for (i=slen-1; i>0; i--)
    {
    if (source[i] == search[0]) return i+1;
    }
    return 0;
    }


    * Zeichenkette von rechts beginnend absuchen
    * Als Ergebnis wird die Position zurückgegeben
    DScanR Pr 10U 0
    D search * Value Options(*String) char *
    D source * Value Options(*String) char *
    D lensrc 10U 0 Value
    D r S 10U 0
    D search S 1A
    D string S 50A
    ** looking for End-Of-Record-Character
    C Eval search= ';'
    C Eval string= 'text1;text2;text3'
    C Eval r= ScanR(search: string: %len(string))
    C Dsply r
    C Return

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Deine C-Routine kannst du ersatzlos streichen und durch %scanr() ersetzen (die es übrigens schon länger gibt).

    Und wenn schon C, dann schau dir strrchr() an !!
    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

  7. #7
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.012
    Also laut RPG-Reference Handbuch gibt es kein %SCANR(). Wo soll das denn existieren ??? Das halte ich noch für ein Gerücht.

    Ich bin gerade schon dabei eine Routine mit strrchr() zu schreiben. Damit wird sich das Problem erledigen.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Tschuldige: %checkr() habe ich verwechselt.
    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ich wußt doch, dass es da noch was gab:

    C XYZ:LEN SCAN DST:STR EARR

    Besonders ist hier das Ergebnisfeld zu beachten. Wenn dieses ein ARRAY ist (dim(nn)) werden ALLE Vorkommen des Suchstrings ermittelt und die jeweilige Position ins Array gelegt. Die restlichen Arrayfelder werden auf *zero gesetzt.

    Nimmt man nun noch LOKUP, kann man das letzte Element mittels "%lokup(*zero:Array) - 1) ermitteln.
    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

  10. #10
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.012
    Danke für die Info. Jetzt habe ich meine Prozedur mit strrchr() auch fertig. Ich hatte immer mit der Built-In-Funktion %SCAN getestet. Deshalb hat das nicht funktioniert. Diese lässt nämlich kein Array als Ergebnis zu, im Gegensatz zum OpCode SCAN.

    Gruß,
    KM

Similar Threads

  1. Query mit Eingangsfolge
    By Frank Ziegler in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 10-12-06, 10:21
  2. ILE aus Feld rechts Blanks abschneiden und mit move übertragen
    By kuempi von stein in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 16-10-06, 12:39
  3. Scan von Objekten
    By Jamikl in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 19-03-04, 13:02
  4. Druck auf HP6L nach rechts verschoben
    By Ottmar Günter in forum NEWSboard Drucker
    Antworten: 1
    Letzter Beitrag: 30-04-03, 09:15
  5. SCAN bei ILE RPG ???
    By HoScHiE in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 06-09-01, 16:37

Berechtigungen

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