Tip

Simple screen capture

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.


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

==================================
MORE INFORMATION ON THIS TOPIC
==================================

The Best Web Links: tips, tutorials and more.

Ask your programming questions--or help out your peers by answering them--in our live discussion forums.

Ask the Experts yourself: Our application development gurus are waiting to answer your programming questions.

This was first published in April 2002

There are Comments. Add yours.

 
TIP: Want to include a code block in your comment? Use <pre> or <code> tags around the desired text. Ex: <code>insert code</code>

REGISTER or login:

Forgot Password?
By submitting you agree to receive email from TechTarget and its partners. If you reside outside of the United States, you consent to having your personal data transferred to and processed in the United States. Privacy
Sort by: OldestNewest

Forgot Password?

No problem! Submit your e-mail address below. We'll send you an email containing your password.

Your password has been sent to:

Disclaimer: Our Tips Exchange is a forum for you to share technical advice and expertise with your peers and to learn from other enterprise IT professionals. TechTarget provides the infrastructure to facilitate this sharing of information. However, we cannot guarantee the accuracy or validity of the material submitted. You agree that your use of the Ask The Expert services and your reliance on any questions, answers, information or other materials received through this Web site is at your own risk.