[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    May 2011
    Beiträge
    30

    SQL Statement in SQLRPGLE

    Hallo,
    ich habe eine Frage bezüglich embedded SQL. Ich möchte eine Datei auslesen und hinterher in eine Printerfile drucken.

    Mein SQL Befehlt sieht wie folgt aus:
    EXEC SQL
    select * into :test
    from scw_data/CXLAGPF
    where cxfirm =DRFIRM
    and cxekvk = 'S'
    and cxsart = 'S'
    and cxmeng <> 0
    and cxstat = ' '
    and cxrest <> 0;

    In die Variable Test soll der Datensatz geschrieben werden. Nun zu meinem Problem.

    1) Es wird nur das erste Feld in die Variable Test geschrieben, wie bekomme ich alle Felder in die Variable oder wie kann ich mehrere Variablen angeben, wo die Werte eingetragen werden?

    2) Mit dieser Methode bekomme ich ja immer nur einen Datensatz in die Variable Test. Das SQL müsste aber mehrere ausgeben, wie kann ich mehrere Ergebniss-Datensätze in meine prtf schreiben?

    Vielen Dank im Vorraus!!!

    LG Vigi

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    Zitat Zitat von Vigi Beitrag anzeigen
    1) Es wird nur das erste Feld in die Variable Test geschrieben, wie bekomme ich alle Felder in die Variable oder wie kann ich mehrere Variablen angeben, wo die Werte eingetragen werden?

    2) Mit dieser Methode bekomme ich ja immer nur einen Datensatz in die Variable Test. Das SQL müsste aber mehrere ausgeben, wie kann ich mehrere Ergebniss-Datensätze in meine prtf schreiben?

    Vielen Dank im Vorraus!!!

    LG Vigi
    @1: Definiere Test als Externe Datenstruktur für den Datensatz den Du einlesen willst.

    @2: Du musst einen Cursor definieren und die einzelnen Datensätze über eine Lese-Schleife verarbeiten:

    SQL Statements:
    1. DECLARE
    2. OPEN
    3. FETCH
    4. CLOSE

    Nähere Informationen findet man in dem folgenden Redbook - Kapitel 7
    Modernizing IBM eServer iSeries Application Data Access - A Roadmap Cornerstone

    Birgitta
    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

  3. #3
    Registriert seit
    May 2011
    Beiträge
    30
    WOW, das war mal ne schnelle Antwort.
    Vielen Dank Birgitta!

    Dann sieht das ganze schon besser aus:
    D Ok C 0
    D MyData E Ds Extname(CXLAGPF)

    Exec Sql Set Option Datfmt=*Iso, Commit=*None;
    EXEC SQL Declare Mycursor Cursor For
    select * from scw_data/CXLAGPF
    where cxfirm =DRFIRM
    and cxekvk = 'S'
    and cxsart = 'S'
    and cxmeng <> 0
    and cxrest <> 0
    For Fetch Only;
    Exec Sql Open Mycursor;

    Dow Sqlcode = Ok;
    Exec Sql Fetch Mycursor Into :Mydata;
    If Sqlcode = Ok;
    Exsr SchreibInPRTF;
    Endif;
    Enddo;

    Soweit so klar
    Meine Daten stehen jetzt in Mydata. Da habe ich aber leider direkt eine "Folgefrage".
    Wie spreche ich die einzelnen Feldinhalte aus Mydata an, um diese in die Felder der Printerfile zu übertragen?
    Sagen wir mal in der Datei CXLAGPF gibt es die Felder KFirma, KKunde, KUmsatz und in der PRTF PKunde, PFirma, PUmsatz.

    Mag sein, dass meine Fragen sehr, naja, unverständlich rüber kommen. Das Problem ist nur, dass ich grad mit SQL in RPG Programmen anfange und nur wenig(eigentlich keine) Zeit zum einarbeiten habe, da der Abgabetermin recht kurzfristig ist.

    Darum Danke schonmal für alle hilfreichen Antworten!

    LG Vigi

  4. #4
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Hallo Birgitta, da ich nicht wirklich RPG kann sondern nur Cobol stellt sich mir die Frage ob es das so detailliert auch für Cobol gibt? Kennst Du da was?

    GG

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    Das Problem ist wohl nicht SQL sondern RPG ?
    Wie hast du denn nach einem Read/Chain Dateifelder in Druckfelder bewegt ?

    Entschuldige bitte die provozierende Frage, aber als RPG-Programmierer müsstest du das ja schon mal wissen.

    Ein Fetch ist ja eigentlich nichts anderes als ein READ/CHAIN auf eine Datei.
    Die Inhalte stehen dann in den Feldern deiner extern definierten Struktur, so dass du die Daten ebne ganz normal wie sonst auch verarbeiten kannst.
    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
    Oct 2003
    Beiträge
    117
    Hallo Vigi, aller Anfang ist schwer.
    Du kannst die Felder einer Datenstruktur qualifiziert ansprechen:

    Code:
    PKunde = MyData.KKunde; 
    PFirma = MyData.KFirma;
    PUmsatz = MyData.KUmsatz;

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    Du wirst lachen, aber für Cobol gibts das ganz genauso.

    Einziger Unterschied:
    Für SQL muss man Felder explizit zugänglich machen:

    exec sql begin declare section end-exec.
    01 ...
    77 ...
    exec sql end declare section end-exec.

    Dies kann in der Quelle beliebig oft wiederholt werden.

    Zusätzlich muss man einmalig die SQLCA einbinden:

    exec sql
    include SQLCA
    end-exec.

    Alle anderen SQL-Befehle werden genauso eingebunden wie in RPG/LE.

    exec sql
    :
    :
    end-exec.

    Für die Fehlerbehandlung ist es am einfachsten am Anfang der Procedure Division einmalig

    exec sql
    whenever sqlerror continue
    end-exec.

    einzubinden. Dann kann man die Variable SQLCODE direkt auswerten.

    Der Member-Typ ist SQLCBL bzw. SQLCBLLE.
    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
    Nov 2003
    Beiträge
    2.308
    Zitat Zitat von Vigi Beitrag anzeigen
    Das Problem ist nur, dass ich grad mit SQL in RPG Programmen anfange und nur wenig(eigentlich keine) Zeit zum einarbeiten habe, da der Abgabetermin recht kurzfristig ist.
    ... und getestet wird später.

  9. #9
    Registriert seit
    May 2011
    Beiträge
    30
    Top, es läuft.
    Es ging mir genau darum, die Felder qualifiziert anzusprechen.

    1000 Dank ;-)
    Super Team hier!

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Pikachu Beitrag anzeigen
    ... und getestet wird später.
    ... die Bananen Strategie im Software Engineering: die Ware reift beim Kunden

    D*B

    PS: für COBOL und RPG gibt es noch:
    http://publib.boulder.ibm.com/infoce...zajp/rzajp.pdf
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Du wirst lachen, aber für Cobol gibts das ganz genauso.

    Einziger Unterschied:
    Für SQL muss man Felder explizit zugänglich machen:

    exec sql begin declare section end-exec.
    01 ...
    77 ...
    exec sql end declare section end-exec.

    Dies kann in der Quelle beliebig oft wiederholt werden.

    Zusätzlich muss man einmalig die SQLCA einbinden:

    exec sql
    include SQLCA
    end-exec.

    Alle anderen SQL-Befehle werden genauso eingebunden wie in RPG/LE.

    exec sql
    :
    :
    end-exec.

    Für die Fehlerbehandlung ist es am einfachsten am Anfang der Procedure Division einmalig

    exec sql
    whenever sqlerror continue
    end-exec.

    einzubinden. Dann kann man die Variable SQLCODE direkt auswerten.

    Der Member-Typ ist SQLCBL bzw. SQLCBLLE.
    Danke, dann weiß ich ja was ich die Feiertage über machen werde...

    GG

  12. #12
    Registriert seit
    May 2011
    Beiträge
    30
    ... die Bananen Strategie im Software Engineering: die Ware reift beim Kunden

    D*B

    -> Das ist gut rofl

    Eine Kleinigkeit hat sich noch ergeben.
    Wenn man in der DSPF *blank, also nichts eingibt, dann soll alles angezeigt werden.

    Beispiel:
    Kundenname: *blank

    Das SQL gibt jetzt natürlich keinen Treffer, da es keinen Kunden ohne Namen gibt. Wie kann ich aber sämtliche Kunden angezeigt bekommen, wenn der Anwender keinen Kundennamen eingibt.

    Habe versucht, dass *blank durch ein "*" zu ersetzten, das funktioniert aber leider nicht. Hat da jmd ne Idee?

Similar Threads

  1. Dynamisches SQL in einem CL erstellen
    By Sony in forum IBM i Hauptforum
    Antworten: 27
    Letzter Beitrag: 20-07-09, 21:48
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  4. SQL Statement
    By juergenkemeter in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 15-11-04, 12:15
  5. SQL Statement
    By Pia in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 18-04-02, 15:24

Berechtigungen

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