[NEWSboard IBMi Forum]
Seite 2 von 3 Erste 1 2 3 Letzte
  1. #13
    Registriert seit
    Jan 2007
    Beiträge
    75
    lol, na dann frag ich mal bob dylan



    Im Programm kann ichs doch dann aber nur so regeln, dass ich vor jeder REGEX Prüfung einen ADDENVVAR auf Jobebene mach und danach einen RMVENVVAR...
    oder gibts da bessere Methoden?

  2. #14
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Stimmt, allerdings würde ich die CCSID des Jobs abfragen und die dazu passende Lokale wählen (falls es tatsächlich mal nicht 273 DE ist).
    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

  3. #15
    Registriert seit
    Jan 2007
    Beiträge
    75
    ok, das hat mir mal wieder sehr geholfen



    Dankeschön ihr beiden

  4. #16
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Alternativ gibts noch die C-Funktion setlocale().
    Vielleicht kommst du ja damit weiter und benötigst dann keine ENVVAR mehr.
    Wenn setlocale() nicht funktioniert, kannst du auch mit putenv() die Variable setzen.
    Vorteil bei putenv():
    - gilt nur für das aktive Prgrammobjekt
    - keine ENVVAR's im Job
    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

  5. #17
    Registriert seit
    Jan 2007
    Beiträge
    75
    hmm.....

    ich hab das jetzt mal mit putenv probiert....

    Code:
    D putenv          PR            10i 0 ExtProc('putenv')           
    D envvar                          *   VALUE OPTIONS(*STRING:*TRIM)
    D cp              s           1024a
    
    
    // set LANG                                    
      cp = %trim(var) + '=' + %trim(value);        
                                                   
       if (putenv(cp) < 0);                        
        err = errno;                               
       endif;
    Er scheint auch was zu machen, weil wenn ich mit STRQSH echo $LANG die Variable anschaue, zeigt er mit das richtig an.... aber die Regex-Funktionen gehen irgendwie nicht richtig....



    mach ich vorher einen ADDENVVAR ENVVAR(LANG) VALUE('/QSYS.LIB/DE_DE.LOCALE') REPLACE(*YES)

    klappt alles.....

  6. #18
    Registriert seit
    Jan 2007
    Beiträge
    75
    Hallo,

    ich hole das Thema noch einmal hoch, da ich es damals nicht hingebracht habe vernünftig zum laufen zu kriegen....

    Ich habe jetzt noch einmal etwas rumprobiert und habe folgendes herausgefunden:


    Die Regex-Befehle arbeiten mit der CCSID von der Umgebungsvariable LANG....

    LANG ist meistens mit dem Wert aus dem Systemwert QLOCALE festgelegt...
    Kann man im USerprofile angeben(Wert LOCALE)...

    Steht in der Umgebungsvariable nichts drin(wegen QLOCALE = *NONE), dann arbeiten die Regex Routinen mit CCSID 37...


    d.h. für mich, wenn ich meinen Regex in einer Source, welche in CCSID 273 gespeichert ist habe, muss ich diesen in die CCSID, welche der aktuellen Umgebungsvariable LANG entspricht umwandeln...

    In der Umgebungsvariable LANG steht aber z.B. /QSYS.LIB/DE_DE.LOCALE....



    Wie bekommt man jetzt raus, welche CCSID dem Objekt /QSYS.LIB/DE_DE.LOCALE entspricht, ohne die hart im Programm umzuschlüsseln??


    Oder gibt es eine Umgebungsvariable, welche mir die CCSID zurückgibt, welche der Umgebungsvariable LANG entspricht??


    Gruß

    chrisssiie

  7. #19
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Auch hierfür gibt es wieder C-Funktionen, dies abzufragen:
    http://publib.boulder.ibm.com/infoce...07.pdf#LOCCONV
    http://publib.boulder.ibm.com/infoce...607.pdf#LINFOP

    localeconv - C++ Reference
    ILE C/C++ Run-Time Library Functions - nl_langinfo() --Retrieve Locale Information

    Wobei es hier durchaus Diskrepanzen geben kann wenn die C-Funktionen die tatsächliche Einstellung liefern (bis hin zu QCCSID) aber regex() diese Funktionen nicht verwendet sondern fix auf die ENV-Variable zugreift.
    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. #20
    Registriert seit
    Jan 2007
    Beiträge
    75
    hmmm... wenn es hier natürlich Diskrepanzen geben kann codiere ich es denke ich doch hart um...

    also DE_DE.LOCALE = 1141, HU_HU.LOCALE = 870 usw....


    Die meisten haben eh entweder DE_DE.LOCALE oder gar nichts drin stehen... wenn noch weitere hinzukommen muss ich das halt reinschreiben...


    Jetzt habe ich aber wenigstens auf den meisten Systemen lauffähge regex Version


    Ist das eigentlich bei allen C-Routinen so, dass die mit der Umgebungsvariable LANG und nicht mit der JOB-CCSID arbeiten?

    Dann müssten doch schon einige vor mir vor dem Problem gestanden haben

  9. #21
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    CCSID-Probleme habe schon viele aber merken es ggf. gar nicht.

    Was ich mit der Diskrepanz meine ist, dass die C-Funktionen nl_langinfo oder localeconv immer ein korrektes Ergebnis liefern, auch wenn die Variable LANG nicht besetzt ist.

    Du kannst ja per getenv() die Variable abfragen, wenn nicht besetzt, ist CCSID = 037, ansonsten per nl_langinfo("CODESET") die CCSID abfragen.
    Vielleicht liefert die ja auch einen Leerstring, wenn LANG nicht besetzt ist.
    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. #22
    Registriert seit
    Jan 2007
    Beiträge
    75
    wie ruft man denn diese nl_langinfo auf?

    so geht es irgendwie nicht:

    PHP-Code:
    D nllanginfo      PR              *   ExtProc('nl_langinfo')
    D                                 *   VALUE OPTIONS(*STRING:*TRIM)

    /
    free
        envccsid 
    = %str(nllanginfo('CODESET'));
    /
    end-free 
    da krieg ich immer nen leeren String zurück....

    hab auch schon envlang = %str(nllanginfo('0'));

    probiert.... krieg ich aber auch nur nen leerstring...

    der Übergabeparameter bei nllanginfo ist ja vom typ nl_item, blos woher krieg ich den im RPG?



    -----------------------------------------------------

    edit:

    hat sich erledigt.... man muss ne zahl übergeben, kein String -.-

    D nllanginfo PR * ExtProc('nl_langinfo')
    D 10i 0 VALUE

    envccsid = %str(nllanginfo(1));


    1 ist die ccsid(codeset)...



    und ich habe endlich eine funktionierende REGEX Funktion in RPG
    Regex arbeitet anscheinend mit der CCSID welche nl_langinfo zurückggibt, also nicht unbedingt mit dem Wert, welcher in der Umgebungsvariable LANG steht!!!!
    Ist LANG leer, bekommt man CCSID 37 zurück....

    Hab dies ausprobiert und er hat immer mit der CCSID von nl_langinfo gearbeitet!!!!

  11. #23
    Registriert seit
    Jun 2012
    Beiträge
    39
    Schönen guten Tag Zusammen,

    also ich muss für meine Ausbildung RPG/ILE verwenden/lernen da kommt es öfters vor das ich ein Teil eines Strings suchen oder ersetzten muss. Ich selbst verwendet Regulärer Ausdruck in C# und war immer begeistert wie viel man damit anstellen kann. Nun würde ich das gern in RPGILE (Free) verwende leider bin ich aus den Beiträgen vor mir nicht ganz schlau geworden gibt es vielleicht ein gutes deutsches Tutorial zu diesem Thema?

    So sieht man Beispiel Programm aus, leider funktioniert es nicht:

    Code:
    /FREE                                                  
                                                           
      Source = 'Das ist ein TEST(123) Regulaerer Ausdruck';
      DSPLY %SCAN('([0-9])' :Source);                      
                                                           
      *Inlr = *On;                                         
                                                           
    /END-FREE
    PS: Ich hoffe es ist dein Problem das ich hier Anfänger Fragen stelle.
    PS: Ein kleines Beispiel Programm mit Kommentaren würde mir sicher weiterhelfen.

  12. #24
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    %scan kennt keine regulären Ausdrücke sonder durchsucht einfach nach dem Vorkommen der Zeichenkette.

    Für reguläre Ausdrücke benötigst du die C-Funktionen regcomp() und regexec().
    In ILERPG definiert man dann einen Prototype (ähnlich der .h-Dateien in C++), der dann aufgerufen wird.
    Beim sog. binden wird dann das "BNDDIR('QC2LE')" benötigt, damit das Programm dann eben die Funktionen verwenden kann.
    Da z.B. regcomp() selber Speicher anlegt sollte dieser auch mittels free() wieder freigegeben werden.

    Ansonsten ist das Thema "ILE-Schulung" für das Forum zu komplex.
    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. Konvertierung nach Graphic --> CCSID Problem
    By codierknecht in forum NEWSboard SAP
    Antworten: 32
    Letzter Beitrag: 09-02-18, 13:00
  2. Windowstabelle wird im IFS in CCSID 1252 erstellt
    By umeis in forum NEWSboard Windows
    Antworten: 3
    Letzter Beitrag: 11-08-06, 12:45
  3. CCSID ändern
    By schaaf in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 04-05-06, 11:18
  4. CPYTOIMPF und CCSID
    By Muchi in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 21-04-06, 13:54
  5. CCSID eines Files
    By Binford in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 07-03-06, 08:58

Berechtigungen

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