[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2002
    Beiträge
    16

    Bildschirminhalt auslesen

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Dieses API liefert die Beschreibung des Bildschirmes und nicht den Inhalt (RTVCFGSRC).

    Das richtige API ist "QsnReadScr"
    http://publib.boulder.ibm.com/iserie...QsnReadScr.htm

    Allerdings erhältst du den aktuellen 5250-Datenstrom incl. aller Attribute usw. den du dann analysieren musst.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Aug 2004
    Beiträge
    923

    bildschirminhalt auslesen

    Zitat Zitat von Helmut
    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.

  4. #4
    Registriert seit
    May 2002
    Beiträge
    2.642

    Screen Capture

    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)')

  5. #5
    Registriert seit
    Jun 2001
    Beiträge
    1.975

    Exclamation Ganz easy

    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

  6. #6
    Registriert seit
    Jan 2003
    Beiträge
    118
    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

  7. #7
    Registriert seit
    Jun 2001
    Beiträge
    1.975

    sorry

    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

  8. #8
    Registriert seit
    Feb 2002
    Beiträge
    16

    Unhappy

    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Message aus MSGF in RPG-ILE auslesen
    By TomWaf in forum NEWSboard Programmierung
    Antworten: 16
    Letzter Beitrag: 24-08-10, 13:47
  2. Datensätze blockweise auslesen
    By Easyrider in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 20-06-08, 06:32
  3. 5250-Masken auslesen
    By anateus in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 23-01-07, 10:35
  4. Mailadresse von User auf Iseries speichern und auslesen
    By linguin in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 22-06-06, 08:39
  5. Spoolattribute zur Seitengröße auslesen?
    By FrankL in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 27-04-06, 14:24

Berechtigungen

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