PDA

View Full Version : Bildschirminhalt auslesen



Helmut
06-04-05, 14:48
Hallo zusammen,

Habe folgendes Problem: möchte gerne ein Programm schreiben, dass per Knopfdruck Daten aus dem angezeigten Bildschirm (DSPF 5250-Emulation) ausliest und zur weiteren Verarbeitung zur Verfügung stellt. Habe die API QDFRTVFD gefunden ist dies der richtige Weg oder geht es einfacher? Kann mir da jemand vielleicht hierzu ein Beispiel zukommen lassen, scheint ja echt kompliziert zu sein?

Vielleicht hat ja jemand sowas schon mal realisiert und kann mir weiter helfen. Wäre echt super!

Danke und Gruß
Helmut

Fuerchau
06-04-05, 14:54
Dieses API liefert die Beschreibung des Bildschirmes und nicht den Inhalt (RTVCFGSRC).

Das richtige API ist "QsnReadScr"
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/info/apis/QsnReadScr.htm

Allerdings erhältst du den aktuellen 5250-Datenstrom incl. aller Attribute usw. den du dann analysieren musst.

kuempi von stein
06-04-05, 15:38
Hallo zusammen,

Habe folgendes Problem: möchte gerne ein Programm schreiben, dass per Knopfdruck Daten aus dem angezeigten Bildschirm (DSPF 5250-Emulation) ausliest und zur weiteren Verarbeitung zur Verfügung stellt. Habe die API QDFRTVFD gefunden ist dies der richtige Weg oder geht es einfacher? Kann mir da jemand vielleicht hierzu ein Beispiel zukommen lassen, scheint ja echt kompliziert zu sein?

Vielleicht hat ja jemand sowas schon mal realisiert und kann mir weiter helfen. Wäre echt super!

Danke und Gruß
Helmut
ein quickie auf befehlsebene ist noch STRCPYSCN ....
da kommen aber viele nicht klar mit.
vermutlich weil sie nicht wissen wie man den wieder beendet bzw. weil der immer einen tastendruck "hinterher" hängt...
ist aber manchmal für ne ferndiagnose genügend...

k.

TARASIK
06-04-05, 15:41
Hallo Helmut,
vielleicht hilft Dir dies:

Simple screen capture
Nick Hobson
22 Apr 2002
Rating: -3.93- (out of 5)

Here is a simple technique for capturing the information on a screen and using it in a program.

My motivation for developing the program below was to save typing when using the STRSRVJOB command. I have recently had to debug many batch jobs. After having issued WRKJOB and typed "STRSRVJOB 123456/USERNAME/JOBNAME" a hundred times, I thought there must be some time-saving technique.

The program below is designed to be invoked from the WRKJOB screen. This screen displays the job number, user, and job name; all required by many job-related commands, such as STRSRVJOB. The program works by capturing the screen image (using the Dynamic Screen Manager APIs), extracting the required job details, and invoking the appropriate command.

The actual command string to be invoked is passed to the program by one of a number of commands. Command SRV passes the string 'STRSRVJOB'. Command PRTLOG passes the string 'DSPJOBLOG OPTION(*OUTPUT)'. The range of job-related commands could easily be extended. Indeed, almost any command could be invoked, given an appropriate screen to capture.



Code


Program GETSCR:

H Dftactgrp(*NO)
H BndDir('QSNAPI')

* Dynamic Screen Manager prototypes...
* Create input buffer:
D CrtInpBuf pr 10i 0 Extproc('QsnCrtInpBuf')
D InitSize 10i 0 Const
D Increment 10i 0 Const Options(*OMIT)
D Maximum 10i 0 Const Options(*OMIT)
D InpBufHnd 10i 0 Const Options(*OMIT)
D ErrorCode 272 Options(*OMIT)
* Read screen without requiring AID key:
D ReadScreen pr 10i 0 Extproc('QsnReadScr')
D NoBytes 10i 0 Options(*OMIT)
D InpBufHnd 10i 0 Const Options(*OMIT)
D CmdBufHnd 10i 0 Const Options(*OMIT)
D EnvHnd 10i 0 Const Options(*OMIT)
D ErrorCode 272 Options(*OMIT)
* Retrieve pointer to buffer data:
D RtvDtaPtr pr * Extproc('QsnRtvDta')
D InpBufHnd 10i 0
D Data * Options(*OMIT)
D ErrorCode 272 Options(*OMIT)
* Delete buffer:
D DltBuf pr 10i 0 Extproc('QsnDltBuf')
D BufHnd 10i 0
D ErrorCode 272 Options(*OMIT)

D JobCommand s 32
D BufHnd s 10i 0
D NoBytes s 10i 0
D ReturnCode s 10i 0
D Screen ds Based(BufPtr)
D JobName 169 178
D JobUser 192 201
D JobNo 217 222
D SelName s Like(JobName)
D SelUser s Like(JobUser)
D CmdStr s 66
D CmdLen s 15 5 Inz(%Size(CmdStr))

C *Entry Plist
C Parm JobCommand

* Create input buffer.
C Eval BufHnd = CrtInpBuf (%Size(Screen) : *OMIT :
C *OMIT : *OMIT : *OMIT)
* Read screen.
C Eval NoBytes = ReadScreen (*OMIT : BufHnd :
C *OMIT : *OMIT : *OMIT)
* Retrieve pointer to buffer data.
C Eval BufPtr = RtvDtaPtr (BufHnd : *OMIT : *OMIT)
* Build Command string.
C x'00':' ' Xlate JobName SelName
C x'00':' ' Xlate JobUser SelUser
C Eval CmdStr = JobCommand + ' JOB(' +
C JobNo + '/' +
C %Trimr(SelUser) + '/' +
C %Trimr(SelName) + ')'
* Delete buffer.
C Eval ReturnCode = DltBuf (BufHnd : *OMIT)
* Execute command against job.
C Call 'QCMDEXC'
C Parm CmdStr
C Parm CmdLen

C Return
The commands below should be created to invoke the program above:

Command SRV:

CMD PROMPT('Start Service Job')
PARM KWD(COMMAND) TYPE(*CHAR) LEN(32) +
CONSTANT(STRSRVJOB)

Command PRTLOG:

CMD PROMPT('Print Job Log')
PARM KWD(COMMAND) TYPE(*CHAR) LEN(32) +
CONSTANT('DSPJOBLOG OPTION(*PRINT)')

Robi
06-04-05, 16:15
Rufe aus deiner Anwendung bei Bedarf dieses CL:



PGM PARM(&PGMNAME &DSPNAME &DSPFMT)

DCL VAR(&SCREENDATA) TYPE(*CHAR) LEN(3564)
DCL VAR(&DSPNAME) TYPE(*CHAR) LEN(8)
DCL VAR(&PGMNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&DSPFMT) TYPE(*CHAR) LEN(10) DCLF FILE(SCR_SHOT) RCDFMT(SCRFMT)

OVRDSPF FILE(SCR_SHOT) TOFILE(SCR_SHOT1) LVLCHK(*NO)

CHGVAR VAR(&R1DATA1) VALUE(X'00021518730462')

SNDRCVF RCDFMT(SCRFMT)

CHGVAR VAR(&SCREENDATA) VALUE(&R1DATA1 *CAT &R1DATA2)

CALL PGM(SCR_SHOT) PARM(&PGMNAME &DSPNAME &DSPFMT &SCREENDATA)

ENDPGM
Es arbeitet mit diesem Bildschirm SCR_SHOT

A R SCRFMT
A OVERLAY CLRL(*NO)
A R1DATA1 1782 B 1 2
A R1DATA2 1782 B 1 2



Bau dir ein SCR_SHOT pgm das in &screendata den BS-Inhalt hat

Wir drucken so hardcopy's mit 'echten window-ramen' aus nem grünen Schirm

Gruß Robi

jo400
07-04-05, 08:39
Hallo Robi,

ich habe das CL-Programm ausprobiert, habe aber das Problem, das die DSPF SCR_SHOT1 nicht bekannt ist. Wie muss ich die definieren?

Was haben den die HEX-Werte in dem Feld R1DATA1 für eine Bedeutung?

Vielen Dank für deine Hilfe.

Jo

Robi
07-04-05, 08:46
oh, hatte ich vergessen

scr_shot1

A DSPSIZ(*DS3 *DS4)
A R SCRFMT USRDFN
*
A R SCRFMT01
*
A FILLER1 1782 B 1 2
A FILLER2 1782 B 1 2


Die sorgen dafür, das das 'Bild' fotogrfiert wird bzw machen ein 'DatFrei'.

(is nich meine erfindung, hab ich aus ner amerikanischen NG vor über 5 Jahren)
poste ob's geklappt hat
viel erfolg
Robi

Helmut
18-04-05, 11:52
Hallo zusammen,
erstmal vielen Dank für die Tipps zu meinem Problem. Habe es
in der Zwischenzeit auch schon geschafft ein Programm über
die API zu erstellen, dass meinen Bildschirm ausliest und weiterverarbeitet.

Diese Funktion möchte ich nun gerne aus meiner 5250 Client-Access-Sitzung per Button aufrufen, ist sowas möglich? Bin
schon fast am Verzweifeln, da ich kein Programm aus Client-Access auf der AS400 starten kann. Über RMTCMD bekomm ich einen Abbruch, da der Screen der aktuellen Sitzung für die
API nicht greifbar ist. Funktioniert sowas über ein Makro oder
VB-Skript? Leider habe ich hierüber keine Ahnung. Hat vielleicht schon jemand so einen Aufruf eingebaut und kann eventuell ein Beispiel (Code) nennen?

Würdet mir echt weiterhelfen. Vielen Dank schonmal und
Grüße Helmut

Fuerchau
18-04-05, 12:34
Vielleicht hilft dir ja das Schlüsselwort ASSUME auf dem Satzformat als auch RSTDSP(*NO) beim Erstellen der Displayfile.
Dann geht das System vielleicht davon aus, dass deine Daten bereits auf dem Schirm stehen.