[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    May 2004
    Beiträge
    447

    Question IFS Datei im RPG auslesen

    Hallo zusammen,

    kann mir jemand sagen was ich hier falsch mache.
    in PiDirFile steht das richtige Verzeichnis und Dateiname aber er bekommt sofort 100 im SQLCOD
    PHP-Code:
    exec sql declare crs1sql cursor for                                 
                
    select cast (line as char(1000)) as txtline                     
                from table
    (QSYS2.IFS_READ(:PiDirFile));exec sql open crs1sql;                                                                                            
    dow *on;                                                                                                              
      
      
    exec sql fetch next from crs1sql into :wLine;            
      
      if 
    SqlCode < *zero or SqlCod 100;                         
        
    leave;                                                
      endif;

     ...

    enddo
    führe ich das SQL direkt aus dann funktioniert es

    select cast(line as char(1000)) as txtline from
    table(QSYS2.IFS_READ('/spareparts/sql/xxx_poi103c1.sql'
    ))

  2. #2
    Registriert seit
    Nov 2020
    Beiträge
    353
    Wie ist PiDirFile definiert? Char oder Varchar?
    Die Blanks werden hier leider berücksichtigt.
    Ansonsten kannst du einfach ein QSYS2.IFS_READ(trim(:PiDirFile)) machen.

    lg Andreas

  3. #3
    Registriert seit
    May 2004
    Beiträge
    447
    Ja, habe es gerade gemerkt.

    select cast (line as char(1000)) as txtline
    from table
    (QSYS2.IFS_READ(trim(:PiDirFile)));exec sql open crs1sql;

    so funktioniert es. Danke

  4. #4
    Registriert seit
    May 2004
    Beiträge
    447
    Aber vielleicht habe ihr eine Antwort. Momentan lese ich die Datei Zeile für Zeile aus und füge sie in einer Variablen zusammen, gibt es eine Möglichkeit die Datei komplett in eine Variable auszulesen?

  5. #5
    Registriert seit
    Nov 2020
    Beiträge
    353
    Dafür kannst du die SQL-Funktion get_clob_from_file(pfad) verwenden.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.350
    Und es gibt noch die Alternative:

    https://www.ibm.com/docs/de/i/7.5?to...s-that-use-sql

    https://www.ibm.com/docs/en/i/7.5?to...s-that-use-sql

    Ich lese dann mit values( :clobfile) into : dbclob_Feld;

    Da DBCLOB bis 1GB groß sein darf, reicht das i.d.R.
    Mit einer Overlay-Definition kann man das dann als varucs2(nn) im RPG native verarbeiten.
    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
    Registriert seit
    Aug 2001
    Beiträge
    2.890
    Zitat Zitat von Andreas_Prouza Beitrag anzeigen
    Dafür kannst du die SQL-Funktion get_clob_from_file(pfad) verwenden.
    ... aber bedenke
    1. GET_CLOB_FROM_FILE muss unter Commitment Control ausfrührt werden.
    2. GET_CLOB_FROM_FILE liefert einen Large Object Locator zurück und dieser muss in RPG entsprechend mit SQLTYPE definiert werden, also DCL-S MyClobLoc SQLType(Clob_Locator);
    3. Ein LOB Locator kann mit SQL-Funktionen (z.B. LOCATE oder SUBSTR) wie ein normales alphanumerisches Feld behandelt werden. Eine direkte Bearbeitung mit RPG-Funktionen ist hingegen nicht möglich.


    Ansonsten kannst Du auch mit IFS_READ-Funktionen die ganze IFS-Datei in einem Schwung lesen und ausgeben ... dafür musst Du das Programm NICHT (unbedingt) unter Commitment Control ausführen.
    Code:
    Select Line 
      from Table(QSYS2.IFS_READ_UTF8(Path_Name => '/home/YourDir1/YourDir2/YourIFSFile.txt', 
                                      End_Of_Line => 'NONE')) a;
    Außerdem kannst Du auch die IFS-Datei direkt mit (embedded) SQL direkt als LOB_FILE lesen. Du musst lediglich die CLOB-File definieren und die vom Precompiler erstellten Daten-Struktur-Unterfelder füllen.
    Für die LOB_Files gilt das gleiche wie für die LOB Locators. Sie können mit SQL-Funktionen wie alphanumerische Strings berarbeitet werden, aber nicht mit normalen RPG-Variablen und Funktionen.

    Etwa so:
    Code:
     DCL-S MyClobFile   SQLType(CLOB_File);                               
     DCL-S MyText       Char(50);                                         
                                                                          
     DCL-S Start        Int(10);                                          
     DCL-S RowLen       Int(5)   inz(120);                                
     DCL-S Index        Uns(3);                                           
                                                                          
     DCL-S MyIFSFile   VarChar(256) inz('/home/YourDir/YourIFSFile.txt');      
     //*******************************************************************
     Exec SQL   Set Option  Commit=*NONE, DatFmt=*ISO, TimFmt=*ISO,        
                            Naming=*SYS,  CloSQLCsr=*EndActGrp;           
                                                                          
       MyCLOBFile_Name = %Trim(MyIFSFile);                               
       MyCLOBFile_NL   = %Len(%Trim(MyCLOBFile_Name));                    
       MyCLOBFile_FO   = SQFRD;                            //Read Only    
                                                                          
       For Index =  1 to 15;                                              
           Start = (Index-1) * RowLen + 1;                                
           Exec SQL Set :MyText = Substr(:MyCLOBFile, :Start, :RowLen);   
           Dsply MyText;                                                  
           If    SQLCODE = 100 or SQLCODE < *Zeros                        
              or %Len(%Trim(MyText)) = *Zeros;                            
              Leave;                                                      
           EndIf;                                                         
       EndFor;                                                            
                                                                          
     *InLR       = *On;

    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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.350
    Wie gesagt, du kannst den SQLTYPE( DBCLOB : 1M) per based Pointer mit VARUCS2 redefinieren und dann ganz normal als RPG-Variable verwenden.
    Das ist auch äußerst praktisch für die IFS-Ausgabe per CLOB_FILE.
    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
    Aug 2001
    Beiträge
    2.890
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wie gesagt, du kannst den SQLTYPE( DBCLOB : 1M) per based Pointer mit VARUCS2 redefinieren und dann ganz normal als RPG-Variable verwenden.
    Das ist auch äußerst praktisch für die IFS-Ausgabe per CLOB_FILE.
    Und warum sollte ich mir das antun?
    Ich kann das Ganze gleich so wie ich es brauche mit SQL aufbereiten und das Ergebnis dann nach RPG übertragen.
    i.Ü. sind RPG-Variablen auf 16MB beschränkt, IFS-Dateien dagegen auf 2GB
    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

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.350
    Weil es schneller ist und funktioniert. Ich habe das schon gebaut, bevor es die anderen IFS-Zugriffe überhaupt gab. Damit lese ich z.B. EDI-Dateiformate aus und erstelle EDI-Dateien.
    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. Datei mit leerem Datei-Namen im IFS
    By KingofKning in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 11-03-15, 18:24
  2. IFS Datei.txt --> Datenbank-Datei
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 16
    Letzter Beitrag: 02-10-09, 12:43
  3. Auslesen eines Blobs und Datei ins IFS schreiben
    By Frank Pusch in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 21-10-08, 13:15
  4. IFS ASCII Datei ohne CR in eine iseries Datei kopieren die Satzlänge 80 hat
    By Michael_Wien in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 24-01-08, 15:13
  5. Datei auslesen mit CL-Programme
    By Jenne in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 21-10-04, 10:21

Berechtigungen

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