View Full Version : AS400 - Window verschwindet
Da ist mir ggf. noch was eingefallen.
Wenn dem ggf. unbekannten übergeordneten Programm geholfen werden soll, kann auch folgendes API helfen:
http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/apis/qwssprst.htm?lang=de
Vorgehensweise:
- Sichern des Bildschirminhaltes
- Darstellen der Fenster mit USRRSTDSP
- Wiederherstellen des gesicherten Inhaltes
Lieber Fuerchau
Nochmals vielen Dank. Wie ich bereits sagte, habe ich das jetzt so gelöst, dass ich nur noch ein Fenster habe und es funktioniert. Sobald ich wieder etwas Luft habe, werde ich Deine Ratschläge ausprobieren.
Schönen Tag noch
Günter
Jetzt habe ich noch eine Frage
Ich muss aus meinem Cobol-Programm direkt via SQL lesen (weil ich via set-connect) in eine andere Systemumgebung gehe. Das habe ich so gelöst, dass ich das in einem Unterprogramm mache. Dort habe ich zwei Funktionen:
1. Aufsetzen bei einem bestimmten Key
EXEC SQL DECLARE CRSCTNO CURSOR FOR
SELECT
T01.SHORTN,
T01.CTNO,
T01.NAMPA1
FROM VMKJF25001 T01
WHERE T01.SHORTN >= :SQL-SHORTN
FOR FETCH ONLY
END-EXEC.
2. Sequentielles witerlesen ab dem vorherigen KEY SQL-SHORTN
Im vorherigen Cobol war dort einfach
READ VMKJF25001 NEXT
AT END MOVE 1 TO EOF
Nun meine Frage: wie schaut den dieser Befehl im SQL aus, existiert dort in "Read next*
Vielen Dank für Deine Hilfe
Günter
Nun da musst du mal ins SQL-Programmierhandbuch schauen.
Kurz nur soviel:
"declare ... Cursor " definiert einen Cursor, entspricht also dem COBOL-Select.
Nun machst du nur noch
open cursorname
fetch Cursorname into ....
Close cursorname
Da du auch noch zu einer anderen DB willst benötigst du einen
exec SQL connect ....
mit RDB-Namen, User und Kennwort.
Um zu Connecten benötigst du per WRKRDBDIRE den DB-Namen des Zielsystems.
Host-Variablen müssen in COBOL zwischen exec SQL begin declare section end-exec und exec SQL end declare section end-exec eingebettet werden.
Ggf. musst du per CRTSQLPKG die SQL's für das Zielsystem extrahieren wenn dies nicht automatisch passiert.
KingofKning
20-02-15, 20:10
Er hat es in einem alten Thread auch nochmal etwas ausführlicher beschrieben.
http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/19380-COBOL-embedded-SQL?highlight=cobol+sql
Wobei ich Deine Konstruktion nicht wirklich verstanden habe.....
GG
Hallo Fuerchau
Ich hatte Dir Gestern Abend noch ein mail an Deine Web-Adresse gesandt, aber klar, ist ja Wochenende. Ich bin weitergekommen, aber habe immer noch ein Problem:
Wie gesagt, ich habe nun einen Cursor gesetzt für das Positionieren:
EXEC SQL
DECLARE CRSCTNO CURSOR FOR
SELECT
T01.SHORTN,
T01.CTNO,
T01.NAMPA1
FROM VMKJF25001 T01
WHERE T01.SHORTN >= :SQL-SHORTN
FOR FETCH ONLY
END-EXEC.
Der funktioniert auch prächtig, d.h. ich bekomme den ersten, der grösser/gleich dem SQL-SHORTN ist.
Nun muss ich ab dieser Position weiterlesen. Wenn ich nun einen zweiten Cursor für dieses Weiterlesen definiere
EXEC SQL
DECLARE NXTCTNO CURSOR FOR
SELECT
T02.SHORTN,
T02.CTNO,
T02.NAMPA1
FROM VMKJF25001 T02
ORDER BY SHORTN
FOR FETCH ONLY
END-EXEC.
bekomme ich durch den ORDER BY den ersten der DB, aber nicht den nächsten von dem, den ich mit dem ersten Cursor gelesen habe.
Auch wenn ich den zweiten Cursor mit der WHERE analog dem ersten Cursor ergänze, ändert das nichts, er beginnt wieder vom Anfang der DB, so als ob der ORDER "stärker" als der "WHERE" wäre.
Hättest Du evtl. eine Lösung?
LG Günter
?
Der zweite Cursor hat ja keinen Bezug zum ersten.
However, wenn ich Deine Frage richtig verstehe, dann benötigst Du nur den zweiten(!) Cursor, da muss das WHERE und ORDER BY angegeben sein und Du kannst alle gewünschten Sätze nacheinander einlesen.
Wenn das nicht funktioniert, hast Du irgendwo einen anderen fehler!
Wieso einen 2. Cursor?
Du musst folgendes vergleichen:
DECLARE MYCURSOR FOR ... = SELECT in Cobol
OPEN MYCURSOR = OPEN in Cobol + START
FETCH = Read next in Cobol
CLOSE = CLOSE in Cobol
In Native IO würdest du doch auch nicht ständig Open/Start/Read/Close machen oder?
Genauso ist das in SQL.
1 mal OPEN
n mal FETCH
1 mal CLOSE
Hier kommt dann die Variable SQLCODE ins Spiel (les doch mal das Handbuch!).
SQLCODE = ZERO => immer alles OK
SQLCODE = 100 => entspricht READ ... AT END ...
SQLCODE < ZERO => entspricht Filestatus, Fehler mit Abbruch in den SQL's
SQLCODE > ZERO => entspricht Filestatus, Fehler mit Warnung in den SQL's, weitermachen möglich
Hallo miteinander
Also ich habe jetzt auf nur noch einen Cursor umgestellt.
EXEC SQL
DECLARE CRSCTNO CURSOR FOR
SELECT
T01.SHORTN,
T01.CTNO,
T01.NAMPA1
FROM VMKJF25001 T01
WHERE T01.SHORTN >= :SQL-SHORTN
ORDER BY SHORTN
FOR FETCH ONLY
END-EXEC.
Dann rufe ich diesen Cursor auf und bereits beim ersten Aufruf bringt er mir nicht den ersten, der grösser als das SQL-SHORTN ist, sondern den ersten, der vorhanden ist (a, etc). Wenn ich den ORDER BY wegnehme, bringt er mir den gewünschten, aber die nachfolgenden halt nicht in der Reihenfolge des SHORTN
Ich habe das alles mit Displays entsprechend dokumentiert
Noch etwas
Ich bin ja Pragmatiker, d.h. ich habe jetzt einen Loop eingebaut, dass er selbst bis auf den gewünschten liest, erst dann beginnt meine eigentliche Verarbeitung. Das funktioniert auch soweit, obwohl es natürlich nicht schön ist. Wenn ich dann aber auf einen Wert selektieren möchte der vor der aktuellen Position liegt, funktioniert das wieder nicht, lediglich die Selektion auf einen Wert grösser als die momentne Position funktioniert. Ich könnte jetzt natürlich bei einem Wert kleiner als meine Position einen Close und Open machen, denke, dann geht es auch wieder, aber irgendwie sehr unschön !!!!!