[NEWSboard IBMi Forum]
Seite 3 von 3 Erste ... 2 3
  1. #25
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... bei normalisierten Daten umfasst ein insert aus Programmsicht mehrere inserts in die Datenbank, bei denen man oft die soeben geschriebenen Schlüssel für andere Tabellen als Foreign Key benötigt.

    D*B

    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    finde diese off-topic beiträge recht interessant :-)

    verstehe grad nicht, was da gemeint wurde.
    wenn 2 tabellen miteinander per FK verknüpt werden, muss immer zuerst die ID ermittelt werden bevor sie referenziert wird.
    da ist es ja egal, ob der key vom programm oder der DB generiert wird.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  2. #26
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    ich verstehe da nur noch immer nicht das problem?
    ist ja doch ganz normal.

  3. #27
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Ich kann das Problem eigentlich auch nicht nachvollziehen.

    Arbeitet man mit Identity Columns und fügt einen einzelnen Satz mit SQL oder native I/O ein, kann man der eingefügten Identity-Wert mit dem SQL Befehl Identity_Val_Local ermitteln.
    Dabei ist es unerheblich, wie der Satz erzeugt wurde (SQL oder Native I/O). Das der Job und innerhalb des Jobs das Job-Level wird berückichtigt, d.h. auch wenn durch einen anderen Job oder einen Trigger ein weiterer Datensatz hinzugefügt wurde, wird der Wert des vorhergehenen Inserts oder Writes ermittelt.

    Bei Sequences ermittelt man den Wert zuerst und schreibt dann.

    Werden bei einem SQL Insert mehrere Sätze eingefügt, kann man die soeben eingefügten Datensätze (ab 6.1) mit allen (generierten) Werten wie folgt ermitteln. Das Insert-Statement wird innerhalb eines Select-Statements ausgeführt.
    z.B.

    PHP-Code:
    '
    Select HdrId, OrderNo
      From Final Table(Insert OrderHdr(OrderNo,  CustNo,  DelTerms, 
                                       DelDate, OrderType) 
                              Select IFORDN,     IFCUST,  IFDELT,
                                     Date(Digits(IFDELT concat '
    000000',
                                     IFORDT)
                                  From  Interface
                                 Where IFSTAT = ' ')
    Order By Input Sequence 
    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

  4. #28
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... alles viel komplizierter als vorher getNextKey(Dateiname) aufzurufen und den Key zu belegen und last not least sind diese ganzen Features nicht ANSI SQL und damit rate ich davon ab!
    Wer sich lieber an DB2/400 bindet, mag das tun.

    D*B

    Zitat Zitat von B.Hauser Beitrag anzeigen
    Ich kann das Problem eigentlich auch nicht nachvollziehen.

    Arbeitet man mit Identity Columns und fügt einen einzelnen Satz mit SQL oder native I/O ein, kann man der eingefügten Identity-Wert mit dem SQL Befehl Identity_Val_Local ermitteln.
    Dabei ist es unerheblich, wie der Satz erzeugt wurde (SQL oder Native I/O). Das der Job und innerhalb des Jobs das Job-Level wird berückichtigt, d.h. auch wenn durch einen anderen Job oder einen Trigger ein weiterer Datensatz hinzugefügt wurde, wird der Wert des vorhergehenen Inserts oder Writes ermittelt.

    Bei Sequences ermittelt man den Wert zuerst und schreibt dann.

    Werden bei einem SQL Insert mehrere Sätze eingefügt, kann man die soeben eingefügten Datensätze (ab 6.1) mit allen (generierten) Werten wie folgt ermitteln. Das Insert-Statement wird innerhalb eines Select-Statements ausgeführt.
    z.B.

    PHP-Code:
    '
    Select HdrId, OrderNo
      From Final Table(Insert OrderHdr(OrderNo,  CustNo,  DelTerms, 
                                       DelDate, OrderType) 
                              Select IFORDN,     IFCUST,  IFDELT,
                                     Date(Digits(IFDELT concat '
    000000',
                                     IFORDT)
                                  From  Interface
                                 Where IFSTAT = ' ')
    Order By Input Sequence 
    Birgitta
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #29
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Was nützen mir die Features von V6, wenn ich z.T. noch mit V5R2 arbeiten muss.
    NEXT VALUE gab es da allerdings auch schon und das Problem der Foreign Keys gibt es da auch schon.
    Sequences und Identities sind ja auch ganz nett erhöhen aber nun mal den Programmier- und Wartungsaufwand. Fehlerquellen sind da schon vorprogrammiert.

    In properitären Anwendungen wurden ja damals schon Tabellen mit Zählschlüsseln verwaltet, für die man nun nachträglich auch noch Dieters getnextkey() entwicklen kann um somit Masseninserts (insert ... select) problemlos realisieren zu können.

    Was mir bei den Identities und Sequences nicht so gut gefällt ist die Cache-Funktion, die mir Nr'n verbrät und die ich gezielt abschalten muss (zu Lasten der Performance), der Default ist 20.
    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. #30
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    ich behaupte dass weder die eine methode noch die andere kompliziert sei.
    die frage ist vielmehr eine geschmackssache.

    und was das ANSI SQL betrifft:
    ab 6.1 gibt es zumindest die möglichkeit vom OS das SQL auf ANSI SQL prüfen zu lassen.
    ich kenne aber sowieso keine (größere) datenbank die nicht features hat, welche nicht ANSI SQL sind. was meiner meinung egal ist, da man nie auf die idee kommen würde/sollte zb:
    die datenbank eines Lagerverwaltungssystems von DB2 auf oracle umzustellen.

    und zu sequences und identities:
    ich weis nicht wie damit sonst noch programmiert wird, aber einen mehraufwand habe ich bis jetzt noch nie gehabt.

  7. #31
    Registriert seit
    Jan 2007
    Beiträge
    189
    Zitat Zitat von Kurmas Zeschlon Beitrag anzeigen
    ...
    Code:
    ...
    exec sql set option commit=*none;
    ...
    SET OPTION muss der erste Befehl sein den Du ausführst.
    mfg

    Kit
    www.ecofitonline.com
    DeskfIT - ChangefIT - XrefIT

  8. #32
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    SET OPTION muss der erste SQL-BEFEHL sein der ausgeführt werden muss, und das ist in dem vorherigen beispiel der fall.

  9. #33
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Korrektur:

    PHP-Code:
    SET OPTION muss der erste Befehl sein den Du ausführst
    SET OPTION wird überhaupt nicht ausgeführt!
    SET OPTION sind Compiler-Anweisungen und müssen deshalb (so ist halt der SQL-PreCompiler implementiert) physisch in der Quelle vor allen anderen SQL-Statements stehen!

    Würde SET OPTION in der *INZSR stehen, die am Ende der Quelle steht und alle anderen SQL Statements wären im Hauptprogramm, gäbe es (oder zumindest gab es) einen Compile Fehler.

    Ich muss mal wieder prüfen, ob es inzwischen nicht ein PTF gibt, das auch eine Definition an einer anderen Stelle zulässt.

    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

  10. #34
    Registriert seit
    Jun 2005
    Beiträge
    9
    Danke für die Tipps! Ich habe es nun wie in Birgittas Beispiel versucht.

    Zitat Zitat von B.Hauser Beitrag anzeigen
    Das Statement sollte funktionieren, wenn Du die Union-Anweisung als Sub-Select definierst.

    Etwa so:
    PHP-Code:
    insert into LastTable (DNrDlabelDName)
          (
    Select Next Value for Seq_Zaehlerx.*
             
    From (Select FldLabelFldName from MyTable
                     Union All 
                   Select XYZLabel
    XYZName from NextTable
    Birgitta
    Das einzige Problem, das ich noch hatte, war, dass die Sequenz bei jedem Programmaufruf wieder bei 1 anfangen soll.

    Das habe ich nun so gelöst:
    PHP-Code:
    exec sql drop sequence seq_zaehler;
    exec sql create sequence seq_zaehler start with 1 increment by 1 no maxvalue order
    Es funktioniert, aber ist es auch eine gute Idee?

    Nochmals vielen Dank an euch!
    Markus

  11. #35
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Einfacher gehts mit

    ALTER SEQUENCE
    MySequence RESTART

    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. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. Auto increment; wie Startwert und Schrittweite definieren?
    By deni87991 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 14-08-06, 12:05
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. Identity Colum / Auto increment selbst erzeugen?
    By scoobydoo in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 25-11-05, 10:40

Berechtigungen

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