[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.120

    Sfl-Satz löschen, declare global temporary table im SQL

    Hallo,

    ich möchte einen Datensatz in einer Subfile löschen bzw. auch an bestimmter Stelle in die Sfl einfügen. Da delete auf einer Sfl nicht zulässig ist, bleibt mir wohl nichts anderes übrig, als die Sfl komplett zu sichern, dann zu leeren und dann neu aus der Sicherung zu füllen (natürlich dann ohne den zu löschenden Satz).

    Ich habe eben gesehen, dass es in SQL die Möglichkeit gibt, eine sogenannte temporary table zu erzeugen. Sieht für mich so aus, als wäre das einfach eine Tabelle in der QTEMP. Im Handbuch steht, eine solche Tabelle würde für den "current application process" gelten. Was soll das sein? Ist das der Job? Ich benötige die Tabelle nicht global in meinem Job, sondern nur für mein Programm. Muss ich die Tabelle dann bei Programmeende wieder aufräumen?

    Gibt es überhaupt einen Vorteil gegenüber einer "manuell" in der Qtemp erzeugten Tabelle?

    Dieter

  2. #2
    Registriert seit
    Apr 2005
    Beiträge
    385
    Ich löse sowas in der Regel über programminterne Datenstrukturen. Ist performanter und du kannst bei richtiger Definition sogar das SFL dann nach jedem Feld sortieren, löschen ....

    So z.B.

    Code:
     D                 DS                                                     
     D ZDSFL                        190    DIM(9999)                          
     D ZDFLD1                         2    OVERLAY(ZDSFL:*NEXT) INZ(*HIVAL)  
     D ZDFLD2                         6    OVERLAY(ZDSFL:*NEXT) INZ(*HIVAL)  
     D ZDFLD3                         6    OVERLAY(ZDSFL:*NEXT) INZ(*HIVAL)  
     D ZDFLD4                         9  0 OVERLAY(ZDSFL:*NEXT) INZ(*HIVAL)
    Dann kannst du SORTA ZDFLD2 machen und Zack wäre das SFL sortiert nach der 2 Spalte...

    Also lesen per SQL/READ und füllen der DS und die DS Seitenweise /Komplett ins SFL stellen..

  3. #3
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Vielen Dank. Das habe ich früher auch so gemacht. Aber unsere Subfiles sind grafische Anwendungen (realisiert über ProfoundUI). Technisch verhalten sie sich fast wie normale Subfiles. Profound unterstützt lange Feldnamen. Deshalb lesen wir Bildschirmdaten in Record-Datenstrukturen ein:

    // Qualifizierte Datenstrukturen für Bildschirm-Handling:
    dcl-ds f1 likerec(bvsjse1d.fmt1:*all); // Alle Felder des normalen Formates
    dcl-ds s1 likerec(bvsjse1d.sfl1:*all); // Alle Felder von sfl1

    Das heißt, der Zugriff auf einen SFL-Satz sieht folgendermaßen aus:

    chain i bvsjse1d.sfl1 s1;

    Dabei wird der gesamte SFL-Satz in die Struktur s1 übertragen. Ich möchte genau diese Struktur sichern und nicht alle Felder einzeln.
    Deshalb dachte ich an folgende Tempdatei.

    // Tempdatei erzeugen / überschreiben:
    exec sql declare global temporary table sfl1temp
    (tmp_satznr decimal(5),
    tmp_daten char(32000)
    ) with replace;

    (Sortierungen kann der User direkt durch Anklicken auf eine Spalte durchführen. Das müssen wir gar nicht programmieren.)

    Nochmal meine Frage: Welchen Scope hat so eine Tempdatei? Muss ich sie nach Programmende selber aufräumen? Gibt es überhaupt einen Unterschied zu einer "manuell" erstellten Datei in QTEMP?

    Dieter

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Global Temporary Tables sind Tabellen die auf Job-Ebene (deshalb global!) gelten und nicht nur auf Programm-Ebene.
    Im Prinzip nichts anderes als eine Tabelle in der QTEMP, nur halt in der "SQL"-Welt. Im SQL-Standard ist die QTEMP unbekannt. Global Temporary Tables werden mit SESSION qualifiziert.
    Der Unterschied liegt m.E. nur darin, dass beim Erstellen von Global Temporary Tables nicht versucht wird die Tabelle in irgendeinem Journal zu registrieren.

    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

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Vielen Dank Birgitta. Genauso habe ich es mir gedacht (bzw. befürchtet). Nochmal eine kurze Frage: Ich versuche gerade, eine mit likerec deklarierte Struktur in einen langen String zu schieben:
    dcl-f bvsjse1d workstn handler('PROFOUNDUI(HANDLER)') alias qualified
    sfile(sfl1:f1.s1_satznr);

    dcl-ds s1 likerec(bvsjse1d.sfl1:*all); // Alle Felder von sfl1
    dcl-s daten char(32000);
    daten = s1;

    Es sieht für mich so aus, als würde nur das erste Unterfeld von s1 übertragen.

    Muss ich extra eine weitere Struktur definieren, in der ich s1 als Unterfeld habe?


    Dieter

  6. #6
    Registriert seit
    Apr 2005
    Beiträge
    385
    Warum machst du es nicht so...

    Code:
    dcl-ds   s1 likerec(bvsjse1d.sfl1:*all);       // Alle Felder von sfl1
    dcl-ds   save1 likerec(bvsjse1d.sfl1:*all);
     
    save1 = s1;

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Zitat Zitat von ExAzubi Beitrag anzeigen
    Warum machst du es nicht so...

    Code:
    dcl-ds   s1 likerec(bvsjse1d.sfl1:*all);       // Alle Felder von sfl1
    dcl-ds   save1 likerec(bvsjse1d.sfl1:*all);
     
    save1 = s1;
    Weil save1 in ein Datenbankfeld in meiner temporären Tabelle geschoben werden muss. Ich will mir ja gerade ersparen, alle SFL-Felder einzeln in einer Datenbanktabelle zu definieren. Ich möchte stattdessen, den gesamten Datensatz aus der Subfile in einem langen Feld der Datenbanktabelle speichern. Wenn ich das so definiere, wie du vorschlägst, haben ich ja wieder eine (qualifizierte) Struktur.

    Dieter

  8. #8
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Im Moment komme ich nicht so recht weiter. Mein Problem lässt sich jetzt auf folgende Fragestellung reduzieren:
    Ich habe eine qualifizierte Datenstruktur s1. Diese möchte ich "am Stück" in ein langes Stringfeld schieben. Weiß jemand, wie das im free format geht?

    Dieter

  9. #9
    Registriert seit
    Apr 2005
    Beiträge
    385
    Sorry Fehler meinerseits...

    Um zwei qualifizierte Datenstrukturen "gleichzusetzen" kann du den Befehl "eval-corr" benutzen

    Sollte eigentlich für deine zwecke zu gebrauchen sein

    Hier der Link zur Beschreibung
    http://www-01.ibm.com/support/knowle...0925086758.htm

  10. #10
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Zitat Zitat von ExAzubi Beitrag anzeigen
    Sorry Fehler meinerseits...

    Um zwei qualifizierte Datenstrukturen "gleichzusetzen" kann du den Befehl "eval-corr" benutzen

    Sollte eigentlich für deine zwecke zu gebrauchen sein

    Hier der Link zur Beschreibung
    http://www-01.ibm.com/support/knowle...0925086758.htm
    Nein, leider nicht. Ich will ja gerade NICHT 2 qualifizierte Datenstrukturen gleichsetzen. Ich will eine qualifizierte Datenstruktur in ein Alphafeld char(32000) schieben!

    Dieter

  11. #11
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    So, ich konnte mein Problem jetzt folgendermaßen lösen:

    dcl-ds datenDS;
    tempStr char(32000) pos(1);
    tempDS like(s1) pos(1);
    end-ds;

    chain i bvsjse1d.sfl1 s1;
    tempDS = s1;

    ==> Danach steht in tempStr der volle String mit allen Daten von s1.

    Danke an alle für die Tipps.

    Dieter

Similar Threads

  1. SQL Update Satz in Abhänigkeit vom Folgesatz
    By malzusrex in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 20-11-14, 14:47
  2. Antworten: 40
    Letzter Beitrag: 03-11-14, 09:15
  3. SQL Table etc....
    By mk in forum NEWSboard Programmierung
    Antworten: 20
    Letzter Beitrag: 16-12-13, 12:11
  4. Satz in Datenbankdatei in CL schreiben??
    By JonnyRico in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 02-04-03, 15:52
  5. Subfile auf letztem bearbeiteten Satz aufsetzen
    By Fertig in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 21-02-03, 11:28

Berechtigungen

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