PDA

View Full Version : Programmtechnisch feststellen ob eine Bildschirmdatei *DS3 oder *DS4 hat



Seiten : [1] 2

harkne
25-03-22, 10:52
Hallo zusammen,

ich möchte in einem Programm feststellen ob eine Bildschirmdatei im Modus *DS3 oder *DS4 angezeigt wird.
Diese Information erhalte ich z.B. mit einem DSPFD *OUTFILE
Aber gibt es eine Systemtabelle oder ein API was mir das auch liefert?

Danke

DKSPROFI
25-03-22, 11:18
Moin, in der INFDS Stelle 152 - 153 B 0 steht die Anzahl der Zeilen Stelle 154 - 155 B 0 steht die Anzahl der Breite mfg DKSPROFI

Fuerchau
25-03-22, 11:24
Wie sie angezeigt ist, sagt dir das Format, dass geschrieben wird, da ein Format speziell für DS3 oder DS4 geschrieben sein bzw. per Bezugszahl DS3/DS4 aktivert sein muss.
Um festzustellen, ob ein Device das kann gibts nun 2 Möglichkeiten:

RTVCFGSRC (oder API) des Devices und den Displaytyp abfragen, der 27x132 kann (den Typ kenne ich nicht).
Oder pragmatisch einen Write mit DS4 machen und mit Monitor abfangen.
Kann das Device DS4 kannst du diese Formate verwenden, ansonsten eben nicht.

Arbeitet nun PGM A in DS4 und ruft nun PGM B auf, kannst du den aktuellen Modus leider nicht so einfach feststellen. Man kann zwar per API prüfen, welche DSPF's offen sind, aber leidern nicht feststellen, welches der übergeordneten Programme denn welche DSPF geöffnet hat und welches Format gerade angezeigt wird.

Es gibt zwar noch das SaveScreen-API, https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/QsnSavScr.htm, allerdings kann man leider nicht auf den Puffer zugreifen.

DKSPROFI
25-03-22, 12:26
Wie sie angezeigt ist, sagt dir das Format, dass geschrieben wird, da ein Format speziell für DS3 oder DS4 geschrieben sein bzw. per Bezugszahl DS3/DS4 aktivert sein muss. Um festzustellen, ob ein Device das kann gibts nun 2 Möglichkeiten: RTVCFGSRC (oder API) des Devices und den Displaytyp abfragen, der 27x132 kann (den Typ kenne ich nicht). Oder pragmatisch einen Write mit DS4 machen und mit Monitor abfangen. Kann das Device DS4 kannst du diese Formate verwenden, ansonsten eben nicht. Arbeitet nun PGM A in DS4 und ruft nun PGM B auf, kannst du den aktuellen Modus leider nicht so einfach feststellen. Man kann zwar per API prüfen, welche DSPF's offen sind, aber leidern nicht feststellen, welches der übergeordneten Programme denn welche DSPF geöffnet hat und welches Format gerade angezeigt wird. Es gibt zwar noch das SaveScreen-API, https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/QsnSavScr.htm, allerdings kann man leider nicht auf den Puffer zugreifen. Moin, persönlich finde ich aber angenehmer abzufragen ob das Feld 27 oder 24 enthält, bzw das andere Feld 80 bzw 132. mfg DKSPROFI

harkne
25-03-22, 14:01
Ich benutze schon QsnQryyModSup um zu ermitteln ob ich 27x132 kann. Jetzt wollte ich es zentral in unser Menüprogramm machen ob die Bildschirmdatei des aufzurufenden Menüprogramms 27x132 anzeigen möchte. Damit ich dann eine Fehlermeldung ausgeben kann. D.h. ich bin vor dem Programm das eine Bildschirmdatei verwendet. Ich kenne das Programm und die Bildschirmdatei die verwendet wird zu diesem Zeitpunkt, ich muss nur noch an dieser Stelle prüfen ob die Bildschirmdatei *DS4 hat. Sozusagen brauche ich den DSPFD. Den dort steht das. Außer jemand weiß was anderes.

Fuerchau
25-03-22, 14:14
Warum soll nicht jedes Programm selber versuchen, DS4 auszugeben und wenn es nicht klappt DS3 zu nehmen?
Das Problem ist ja sogar, wenn ich an einem DS3-Terminal bin, kann ich eine DSPF, die DS4 enthält gar nicht erst öffnen!
Ein Programm muss im Zweifel also sogar 2 DSPF's alternativ bedienen können, da das mit OVRDSPF nicht klappen kann.

Ich habe das dann einsprechend in RPGIII mit

40 EXFMTDS3FMT
N40 EXFMTDS4FMT

durchgeführt um den Rest der Logik beizubehalten.
Das funktioniert allerdings nur, wenn von der Logik die Anzahl E/A-Felder passen.

Wobei ich mich frage: Gibts denn noch Twinax-Terminals, die noch verwendet werden?
Seit den Emulatoren (PCSupport ca. 1992) können alle DSP's inzwischen 27*132, wenn nicht ist das nur ein Konfigurationsfehler.

harkne
25-03-22, 14:35
Ich habe viele 27x132 Programme. Ich werde nicht jedes Programm ändern. Aber ich kann im Menü prüfen ob der Benutzer 27x132 eingestellt hat und wenn nicht und er will ein Programm aufrufen das 27x132 anzeigen will kommt eine Fehlermeldung

Fuerchau
25-03-22, 14:47
Beim Aufruf bekommt das Programm ja einen Fehler und wird i.d.R. abgebrochen, da der Open scheitert.
Diese Nachricht per SYSRPYLE auf Abbruch stellen und den Job automatisch antworten lassen.
Im Menüprogramm mit Monitor den Aufruf überwachen und bei Abbruch die Meldung überprüfen und entsprechend hinweisen.

Alternativ würde ich eher folgendes machen.
Jeder Dialogjob hat ja ein Startprogramm über das die Umgebung eingerichtet wird.
Dieses ruft ein Mini-Progrämmchen auf, das eine DS4-Datei öffnet.
Dann kannst du dir in der *LDA oder sonstwo (SQL-Sessionvariable) eben merken, ob der Bildschirm das kann und vor dem Aufruf dem Benutzer den Hinweis geben oder den Menüpunkt gar nicht erst anbieten.
Denn ob du den Programmaufruf vorher prüfst, da du Programm und DSPF kennst, oder die Menüauswahl verbirgst/deaktivierst ist vom Aufwand ja vergleichbar.

prsbrc
28-03-22, 07:36
Guten Morgen.
Diese Information habe ich auch mla gebraucht.
Ich habe dies folgendermaßen gelöst:


D WSDS DS QUALIFIED
D DspSize *SIZE
D Device 197 206


Und vor dem Write/ExFmt:


Post(E) WSDS.Device RECFORMAT;
SetDS4 = (WSDS.DspSize > 1920);


Wenn wenn das Format größer 1920 (80x24) ist muss es 132x27 sein.

Fuerchau
28-03-22, 08:13
Dafür musst du die Datei aber erst mal geöffnet haben.
Unterstützt das Terminak das nicht, scheiterst du bereits beim Open und die INFDS wird nicht gefüllt.
Machst du auch noch einen Autoopen kannst du das nur beim rufenden Programm überwachen.