[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Apr 2004
    Beiträge
    54

    Embedded SQL mit Update

    Bei meinem erten sql mit update werden die Felder nicht aktualisiert.
    Der Select funktioniert und die UF-Felder werden mit den gewünschten Daten gefüllt. Aber die Dateifelder behalten ihren Ausgangewert.
    Das Programm wurde mit commit *none umgewandelt.
    Es kommt zu keiner Fehlermeldung.


    Was hbe ich übersehen?

    C UPDIN BEGSR
    C************************************************* ***************
    C/EXEC SQL
    C+ Declare upzeig cursor for
    C+ select prkhs, prfir, prdtjj, prdtmm, prdtdd, prart, przah,
    C+ prsts, prsa, prtxt, prpro, prwer, prbis, prspe
    C+ from preipf
    C+ where prkhs = :cmnr and prfir = 3
    C+ order by prfir, prart, przah
    C/END-EXEC
    C MOVE *ZEROS UFKHS 70
    C MOVE *BLANKS UFTXT 70
    C MOVE *BLANKS UFSTS 1
    C MOVE *BLANKS UFSPE 1
    C MOVE *ZEROS UFFIR 20
    C MOVE *BLANKS UFSA 3
    C MOVE *ZEROS UFDTMM 20
    C MOVE *ZEROS UFDTDD 20
    C MOVE *ZEROS UFDTJJ 40
    C MOVE *ZEROS UFART 40
    C MOVE *ZEROS UFZAH 30
    C MOVE *ZEROS UFPRO 52
    C MOVE *ZEROS UFWER 92
    C MOVE *ZEROS UFBIS 92
    C/EXEC SQL
    C+ open upzeig
    C/END-EXEC
    C SQLCOD DOWNE100
    C/EXEC SQL
    C+ fetch upzeig into :ufkhs,
    C+ :uffir, :ufdtjj, :ufdtmm, :ufdtdd, :ufart, :ufzah,
    C+ :ufsts, :ufsa, :uftxt, :ufpro, :ufwer, :ufbis, :ufspe
    C/END-EXEC
    C SQLCOD CABEQ100 EUPD
    C SELEC
    C PRART WHEQ 10
    C Z-ADDBKDA UFPRO
    C Z-ADDBUEP UFWER
    C HEUTE CAT USER UFTXT
    C UFART WHEQ 101
    C Z-ADDBAOP1 UFWER
    C Z-ADDBAOHB1 UFBIS
    C Z-ADDBPROV1 UFPRO
    C MOVE BAUSL1 UFSTS
    C ENDSL
    C/EXEC SQL
    C+ update preipf
    C+ set PRPRO = :UFPRO, PRWER = :UFWER, PRBIS = :UFBIS,
    C+ PRTXT = :UFTXT, PRSA = :UFSA,
    C+ PRSTS = :UFSTS
    C+ where current of upzeig
    C/END-EXEC
    C ENDDO
    C EUPD TAG
    C/EXEC SQL
    C+ close upzeig
    C/END-EXEC
    C************************************************* ***************
    C ENDSR

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Du musst den Select anpassen:

    C/EXEC SQL
    C+ Declare upzeig cursor for
    C+ select prkhs, prfir, prdtjj, prdtmm, prdtdd, prart, przah,
    C+ prsts, prsa, prtxt, prpro, prwer, prbis, prspe
    C+ from preipf
    C+ where prkhs = :cmnr and prfir = 3
    C+ order by prfir, prart, przah

    C+ for update

    C/END-EXEC
    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. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Es geht allerdings auch einfacher, z.B.:

    update preipf
    set
    prpro = (case prart when '10' then :bkda else prpo end)
    ,ufwer = (case prart when '10' then :buep else ufwer end)
    ,.....
    where prkhs = :cmnr and prfir = 3

    analog dann für alle weiteren Felder.
    Das geht schneller und auch übersichtlicher.
    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
    Apr 2004
    Beiträge
    54
    Zitat Zitat von Fuerchau
    Du musst den Select anpassen:

    C/EXEC SQL
    C+ Declare upzeig cursor for
    C+ select prkhs, prfir, prdtjj, prdtmm, prdtdd, prart, przah,
    C+ prsts, prsa, prtxt, prpro, prwer, prbis, prspe
    C+ from preipf
    C+ where prkhs = :cmnr and prfir = 3
    C+ order by prfir, prart, przah

    C+ for update

    C/END-EXEC
    werde ich sofort probieren
    ich hatte ein Beispiel aus alten Unterlagen der Zusatz nicht drin ist.

  5. #5
    Registriert seit
    Apr 2004
    Beiträge
    54
    For Update erkennt der Compiler als fehlerhaft.
    Ich versuche die Felder für 35 Datensätze zu ändern und wollte statt einer RPG- Schleife Sql verwenden (auch zur Übung).
    Wegen der übersicht hab ich die meisten when statements gelöscht.

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von Bernd Wiezroek
    .
    Es kommt zu keiner Fehlermeldung.
    Das stimmt so nicht! Du müsstest bei dem UPDATE-statement den SQLCOD -510 erhalten: Cursor &1 für Datei &2 schreibgeschützt.

    Wird ein Cursor ohne ORDER BY-Kausel definiert, können Datensätze ohne Angabe der FOR UPDATE OF Klausel fortgeschrieben werden.
    Der Datensatz wird beim Einlesen nur dann gelockt, wenn im Programm ein Update auf den Cursor mit WHERE CURRENT OF vorhanden ist.

    Wird eine ORDER BY-Klausel im Declare-Statement angegeben, gilt der CURSOR als Read Only, es sei denn die FOR UPDATE OF wird angegeben.

    Bei der FOR UPDATE OF Klausel müssen alle Felder, die geändert werden sollen durch Kommata getrennt aufgelistet werden.

    Werden nicht alle Felder aufgelistet, ist der UPDATE nicht erfolgreich.

    Noch ein Tipp frage nach jedem SQL-Statement entweder SQLCOD oder SQLSTT ab, um festzustellen ob ein Fehler aufgetreten ist.

    PHP-Code:
    C/EXEC SQL                                                            
    C
    + Declare CsrOrdH dynamic scroll Cursor WITH HOLD for                
    CSelect Order_NumberOrder_Total                                   
    C
    +   from Order_Header                                                
    C
    +   where     Order_Number between :FirstOrderNo and :LastOrderNo    
    C
    +         and Year(Order_Date)   = :PrevYear                         
    C
    +   Order by Order_Number                                            
    C
    + For Update Of Order_TotalOrder_Date                                          
    C
    /End-Exec                                                            
                                                                          
    C
    /EXEC SQL Close CsrOrdH                                              
    C
    /END-EXEC                                                            
                                                                          
    C
    /EXEC SQL Open  CsrOrdH                                              
    C
    /END-EXEC                                                            
    C                   DoU       SQLSTT   
    '02000'                      
                                                                          
    C/EXEC SQL                                                            
    C
    Fetch next from CsrOrdH                                            
    C
    +       into :OrderNo, :OrderTotal                                   
    C
    /END-EXEC 
            
    C
    /EXEC SQL     
    C
    update Order_Header                      
    C
    +        Set Order_Total = :OrderTotal   
    C
    +            Order_Date = :OrderDate  
    C
    where  Current of CsrOrdH                
    C
    /END-EXEC 

    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
    Apr 2004
    Beiträge
    54
    Das War die Lösung das Order by ist im Beispiel nicht drin. Den Sqlcod hatte ich nicht überwacht. Jetzt kann ich das Programm vernünftig machen.
    Vielen Dank für die Hilfe.

  8. #8
    Registriert seit
    Jun 2005
    Beiträge
    5

    SQLRPG CONNECT FEHLER bei LOKALE UND REMOTE/DATEIEN

    Ich möchte Sätze aus Maschine A in einer Datei in Maschine B inserieren mit dem Befehl INSERT.

    Beim CONNECT habe ich Probleme. Maschine A ist Lokal , Maschine B ist Remote .
    Wie kann ich CONNECT steuern ?
    Wenn ich Interaktive SQL aufrufe, habe ich richtiges Ergebnis, aber bei Embedded-Sql läuft es nicht

    Ich deklariere beie Dateien,
    mach CONNECT auf Lokal,open und fetche die Felder der Lokalen dateien, aber immer Fehler CONNECT ALREADY EXIST
    Muss ich auf explicite CONNECT LOKALDB verzichten oder was soll ich machen ?

    CONNECT TO LOKALDB
    dann kommen logische Bearbeitung und mache so ein EXSR INSERT, da mache ich wieder CONNECT TO REMOTEDB, es klappt nicht.
    Kann mir jemand sagen, wie man CONNECT AUF LOKALDB macht, wo man Ursptungsdatei Liest und die Sätze in die REMOTEDATEI übeträgt vorgeht ? Bin neu mit Embedd-SQLRPG

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Hallo,

    an die lokale Maschine darfst du nicht connecten, das ist abgeklemmt damit das nicht etwa im Server Job läuft (CFINT lässt grüssen), deshalb wirst du automatisch connected.
    An die remote Maschine B musst du connecten.
    Es ist immer nur eine Connection aktiv (schließlich sagst du bei der SQL Operation ja nicht an welche Büchse du dich wendest)-
    Connections werden mit SET CONNECTION geswitcht.

    Du musst also zwischen lesen und schreiben jeweils switchen.

    Etwas eleganter müsste das eigentlich mit zwei Activation Groups gehen, sprich zwei ILE Modulen in getrennten Serviceprogrammen mit jeweils eigener Activation Group. Serviceprogramm A arbeitet lokal in Activation Group A; Serviceprogramm B connected remote an B und läuft in der Activation Group B. (Hoffentlich wird dem maroden PreCompiler hierbei nicht schwindelig).
    Die beiden Zugriffsmodule werden dann von dem Programm mit der steuernden Logik verwendet und die lese- bzw. schreib Procedures aufgerufen. Dazu müssen dann die beiden Serviceprogramme in das steuernde Programm gebunden werden.

    mfg

    Dieter Bender


    Zitat Zitat von polo
    Ich möchte Sätze aus Maschine A in einer Datei in Maschine B inserieren mit dem Befehl INSERT.

    Beim CONNECT habe ich Probleme. Maschine A ist Lokal , Maschine B ist Remote .
    Wie kann ich CONNECT steuern ?
    Wenn ich Interaktive SQL aufrufe, habe ich richtiges Ergebnis, aber bei Embedded-Sql läuft es nicht

    Ich deklariere beie Dateien,
    mach CONNECT auf Lokal,open und fetche die Felder der Lokalen dateien, aber immer Fehler CONNECT ALREADY EXIST
    Muss ich auf explicite CONNECT LOKALDB verzichten oder was soll ich machen ?

    CONNECT TO LOKALDB
    dann kommen logische Bearbeitung und mache so ein EXSR INSERT, da mache ich wieder CONNECT TO REMOTEDB, es klappt nicht.
    Kann mir jemand sagen, wie man CONNECT AUF LOKALDB macht, wo man Ursptungsdatei Liest und die Sätze in die REMOTEDATEI übeträgt vorgeht ? Bin neu mit Embedd-SQLRPG
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Jun 2005
    Beiträge
    5
    : : Es sollen Daten die auf einer Produktionsmaschiene vorliegen in eine andre Maschieren geschrieben werden.

    Die Verbindung besteht schon.

    Embeded-SQL-Befehlen aufrufen.
    In diesem Programm wird der CONNECT zur fernen AS400-Datenbank gemacht.
    Ein INSERT und ein UPDATE funktioniert auch schon in einer interaktiven Anweißung.
    Aber ich habe das Problem.
    Ich kann Embeded-SQL nicht und weis auch nicht wie man das macht.

    Nun bekomme ich den Fehler SQLSTATE 01532
    Ich mache CONNECT nur auf Remote. Deklariere Lokal-DB, mache OPEN, mach auch FETCH in Schleife dann sage ich EXSR VERARBEITE, niet, es klappt nicht. Es kommt so eine Meldung DB2 Multisystem fehlt oder CRTNODGRP. Bitte um Hilfe
    Wer kann mir sagen wie ich Sätze auf Datei A in DateiB(Remote-Datei inserieren kann) ?

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Hallo,

    das Minimum, das ich von einem Frager erwarte ist, dass er die Antwort zumindest liest; sonst verschwnedet der Antworter lediglich seine Zeit, wozu ich keine Lust habe.

    mfg

    Dieter Bender

    Zitat Zitat von polo
    : : Es sollen Daten die auf einer Produktionsmaschiene vorliegen in eine andre Maschieren geschrieben werden.

    Die Verbindung besteht schon.

    Embeded-SQL-Befehlen aufrufen.
    In diesem Programm wird der CONNECT zur fernen AS400-Datenbank gemacht.
    Ein INSERT und ein UPDATE funktioniert auch schon in einer interaktiven Anweißung.
    Aber ich habe das Problem.
    Ich kann Embeded-SQL nicht und weis auch nicht wie man das macht.

    Nun bekomme ich den Fehler SQLSTATE 01532
    Ich mache CONNECT nur auf Remote. Deklariere Lokal-DB, mache OPEN, mach auch FETCH in Schleife dann sage ich EXSR VERARBEITE, niet, es klappt nicht. Es kommt so eine Meldung DB2 Multisystem fehlt oder CRTNODGRP. Bitte um Hilfe
    Wer kann mir sagen wie ich Sätze auf Datei A in DateiB(Remote-Datei inserieren kann) ?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    Jul 2004
    Beiträge
    82
    Zitat Zitat von BenderD
    Hallo,

    das Minimum, das ich von einem Frager erwarte ist, dass er die Antwort zumindest liest; sonst verschwnedet der Antworter lediglich seine Zeit, wozu ich keine Lust habe.

    mfg

    Dieter Bender
    Finde das du ihm eine eindeutige Lösung aufgezeigt hast , wenn er nicht genügent vom Programmieren weiß solte er es sich aneignen.

    Die nochmalige wiederholung seiner Frage läßt darauf schließen das er ein kompletes Program Script haben möchte.

    mfg

Similar Threads

  1. Embedded SQL in VARPG
    By Squall in forum NEWSboard Programmierung
    Antworten: 23
    Letzter Beitrag: 18-10-06, 12:01
  2. Update Syntax SQL
    By wuwu in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 18-07-06, 15:31
  3. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  4. Character verbinden in Embedded SQL
    By e_sichert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-05-06, 10:47
  5. embedded SQL in ILE RPG, UPDATE
    By Zupfl50 in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 06-10-04, 21:04

Berechtigungen

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