12B - A Reporting Framework for Plex and 2E

beansproutscompleteSoftware and s/w Development

Dec 13, 2013 (3 years and 11 months ago)

67 views

3rd Annual Plex/2E
Worldwide Users
Conference

12B
-

A Reporting
Framework for
Plex and 2E

Mark Murphy

STAR Base
Consulting, Inc.

2

Bio

>
Mark Murphy

>
STAR BASE Consulting, Inc.

>
Cincinnati, OH

>
Started with AS/400 and 2E in 1989

>
Using Plex since 1997

>
Experience in Warehousing, Distribution, Retail,
Manufacturing and Business Services markets

3

Overview

Scenario:

Your company has several locations across the US, and all
your sales history is stored in a single file. Corporate wants to be able
to generate sales reports with the ability to select the effective dates,
sort order, and summary level.

The Good News:

You can do this easily in Plex or 2E, and the
performance can even be good.

The Approach:

By extracting the data to be reported on into a
temporary file, and then printing the report from there you can
simplify your code, and improve your performance.

4

Overview (continued)

Start
Running in
Batch
Display
Prompt
Prompt
Successful
End
Build
Temporary
Files
Extract
Data
Print
Report
Submit
Report to
Batch
No
Yes
No
Yes
5

The Components

>
A Work File

>
A Data Queue

>
Four Programs


A Control Program


A Prompt Program


An Extract Program


A Report Program

6

The Work File

>
Known By 5
-
10 text fields named Key 1, Key 2, … , Key n

>
Refers to the file being reported on (e.g. Sales History)

>
Needs only standard views to allow sorting report in any
order requested

7

The Data Queue

>
Used to communicate from the interactive job to the batch job

>
Keyed data queue used to allow multiple jobs to use it
simultaneously

>
Helps me deal with long parameter strings


CRTDTAQ DTAQ(PARMDQ) MAXLEN(128)
FORCE(*YES)
SEQ(*KEYED) KEYLEN(12)

AUTORCL(*YES)

TEXT('Job parameter data queue')

8

The Programs

>
CL to control the Job


required

>
RPG to prompt for parameters


optional

>
RPG to extract records


optional

>
RPG to print report


required

>
The report will run in batch, and the CL is self submitting

9

A Quick Refresher

>
When you submit a job, a request message is placed on the job
queue that is processed by a program selected from the routing
table.

>
A request message is a plain text string.

>
If the command being submitted is a CALL, rather than a
custom command, parameters are literals.

>
Numbers passed as packed(15 5)

>
Everything else treated as a character string that is at least 25
characters long (only 25 characters guaranteed to be cleared)

10

The Job Control Program

RTVJOBA TYPE(&INTER) NBR(&JOBN)

RTVSYSVAL SYSVAL(QTIME) RTNVAR(&TIME)



/* Interactive portion of program */


IF COND(&INTER *EQ '1') THEN(DO)


/* *** Insert call to Prompt program */


IF COND(&RTNCDE *EQ ' ') THEN(DO)



/* Load long parameter in data queue */


CHGVAR VAR(&KEY) VALUE(&JOBN || &TIME)


CHGVAR VAR(&PKEY) VALUE('P' || %SST(&KEY 2 11))


CALL PGM(QSNDDTAQ) PARM(PARMDQ *LIBL &PARMLEN &PARM
&KEYLEN &PKEY)

11

Job Control Program


/* Submit the report */


SBMJOB CMD(CALL PGM(******) PARM(&KEY))


MSGLOOP:


RCVMSG MSGTYPE(*COMP) RMV(*NO) MSGDTA(&MSGDTA) MSGDTALEN(&MSGDTALEN) +

MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGFLIB)


IF COND(&MSGID *EQ ' ') THEN(GOTO CMDLBL(DONE))


IF COND(&MSGID *EQ CPC1221) THEN(DO)


SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) MSGDTA(%SST(&MSGDTA 1



&MSGDTALEN))


ENDDO
/* Message Received */


GOTO CMDLBL(MSGLOOP)


DONE:

ENDDO
/* Prompt Return Code = *BLANK */



/* Send message if report cancelled by user */

ELSE CMD(DO)
/* Report cancelled by user */


SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Report cancelled by user')

ENDDO
/* Report cancelled by user */

12

The Job Control Program


/* End of interactive section */

GOTO CMDLBL(OUT)

ENDDO



/* Batch portion of program */



/* Get long parameter from data queue */

CHGVAR VAR(&PKEY) VALUE('P' || %SST(&KEY 2 11))

CALL PGM(QRCVDTAQ) PARM(PARMDQ *LIBL &PARMLEN &PARM &WAIT EQ &KEYLEN
&PKEY &SNDRLEN &SENDER)




/* Build Temporary files in QTEMP */


/* *** Insert call to Extract program */


/* *** Insert call to Print program */



OUT:

ENDPGM

13

Prompt Program

>
This program is a UI function with no database IO
function

>
2E: Prompt Record

>
Plex OBASE: Process instance UI

>
Plex Patterns: UIBASIC
\
Input

14

Extract Program

>
A fairly simple program scoped against an appropriate view to
make the extract easy

>
2E: Retrieve object wrapped in an Execute external function

>
Plex OBASE: Process some instances

>
Plex Patterns: ProcessGroup


>
Writes records to be printed to the Work File

15

Print Program

>
Built over Work File

>
Approach


Read record from the Work file


Chain out to get any other data necessary (Work file only has
keys)


Print record

>
2E: Print file

>
Plex OBASE: Custom Template based on Print Key Break
Report

>
Plex Patterns: Same as OBASE (no report pattern in this
library)

16

The Report Pattern
-

Plex

>
Report patterns exist only in
OBASE

>
I prefer Business Entity.Standard
functions.Print key break report

>
BUT, headings do not print
properly on page breaks

>
Create an unscoped copy of the
function

>
Add an extra edit point in the
Process overflow subroutine

>
If you use the Patterns library
instead of OBASE


Include OBASE in your model
and then make the copy


Create a copy from scratch

17

Resources

E
-
mail:
mmurphy@starbaseinc.com

Phone: (513) 245
-
0400

The Edge: edgeusergroup.pugmarks.net

Plex Wiki: wiki.plexinfo.net

2E Wiki: wiki.2einfo.net

18

Synopsis

SQL support for iSeries development in Plex, and for that
matter 2E is limited at best, and designing reports that
perform acceptably can be a daunting task when the
requirements are complex.


This framework provides a way
to easily develop high performance reports for your iSeries
without the need for creating a lot of extra access paths to
support your reports.