View Full Version : Sfl-Satz löschen, declare global temporary table im SQL
dschroeder
08-01-15, 11:09
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
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.
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..
dschroeder
08-01-15, 12:02
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
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
dschroeder
08-01-15, 12:27
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
Warum machst du es nicht so...
dcl-ds s1 likerec(bvsjse1d.sfl1:*all); // Alle Felder von sfl1
dcl-ds save1 likerec(bvsjse1d.sfl1:*all);
save1 = s1;
dschroeder
08-01-15, 12:50
Warum machst du es nicht so...
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
dschroeder
08-01-15, 13:25
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
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/knowledgecenter/SSAE4W_7.1.0/com.ibm.etools.iseries.langref.doc/c0925086758.htm
dschroeder
08-01-15, 13:46
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/knowledgecenter/SSAE4W_7.1.0/com.ibm.etools.iseries.langref.doc/c0925086758.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