[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Update per Sql mit externer Datenstruktur

    Hallo,

    wir haben eine Artikeldatei die als Keyfelder Firmennummer, Datum, und Artikelbezeichnung hat.

    Ich habe jetzt ein Wartungsprogramm geschrieben, wobei ich ein Problem mit Artikel die 2 oder mehrmals am selben Tag gebucht werden.

    Mit Chain auf die Datei bekomme ich ja jedesmal die erste Buchung sodas ich die 2. 3. etc. nie ändern kann.

    Jetzt habe ich einfach seq. in der Datei weitergelesen bis das Erstellungsdatum und Uhrzeit(6 stellig) übereinstimmt.
    Aber das Problem ist das Updaten der Datei

    Fortschreiben oder Löschen in Datei ARTIKELP ohne vorherige
    Eingabeoperation (C G D F).

    Da ich ja in MyDs die aktuellen Felder hab, kann ich per Sql im Programm ein update mit MyDs durchführen?
    D MyDS E DS ExtName(ARTIKELP)

    Dank im Voraus

    TARKI

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Die Fehlermeldung beim Update bedeutet ja nur, dass du ohne Sperre (InputFile oder READ ohne Sperre) gelesen hast.

    Natürlich kannst du per SQL updaten, wenn du einen eindeutigen Schlüssel für den Satz hast.
    Bedenke aber, dass ein Update nicht über die Struktur laufen kann. Du musst die Felder dann schon einzeln kodieren:

    update myfile
    set
    F1 = : MyF1
    ,F2 = : MyF2
    :
    where Fx = : MyFx
    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
    Jan 2001
    Beiträge
    850
    Zitat Zitat von tarkusch Beitrag anzeigen
    Hallo,

    wir haben eine Artikeldatei die als Keyfelder Firmennummer, Datum, und Artikelbezeichnung hat.

    Ich habe jetzt ein Wartungsprogramm geschrieben, wobei ich ein Problem mit Artikel die 2 oder mehrmals am selben Tag gebucht werden.

    Mit Chain auf die Datei bekomme ich ja jedesmal die erste Buchung sodas ich die 2. 3. etc. nie ändern kann.

    Jetzt habe ich einfach seq. in der Datei weitergelesen bis das Erstellungsdatum und Uhrzeit(6 stellig) übereinstimmt.
    Aber das Problem ist das Updaten der Datei

    Fortschreiben oder Löschen in Datei ARTIKELP ohne vorherige
    Eingabeoperation (C G D F).

    Da ich ja in MyDs die aktuellen Felder hab, kann ich per Sql im Programm ein update mit MyDs durchführen?
    D MyDS E DS ExtName(ARTIKELP)

    Dank im Voraus

    TARKI

    Hallo,

    Die Fehlermeldung sagt ganz klar:

    Einen Datensatz ändern ohne den Satz vorher zu lesen geht im
    RPG nicht ....................

    Mit Sql geht das da Du dort die Schlüsselfelder
    i.d.R. mit angibst.


    Da musst Du dein Programm wohl noch ändern.

    Gruß
    Michael

  4. #4
    Registriert seit
    Jan 2001
    Beiträge
    850
    Zitat Zitat von mk Beitrag anzeigen
    Hallo,

    Einen Datensatz ändern ohne den Satz vorher zu lesen geht im
    RPG nicht ....................
    Hi,

    na klar kann man Sätze wie auch immer ändern
    RRN etc. .....

    Man sollte aber schon verstehen das im RPG
    erst ein Read / Chain auf einen Satz gemacht werden
    sollte um ihn zu ändern.

  5. #5
    Registriert seit
    Apr 2012
    Beiträge
    360
    Hallo,

    ich habe das Chain durch ein reade ersetzt und bekamm die Meldung.
    Andreas Lösung trifft genau mein Problem.
    Danke und noch einen schönen Abend.

    Grüße

    Tarki

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ich weiß nicht, warum du zusätzlich SQL verwendest, wenn du die Datei doch schon mit RPG öffnest und liest.
    Wenn dir der Key für Datum/Zeit fehlt so lege doch eine LF mit diesem Schlüssel an.

    Auch für den Update per SQL ist ein Index/DDS-LF allein aus Performancegründen schon erforderlich.

    Ein SQL-Update mit " where RRN(File) = nnn " ist der allerschlechteste Weg, da hier grundsätzlich die gesamte Tabelle durchsucht wird, selbst wenn der eigentliche Satz schon längst bearbeitet wurde.
    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 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ein SQL-Update mit " where RRN(File) = nnn " ist der allerschlechteste Weg, da hier grundsätzlich die gesamte Tabelle durchsucht wird
    Das halte ich für ein Gerücht!!
    Die RRN definiert eine eindeutige Zeile in der Tabelle. Da braucht ncht die gesamte Tabelle durchsucht werden.
    Die Datenbank schlüsselt diese Nummer intern auf und greift direkt auf den Satz zu.

    Dennoch würde ich nicht diesen Weg empfehlen, da nicht gewährleistet werden kann, dass der gewünschte Satz:
    *) nicht schon geändert wurde
    *) in der Tabelle plötzlich an einer ganz anderen Stelle steht (REORG)

    lg Andreas

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    Das halte ich für ein Gerücht!!
    Die RRN definiert eine eindeutige Zeile in der Tabelle. Da braucht ncht die gesamte Tabelle durchsucht werden.
    Die Datenbank schlüsselt diese Nummer intern auf und greift direkt auf den Satz zu.
    Andreas,
    auch wenn die Relative Satz-Nr. eindeutig eine Zeile definiert, kann die relative Satz-Nr. vom SQL-Optimizer nicht als Zugriffsweg verwendet werden.
    Relative Satz-Nr. sind NICHT Standard-SQL!

    Zugriffswege können nur über existierende Spalten oder über neue Spalten, die in SQL Indices oder logischen Dateien definiert werden.
    RRN(File) ist bei der Erstellung von neuen Spalten in SQL Indices nicht zulässig.

    Deshalb kann der Optimizer nicht über einen Index-Access zugreifen, sondern muss eine andere Methode wählen. Unter der CQE wurde grundsätzlich ein Table Scan (wie Baldur beschreibt) verwendet, seit SQE kann stattdessen fast immer eine Table Probe verwendet werden, d.h. der Satz wird erst gelesen, wenn er gefunden wurde.
    Table Probes sind zwar um einiges schneller als Table Scans, da die Daten erst gelesen werden, wenn der Satz gefunden wurde, aber dennoch wesentlich langsamer als ein Index Access oder Zugriff über Chain in RPG.

    @Tarkusch,
    wenn Du schon die Datensätze via RPG liest, warum machst Du dann nicht den Update direkt mit RPG?
    Datei als Update-Datei definieren und schon kann man den gelesenen Satz updaten.

    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

  9. #9
    Registriert seit
    Nov 2012
    Beiträge
    51

    Ohne die Datei als Update defniert zu haben, ...

    ... kann er das Programm mit UPDATE gar nicht umwandeln. Klingt eher nach einem No-Lock-Extender bei der Lese-Operation, also CHAIN(N).
    Aber das traute ich mich ob der Trivialität ursprünglich gar nicht schreiben.
    Jetzt schon. :-)

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Deshalb verstehe ich die Diskssion hier auch nicht, "FMYFILE UF K DISK" und gut ist.

    Die Benutzung einer Funktion beim where führt äusserst selten zu einem Direktzugriff.
    Inzwischen kann man für solche Fälle z.T. (z.B. nicht bei RRN) "computed Indizes" verwenden, aber die sind meist doch nicht besonders zu empfehlen.
    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

  11. #11
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Andreas,
    auch wenn die Relative Satz-Nr. eindeutig eine Zeile definiert, kann die relative Satz-Nr. vom SQL-Optimizer nicht als Zugriffsweg verwendet werden.
    Relative Satz-Nr. sind NICHT Standard-SQL!
    Von Zugriffsweg habe ich auch nichts geschrieben. Die DB ermittelt über eine sogenannte "Values List" intern die genaue Adresse.
    Es wird jeden falls nicht zwangsläufig ein Table-Scann durchgeführt ... außer man macht sowas wie ...
    WHERE RRN(t1) > xxx and RRN(t1) < xxx.

    Dass kann man sich auch im Debug oder Visual Explain sehr gut anschauen lassen.

    In Oracle z.B. ist es noch schneller. Dort ist die RRN nicht nur eine fortlaufende Nr. sondern beinhaltet auch gleich die Information wo im Speicher sich der Satz befindet.

    Aber wie schon gesagt, empfehlen würde ich es trotzdem nicht.

    lg Andreas

  12. #12
    Registriert seit
    Jan 2001
    Beiträge
    850
    Bei allem SQL,

    selbst heute gibt es noch Entwickler die Daten über LF's lesen
    und mit der RRN die physische Tabelle schreiben und ändern.


    Gruß
    Michael

    PS:Kenne Leute die Suibfiles mit update geöffnete
    Dateien schreiben

Similar Threads

  1. SQL Update aus zwei Dateien mit 3 Schlüsselfeldern
    By mk in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 13-07-12, 08:53
  2. update per sql
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 25-09-06, 08:22
  3. Update Syntax SQL
    By wuwu in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 18-07-06, 15:31
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. Update per SQL
    By jkuetema in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 09-03-05, 11:58

Berechtigungen

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