A1. | Introduction & Overview |
B1. | QuikJob CONVERSION Operating Instructions |
C1. | QuikJob EXECUTION/TESTING Operating Instructions |
QuikJob Conversion code examples - Before, After, & with Manual changes
D1. | Example#1 - simple report (Zip code & Address report) |
D1. | - original QuikJob Mainframe source code |
D2. | - converted to uvcopy (no manual changes required) |
D3. | - converted to uvqrpg, BEFORE manual changes required |
D4. | - converted to uvqrpg, AFTER manual changes required |
E1. | Example#2 - master file update with detail file |
E1. | - original QuikJob Mainframe source code |
E2. | - converted to uvcopy (no manual changes required) |
F1. | Example#3 - master file update in place |
F1. | - original QuikJob Mainframe source code |
F2. | - converted to uvcopy - BEFORE manual changes |
F3. | - converted to uvcopy - AFTER manual changes |
G1. | Example#4 - SORT AREA (RELEASE, RETURN,& record selection) |
G1. | - original QuikJob Mainframe source code |
G2. | - converted to uvcopy (minor manual change required) |
G3. | - converted to uvcopy, AFTER manual changes required |
H1. | Example#5 - SORT FILE (can replace with 'uvsort') |
H1. | - original QuikJob Mainframe source code |
H2. | - converted to uvcopy (but replace with uvsort) |
I1. | Example#6a - INITialize an Indexed file (replace with script makeISF0) |
I1. | - original QuikJob mainframe code |
- replacement 1 line script makeISF0 |
I2. | Example#6b - INITialize an Indexed file with a dummy high key record |
- original mainframe code & replacement UNIX uvcopy code |
J1. | Example#7 - TABLE LOAD & LOOKUP |
J1. | - original QuikJob Mainframe source code |
J2. | - converted to uvcopy |
J3. | - notes re manual changes required & possible enhancements |
K1. | Example#8 - control break report (sort & count accounts to be audited) |
K1. | - original QuikJob Mainframe source code |
K2. | - converted to uvqrpg, BEFORE manual changes required |
K3. | - converted to uvqrpg, AFTER manual changes required |
Goto: Begin this document , End this document , UVSI Home-Page
L1. | Example#9 - quikjob 'REPORT' conversion |
L1. | - original QuikJob Mainframe source code |
L2. | - converted to uvcopy BEFORE manual changes |
L4. | - converted to uvcopy, AFTER manual changes |
M1. | Limitations & Post Conversion Fixups |
- Files Types, Indexed file keys, Record size areas, | |
- Character vs Numeric fields (some mvc/cmc changes to mvn/cmn). | |
- Rewrite requires filr1 vs fili1 | |
- uvqrpg conversions require more changes due to built in cycle | |
- TABLSPEC, CALL TBLSRT, IF ONTABLE, FUNction addressing, | |
- TABLE POINTERS or registers | |
- SORT AREA requires insert of 'sxo' (sort open) & 'sxs' (sort execute) | |
- OPEN & CLOSE changes if quikjob has any (most do not) | |
- embedded '+' symbols in quikjob 'EQU's converted to uvcopy $symbols | |
- large quikjobs (> 500 lines) need option to increase instruction storage | |
- more than 2 headers require changes to mark end of heading area 'h' | |
- CALLs to sub-programs can usually be replaced by uvcopy code | |
- PERFORM THRU possible problem (uvcopy returns on 1st exit) |
N1. | More Things to Watch Out For |
VALEQU - QuikJob internal storage area for Values & Status results | |
UPSI - mainframe UPSI switch conversion equivalents | |
EOF tests - testing EOF ATEND OK, but $INFEOF/VAL requires change | |
I/O status - testing random read/write/update requires changes | |
FILE declarations, confusion re Indexed or not | |
EQU/$symbol references to fields in prior copybook |
O1. | vi editor Search patterns to find & fix quikjob conversion problems |
/tag0000 - EOF tests | |
/tag____ | |
/val[0-2] - VALEQU references | |
/(1) - incorrect lengths | |
/mvc/cmc - may have to change some mvc/cmc to mvn/cmn | |
/mpy/div - multiply for extra decimal places, fields too small?? | |
/c\'& - &symbols, need conversion to $symbols | |
/spaces, /zeros, /hivalues, /lovalues <-- check max lengths allowed | |
/lodc1 - must add area code onto quikjob copybooks | |
/sort area/file - insert sxo,sxs/sxg,sxp | |
/lfd=& - &/$ variable names for LFD's on FILE's | |
/???? - watch for character fields that should be numeric ?? |
Recommendation |
|
Goto: Begin this document , End this document , UVSI Home-Page
P1. | Code Reductions - Optional |
P1. | replacing multiple 'IF's with 1 'tst' instruction |
P2. | using tables to lookup fields in fixed locations |
P3. | using tables to scan for data anywhere within a field |
P4. | using tables to search for & replace patterns within fields |
(not possible with quikjob) |
Q1. | Debuggin QuikJobs, 'export UVQRPGROP=d' for animation |
MVSCOBOL.doc |
|
OS3unix.doc |
|
uvcopy3.doc |
|
uvqrpg.doc |
|
Goto: Begin this document , End this document , UVSI Home-Page
QuikJob is a Mainframe utility for performing file maintenance & generating reports. As the name implies it is often used for those quick 1 shot jobs (which often became regular production). The QuikJob syntax is similar to COBOL but much simpler.
This section will document how to convert mainframe QuikJobs to UNIX Vancouver Utilities (uvcopy, uvqrpg, or uvsort). We will present several examples (before & after) and illustrate any manual changes required after the automatic conversion job (quikjob2).
Converting QuikJobs will be part of a much larger project of converting a mainframe to UNIX. Please see MVSCOBOL.htm which documents the entire procedure. OS3unix.doc includes the operating instructions for the 'quikjob2' converter but does not provide many code examples.
The main reason for this separate document is to illustrate several examples of quikjob code conversions before & after, and any manual changes that may be required.
QuikJobs will be mass converted to both uvcopy & uvqrpg (in separate subdirs) & we will later decide which is best, & copy the best choice over to the live QuikJob sub-directory.
QuikJobs that are primarily file manipulations are best converted to uvcopy.
QuikJobs that create reports with multiple control & total levels are best converted to uvqrpg.
Reports without multiple control & total levels might require fewer changes with uvcopy because the quikjob instructions convert better 1 to 1 for uvcopy whereas the idea of uvqrpg is to create reports with declarations rather than instructions.
Goto: Begin this document , End this document , UVSI Home-Page
Converting QuikJobs will be part of a much larger project of converting a mainframe to UNIX. Please see MVSCOBOL.htm & 'OS3unix' which document the entire procedure. The QuikJob Conversion operating instructions have been extracted from part 6 of OS3unix.doc & are reproduced here.
/e3 :-----apps : :-----libs : : :-----pals : : : :-----jcl1 <- JCL - original Mainframe JCL : : : :-----jcl2 <-- intermediate (JPROCS expanded) : : : :-----jcl3 - may require several iterations : : : :-----jcl4 due to Jprocs calling Jprocs : : : :-----jcl5 <-- final result of Jproc expander
: : : :-----jcl6 <-- after QuikJobs stripped out
: : : :-----jcl7 <-- JCL converted to UNIX scripts : : : :-----jcls <-- copied here for test/modify/debug
: : : :-----qjc1 <- QuikJobs - mainframe EQU's (copybooks) : : : :-----qjc2 - optional, used if unpacking : : : :-----qjcs - converted to uvcopy/uvqrpg $symbols
: : : :-----qjj1 <- QuikJobs - original Mainframe source code : : : :-----qjj2c - converted to uvcopy : : : :-----qjj2q - converted to uvqrpg : : : :-----qjj3c - converted uvcopy (if unpacking) : : : :-----qjj3q - converted uvqrpg (if unpacking) : : : :-----qjjs - best version selected & copied here for modify/test/debug
See the step by step operating instructions on the next page --------->
Note that directory 'qjc1' holds the EQUates for QuikJOb '++INCLUDE's The Mainframe 'EQU's are converted to the uvcopy equivalent $symbols (while copying from qjc1 to 'qjcs').
Goto: Begin this document , End this document , UVSI Home-Page
'QuikJob's will be mass converted to both uvcopy & uvqrpg (in separate subdirs) & we will later decide which is best & copy the best choice over to the live QuikJob subdir. We will use the following subdirs:
qjj1 |
|
qjj2c |
|
qjj2q |
|
qjjs |
|
QuikJobs that create reports are probably done best with uvqrpg, but QuikJobs that are primarily file manipulations are best with uvcopy.
Note that the selection & manual copy from qjj2c/qjj2q to qjjs also protects us from inadvertently destroying a lot of manual editing that we may have done in qjjs - in the event of a mass reconversion of qjj1 to qjj2c/qjj2q.
1a. uvcopyx quikjob2 qjj1 qjj2c uop=q0i7c1 <- subdir & option for uvcopy ======================================
1b. uvcopyx quikjob2 qjj1 qjj2q uop=q0i7c2 <- subdir & option for uvqrpg ======================================
2a. vi qjj2c/* - investigate to see which is best choice 2b. vi qjj2q/*
3a. uvlpd12 qjj2c - OR list out ALL QuikJobs for easier look 3b. uvlpd12 qjj2q
4a. cp qjj2c/xxxxx qjjs - select quikjob from uvcopy to final subdir 4b. cp qjj2q/xxxxx qjjs - select quikjob from uvqrpg to final subdir
NOTE |
|
Goto: Begin this document , End this document , UVSI Home-Page
<--- See prior page for mass conversion of ALL QuikJobs.
Here are the Op. Instrns. to convert QuikJobs 1 at a time, in case you need to bring over a few QuikJobs after the initial mass conversion of all QuikJobs.
1a. uvcopy quikjob2,fili1=qjj1/xxx,filo1=qjj2c/xxx,uop=c1 <- uvcopy =====================================================
1b. uvcopy quikjob2,fili1=qjj1/xxx,filo1=qjj2q/xxx,uop=c2 <- uvqrpg =====================================================
2a. vi qjj2c/xxx - investigate to see which is best choice 2b. vi qjj2q/xxx
3a. uvlp12 qjj2c/xxx - OR list out QuikJobs for easier look 3b. uvlp12 qjj2q/xxx
4a. cp qjj2c/xxx qjjs - select quikjob from uvcopy to final subdir 4b. cp qjj2q/xxx qjjs - select quikjob from uvqrpg to final subdir
NOTE |
|
Goto: Begin this document , End this document , UVSI Home-Page
The converted quikjobs will normally be executed by the UNIX scripts, converted from the original mainframe JCL.
For testing, we may want to execute a particular quikjob by itself without any other steps in the script.
Assuming the input data files are available, this page will show you how to execute the converted quikjobs with NO scripts (JCL) required.
We will illustrate using example#1. Here are the file declarations extracted from the uvcopy version (shown on page 'D2').
fili1=${DD_PAL670W},rcs=0127,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR
The following assumes the data file directory design that was illustrated in OS3unix.doc. The relevant libraries were shown previously in this documented on page 'B1'.
5. uvcopy palq671 <-- execute quikjob sample#1 ==============
This job had only printer file output. If there had been data file output we could export it to the tmp subdir & inspect with 'uvhd', for example:
export DD_PAL065W=tmp/pal065w
uvhd tmp/pal065w r63 <-- inspect output data files with uvhd ====================
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=palq671 - * * OBJECTIVE: PRINT THE POST OFFICE ZIP REPORT * FILE INF DTF=MIRAM,BKSZ=4224,RCSZ=127,KEYS=NO,LFD=PAL670W * EQU E-SORT-ZIP INF1-5 /* SORT ZIP CODE EQU E-ACCT-NUM INF6-14 /* ACCOUNT NUMBER EQU E-MAIL1 INF15-46 /* STREET ADDRESS EQU E-MAIL2 INF47-78 /* CITY, STATE, ZIP CODE ADDRESS EQU E-TITLE INF79-86 /* TITLE NUMBER EQU E-STATE-LIC INF87-95 /* STATE LICENSE NUMBER
HDR 1A 1$JOBNAM$ U. S. P O S T O F F I C E HDR 1B C O D E R E P O R T $TIM$ $IPLDAT$ $PG HDR 2A 0 TITLE STATE LIC ACCOUNT MAILING ADDRESS 1 HDR 2B MAILING ADDRESS 2
EQU P-TITLE PRT1-8 /* TITLE NUMBER EQU P-STATE-LIC PRT11-19 /* STATE LICENSE NUMBER EQU P-ACCT-NUM PRT22-30 /* ACCOUNT NUMBER EQU P-MAIL1 PRT33-64 /* STREET ADDRESS EQU P-MAIL2 PRT67-98 /* CITY, STATE, ZIP CODE ADDRESS
1000 GET INF ATEND 9999 MOVE E-TITLE TO P-TITLE MOVE E-STATE-LIC TO P-STATE-LIC MOVE E-ACCT-NUM TO P-ACCT-NUM MOVE E-MAIL1 TO P-MAIL1 MOVE E-MAIL2 TO P-MAIL2 PRINT GO TO 1000
9999 GOTO EOJ END
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq671 - #* #* objective: print the post office zip report #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=4224,rcsz=127,keys=no,lfd=pal670w fili1=${DD_PAL670W},rcs=0127,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32) $e-sort-zip =a0(5) # equ e-sort-zip inf1-5 /* sort zip code $e-acct-num =a5(9) # equ e-acct-num inf6-14 /* account number $e-mail1 =a14(32) # equ e-mail1 inf15-46 /* street address $e-mail2 =a46(32) # equ e-mail2 inf47-78 /* city, state, zip code address $e-title =a78(8) # equ e-title inf79-86 /* title number $e-state-lic =a86(9) # equ e-state-lic inf87-95 /* state license number ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodv3c1=hh0(200) 1$jobname u. s. p o s t o f f i c e c o d e r e p o r t $time $date $pg 0 title state lic account mailing address 1 mailing address 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32) $p-title =p0(8) # equ p-title prt1-8 /* title number $p-state-lic =p10(9) # equ p-state-lic prt11-19 /* state license number $p-acct-num =p21(9) # equ p-acct-num prt22-30 /* account number $p-mail1 =p32(32) # equ p-mail1 prt33-64 /* street address $p-mail2 =p66(32) # equ p-mail2 prt67-98 /* city, state, zip code address ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) wtbe filo1,h0(200),h0(200) dump headings to outfile # tag1000 get fili1,a0 # 1000 get inf atend 9999. skp> tag9999 mvc $p-title,$e-title # move e-title to p-title mvc $p-state-lic,$e-state-lic # move e-state-lic to p-state-lic mvc $p-acct-num,$e-acct-num # move e-acct-num to p-acct-num mvc $p-mail1,$e-mail1 # move e-mail1 to p-mail1 mvc $p-mail2,$e-mail2 # move e-mail2 to p-mail2 putb filo1,p0 # print skp tag1000 # goto 1000. # tag9999 skp tageoj # 9999 goto eoj tageoj cls all eoj
Goto: Begin this document , End this document , UVSI Home-Page
#*palq671 - sample quikjob converted to uvcopy - AFTER changes #+ - this quikjob would run with no manual changes #+ - But there would be page headings only on the 1st page #+ - Changes below implement page headings every 55 lines #+ - changes marked with '#+' or '#<--' ('#-' shows commented out line) #+ - most on 2nd page (tsthdr subrtn) #* #* objective: print the post office zip report #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=4224,rcsz=127,keys=no,lfd=pal670w fili1=${DD_PAL670W},rcs=0127,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32) $e-sort-zip =a0(5) # equ e-sort-zip inf1-5 /* sort zip code $e-acct-num =a5(9) # equ e-acct-num inf6-14 /* account number $e-mail1 =a14(32) # equ e-mail1 inf15-46 /* street address $e-mail2 =a46(32) # equ e-mail2 inf47-78 /* city, state, zip code address $e-title =a78(8) # equ e-title inf79-86 /* title number $e-state-lic =a86(9) # equ e-state-lic inf87-95 /* state license number ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #+ clean up hdngs, insert blank line, add 'page####' for tstgdr subrtn #<--- lodv3c1=hh0(200) $jobname US Post Office Code Report $date page#### title state lic account mailing address 1 mailing address 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32) $p-title =p0(8) # equ p-title prt1-8 /* title number $p-state-lic =p10(9) # equ p-state-lic prt11-19 /* state license number $p-acct-num =p21(9) # equ p-acct-num prt22-30 /* account number $p-mail1 =p32(32) # equ p-mail1 prt33-64 /* street address $p-mail2 =p66(32) # equ p-mail2 prt67-98 /* city, state, zip code address ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) #- wtbe filo1,h0(200),h0(200) dump headings to outfile #<-- disabled bal tsthdr1 #+ do 1st page headings #<-- inserted #+ #+ above wtbe dump hdngs #cmntd out & bal tsthdr1 inserted for 1st page #<-- #+ see QJ mainline & subrtn on page 2 (#*eject col1 next line) force pg2 #<--
Goto: Begin this document , End this document , UVSI Home-Page
#+ page 2 of sample quikjob, with tsthdr subrtn for headings every 55 lines #+ tag1000 get fili1,a0 # 1000 get inf atend 9999. skp> tag9999 mvc $p-title,$e-title # move e-title to p-title mvc $p-state-lic,$e-state-lic # move e-state-lic to p-state-lic mvc $p-acct-num,$e-acct-num # move e-acct-num to p-acct-num mvc $p-mail1,$e-mail1 # move e-mail1 to p-mail1 mvc $p-mail2,$e-mail2 # move e-mail2 to p-mail2 putb filo1,p0 # print skp tag1000 # goto 1000. # tag9999 skp tageoj # 9999 goto eoj tageoj cls all eoj # #------------------------------------------------------------------------ # tsthdr - subrtn to test line count & print headings #<-- new code # - this subrtn added to original quikjob conversion # - optional addition if you need headings on every page # - enter at 'tsthdr1' to force page headings (at program init) # tsthdr add $ca21,1 increment line count cmn $ca21,55 page full (do hdrs) ? skp< tsthdrx tsthdr1 add $ca22,1 yes - incrmnt page# scn h0(150),'page' scan for page# ID edt hx4(4),$ca22,'zzz9' insert page# following ID wtbe filo1,h0(200),h0(200) dump page hdrs to print file mvn $ca21,0 clear line counter tsthdrx ret= return to caller
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq671 - #* #* objective: print the post office zip report #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=4224,rcsz=127,keys=no,lfd=pal670w fili1=${DD_PAL670W},rcs=0127,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR lodc1=qq0(32) $e-sort-zip =a0(5) # equ e-sort-zip inf1-5 /* sort zip code $e-acct-num =a5(9) # equ e-acct-num inf6-14 /* account number $e-mail1 =a14(32) # equ e-mail1 inf15-46 /* street address $e-mail2 =a46(32) # equ e-mail2 inf47-78 /* city, state, zip code address $e-title =a78(8) # equ e-title inf79-86 /* title number $e-state-lic =a86(9) # equ e-state-lic inf87-95 /* state license number ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ head6=h6000(66),'1$jobname u. s. p o s t o f f i c e' head6=h6066(66),' c o d e r e p o r t $time $date $pg' head5=h5000(66),'0 title state lic account mailing address 1' head5=h5066(66),' mailing address 2' # lodc1=qq0(32) $p-title =p0(8) # equ p-title prt1-8 /* title number $p-state-lic =p10(9) # equ p-state-lic prt11-19 /* state license number $p-acct-num =p21(9) # equ p-acct-num prt22-30 /* account number $p-mail1 =p32(32) # equ p-mail1 prt33-64 /* street address $p-mail2 =p66(32) # equ p-mail2 prt67-98 /* city, state, zip code address ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @dtl nop # tag1000 get fili1,a0 <--- see changes next page ---> skp> tag9999 <- mvc $p-title,$e-title # move e-title to p-title mvc $p-state-lic,$e-state-lic # move e-state-lic to p-state-lic mvc $p-acct-num,$e-acct-num # move e-acct-num to p-acct-num mvc $p-mail1,$e-mail1 # move e-mail1 to p-mail1 mvc $p-mail2,$e-mail2 # move e-mail2 to p-mail2 putb filo1,p0 # print skp tag1000 <- # <- tag9999 skp tageoj <- tageoj cls all <--- see changes next page ---> eoj <-
Goto: Begin this document , End this document , UVSI Home-Page
## <------- note changes for uvqrpg marked by '##' below changes explained on the next page ---------->
#*quikjob=palq671 - #* #* objective: print the post office zip report #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=4224,rcsz=127,keys=no,lfd=pal670w fili1=${DD_PAL670W},rcs=0127,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR lodc1=qq0(32) $e-sort-zip =a0(5) # equ e-sort-zip inf1-5 /* sort zip code $e-acct-num =a5(9) # equ e-acct-num inf6-14 /* account number $e-mail1 =a14(32) # equ e-mail1 inf15-46 /* street address $e-mail2 =a46(32) # equ e-mail2 inf47-78 /* city, state, zip code address $e-title =a78(8) # equ e-title inf79-86 /* title number $e-state-lic =a86(9) # equ e-state-lic inf87-95 /* state license number ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ head6=h6000(66),'1$jobname u. s. p o s t o f f i c e' head6=h6066(66),' c o d e r e p o r t $time $date $pg' head5=h5000(66),'0 title state lic account mailing address 1' head5=h5066(66),' mailing address 2' # lodc1=qq0(32) $p-title =p0(8) # equ p-title prt1-8 /* title number $p-state-lic =p10(9) # equ p-state-lic prt11-19 /* state license number $p-acct-num =p21(9) # equ p-acct-num prt22-30 /* account number $p-mail1 =p32(32) # equ p-mail1 prt33-64 /* street address $p-mail2 =p66(32) # equ p-mail2 prt67-98 /* city, state, zip code address ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @dtl nop # ##tag1000 get fili1,a0 <--- CHANGED see original prior page ## skp> tag9999 <- mvc $p-title,$e-title # move e-title to p-title mvc $p-state-lic,$e-state-lic # move e-state-lic to p-state-lic mvc $p-acct-num,$e-acct-num # move e-acct-num to p-acct-num mvc $p-mail1,$e-mail1 # move e-mail1 to p-mail1 mvc $p-mail2,$e-mail2 # move e-mail2 to p-mail2 putb filo1,p0 # print ## skp tag1000 <- # <- ##tag9999 skp tageoj <- ##tageoj cls all <--- CHANGED see original prior page ## eoj <-
Goto: Begin this document , End this document , UVSI Home-Page
<-- Please see the sample job listed on the previous page, with the changes required marked by '##'.
Note that in this case all we had to do was to remove (or ##comment out) the following instructions:
@dtl nop # ## tag1000 get fili1,a0 # 1000 get inf ## skp> tag0000
- - - detail time instructions - - -
## skp tag1000 # goto 1000 ## ## tag9999 skp tageoj # 9999 goto eoj ## tageoj cls all ## eoj
These instructions must be removed (or #commented out) because uvqrpg expects to create reports more by declarations rather than procedures (please see uvqrpg.doc in volume 2 of Vancovuer Utilities).
For this example, the uvcopy conversion requires no manual changes.
You might want to use the uvqrpg version (even though some manual changes are required), if you wanted page headings on every page (instead of only on the 1st page as per uvcopy).
uvqrpg generates page headings automatically. Of course you could add a few instructions in the uvcopy version to count lines & reprint the headings (using the 'wtbe' command).
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=palq749 - * * OBJECTIVE: INSERT THE TAX RELIEF RECS INTO PALTRAN * FILE INF DTF=MIRAM,BKSZ=1024,RCSZ=63,INDXBLK=1,RCB=YES FILE DET DTF=MIRAM,BKSZ=30720,RCSZ=63,KEYS=NO,RCB=YES
MOVE C'000000' TO SAV1-6
0010 GET DET ATEND 9999 MOVE DET1-63 TO INF1-63 ADDKEY INF USING INF1-23 IF VAL46-49 NOT EQ C'0000' DISPLAY C'REC NOT ADDED' ABEND. ADD C'1' TO SAV1-6. GOTO 0010.
9999 MOVE C'PALTRAN RECORDS ADDED ' TO PRT1 MOVE SAV1-6 TO PRT30 0C DISPLAY PRT1-40 GOTO EOJ
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq749 - #* #* objective: insert the tax relief recs into paltran #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=1024,rcsz=63,indxblk=1,rcb=yes fili1=${DD_INF},rcs=0063,typ=ISFl1 # file det dtf=miram,bksz=30720,rcsz=63,keys=no,rcb=yes fili2=${DD_DET},rcs=0063,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) mvc s0(6),c'000000' # move c'000000' to sav1-6 # tag0010 get fili2,b0 # 0010 get det atend 9999 skp> tag9999 mvc a0(63),b0(63) # move det1-63 to inf1-63 wrt fili1,a0 # addkey inf using inf1-23 skp= tag____ <- cmc o45(4),c'0000' <--- see changes next page ---> skp= ifb0010 <- msgwa1 c'REC NOT ADDED' can 'ABEND - job cancelled' ifb0010 add s0(6),1 # ifb0010 add c'1' to sav1-6. skp tag0010 # goto 0010. # tag9999 mvc p0(0022),c'PALTRAN RECORDS ADDED ' mvc p29(0006),s0(6) # move sav1-6 to prt30 0c msgwa1 p0(40) skp tageoj # goto eoj tageoj cls all eoj
Mainframe tested success of 'ADDKEY' as follows:
IF VAL46-49 NOT EQ C'0000' <- original mainframe QJ test which converted to 2 instructions: cmc o45(4),c'0000' <- not required skp= ifb0010 <- use this following uvcopy 'wrt'
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq749 - #* #* objective: insert the tax relief recs into paltran #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=1024,rcsz=63,indxblk=1,rcb=yes fili1=${DD_INF},rcs=0063,typ=ISFl1 # file det dtf=miram,bksz=30720,rcsz=63,keys=no,rcb=yes fili2=${DD_DET},rcs=0063,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) mvc s0(6),c'000000' # move c'000000' to sav1-6 # tag0010 get fili2,b0 # 0010 get det atend 9999 skp> tag9999 mvc a0(63),b0(63) # move det1-63 to inf1-63 wrt fili1,a0 # addkey inf using inf1-23 skp= ifb0010 <-- CHANGED see original prior page # <-- 2 instructions removed msgwa1 c'REC NOT ADDED' can 'ABEND - job cancelled' ifb0010 add s0(6),1 # ifb0010 add c'1' to sav1-6. skp tag0010 # goto 0010. # tag9999 mvc p0(0022),c'PALTRAN RECORDS ADDED ' mvc p29(0006),s0(6) # move sav1-6 to prt30 0c msgwa1 p0(40) skp tageoj # goto eoj tageoj cls all eoj
Mainframe tested success of 'ADDKEY' as follows:
IF VAL46-49 NOT EQ C'0000' <- original mainframe test I/O OK which converted to 2 instructions: cmc o45(4),c'0000' <- not required, removed above skp= ifb0010 <- use this following uvcopy 'wrt'
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=bosfxnam.qj01 * * OBJECTIVE: FIX ANY BLANK DATES IN BOSNAME FILE TO ZEROS * FILE INF DTF=MIRAM,RCSZ=1023,K1LOC=1,K1LEN=&KL,INDXBLK=&INDX * EQU BOSNAME INF ++INCLUDE BOSNAME * EQU WSCOUNT WST1-4 MOVE C'0000' TO WST1-4 * 1000 GET INF ATEND 9999. IF NDTLEN < C'00000000' MOVE C'00000000' TO NDTLEN. IF NDTLPR < C'00000000' MOVE C'00000000' TO NDTLPR. IF NDTUNC < C'00000000' MOVE C'00000000' TO NDTUNC. REWRITE INF ADD C'0001' TO WST1-4 GOTO 1000.
9999 MOVE C'TOTAL BOSNAME RECS CHANGED:' TO PRT1-30 MOVE WST1-4 TO PRT31-34 PRINT GOTO EOJ
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=bosfxnam.qj01 #* #* objective: fix any blank dates in bosname file to zeros #* was=i2000q32000s2000t100000 # file inf dtf=miram,rcsz=1023,k1loc=1,k1len=&kl,indxblk=&indx fili1=${DD_INF},rcs=1023,typ=ISFl1 <--- CHANGE see next page ---> filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32) $bosname =a0(0) # equ bosname inf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),bosname # ++include bosname lodc1=qq0(32) $wscount =i0(4) # equ wscount wst1-4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) mvc i0(4),c'0000' # move c'0000' to wst1-4 #* tag1000 get fili1,a0 <--- CHANGE required, see next page ---> skp> tag9999 cmc $ndtlen,c'00000000' # if ndtlen < c'00000000' skp=> ifb0010 mvc $ndtlen,c'00000000' # move c'00000000' to ndtlen. ifb0010 cmc $ndtlpr,c'00000000' # ifb0010 if ndtlpr < c'00000000' skp=> ifb0020 mvc $ndtlpr,c'00000000' # move c'00000000' to ndtlpr. ifb0020 cmc $ndtunc,c'00000000' # ifb0020 if ndtunc < c'00000000' skp=> ifb0030 mvc $ndtunc,c'00000000' # move c'00000000' to ndtunc. ifb0030 upd fili1,a0 <--- CHANGE see next page ---> add i0(4),1 # add c'0001' to wst1-4 skp tag1000 # goto 1000. # tag9999 mvc p0(30),c'TOTAL BOSNAME RECS CHANGED:' mvc p30(4),i0(4) # move wst1-4 to prt31-34 putb filo1,p0 # print skp tageoj # goto eoj tageoj cls all eoj
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=bosfxnam.qj01 #* #* objective: fix any blank dates in bosname file to zeros #* was=i2000q32000s2000t100000 # file inf dtf=miram,rcsz=1023,k1loc=1,k1len=&kl,indxblk=&indx filr1=${DD_INF},rcs=1023,typ=ISFl1 <--- CHANGED (fili1 to filr1) filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32) $bosname =a0(0) # equ bosname inf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),bosname # ++include bosname lodc1=qq0(32) $wscount =i0(4) # equ wscount wst1-4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) mvc i0(4),c'0000' # move c'0000' to wst1-4 #* tag1000 redm2 filr1,a0 <--- CHANGED (get fili1 to redm2 filr1) skp> tag9999 cmc $ndtlen,c'00000000' # if ndtlen < c'00000000' skp=> ifb0010 mvc $ndtlen,c'00000000' # move c'00000000' to ndtlen. ifb0010 cmc $ndtlpr,c'00000000' # ifb0010 if ndtlpr < c'00000000' skp=> ifb0020 mvc $ndtlpr,c'00000000' # move c'00000000' to ndtlpr. ifb0020 cmc $ndtunc,c'00000000' # ifb0020 if ndtunc < c'00000000' skp=> ifb0030 mvc $ndtunc,c'00000000' # move c'00000000' to ndtunc. ifb0030 upd filr1,a0 <--- CHANGED (upd fili1 to upd filr1) add i0(4),1 # add c'0001' to wst1-4 skp tag1000 # goto 1000. # tag9999 mvc p0(30),c'TOTAL BOSNAME RECS CHANGED:' mvc p30(4),i0(4) # move wst1-4 to prt31-34 putb filo1,p0 # print skp tageoj # goto eoj tageoj cls all eoj
Note CHANGES marked above with '<--- CHANGED' See more explanation on the netx page ------------------>
Goto: Begin this document , End this document , UVSI Home-Page
Here are the original & the changed lines from the BEFORE & AFTER versions listed on the previous 2 pages
fili1=${DD_INF},rcs=1023,typ=ISF - as converted, before changes filr1=${DD_INF},rcs=1023,typ=ISF <--- CHANGED (fili1 to filr1)
tag1000 get fili1,a0 - as converted tag1000 redm2 filr1,a0 <--- CHANGED (get fili1 to redm2 filr1)
ifb0030 upd fili1,a0 - as converted ifb0030 upd filr1,a0 <--- CHANGED (upd fili1 to upd filr1)
The primary input file (INF) is always converted to 'fili1' which is input only & does not allow 'update in place'. If the quikjob includes 'REWRITES', you must change 'fili1' to 'filr1' (required for updates in place).
The 'get' (for input only) then becomes 'redm2' (get next allowing updates).
'REWRITE' is converted to 'upd' OK, but you must change 'fili1' to 'filr1'.
This discussion applies to uvcopy. As of July 2000, uvqrpg does not allow updates in place to the primary input file. This is because uvqrpg has a built in cycle which gets records from the primary input file.
You must use uvcopy for updates in place to the primary file, but there is no problem using uvqrpg when reading a detail sequential file as the primary & randomly updating an indexed file by key.
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=palq065 - * * OBJECTIVE: SORT PALS TRANSACTIONS BY ACCOUNT#, ITEM#,& TAX-YEAR * FILE INF DTF=MIRAM,LFD=PALADJW,RCSZ=63,BKSZ=2048,KEYS=YES FILE OFA DTF=MIRAM,LFD=PAL065W,RCSZ=63,BKSZ=2048,KEYS=NO
++INCLUDE PALADJW
EQU SRTREC OFA1-63 /* SORTED ADJUSTMENT FILE EQU RECCNT WST1-4-P
SORT AREA RL63 ON MACCT MITEM MTXYR
MOVE P'0000' TO RECCNT
0100 GET INF ATEND 0200 /* READ PALADJW IF INF24 IS EQ HIVALUES GO TO 0100. RELEASE INF1-63 TO SORT ADD C'1' TO RECCNT GO TO 0100
0200 RETURN SORTED INTO INF1-63 ATEND 9999 /* READ SORTED RECORDS MOVE INF1-63 TO OFA1-63 WRITE OFA GO TO 0200
9999 MOVE RECCNT TO PRT5 C MOVE C'RECORDS SORTED' TO PRT16 PRINT GOTO EOJ
This job can be rewritten (on 1 line) using 'uvsort':
uvsort "fili1=$PALADJW,rcs=63,typ=ISF,filo1=$PAL065W,typ=RSF\ ============================================================= ,keys=(0,14),del=23(1):0xFF" ============================
The uvcopy solution (next page) would be better when there are a lot of record selections or record reformatting (uvsort would be long & awkward).
Note that the sort keys were determined by looking up the 'paladjw' record layout in the 'qjcs' subdirectory for $symbols converted from original EQU layouts. See paladjw listed on page 'G4' ahead --------->
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq065 - #* #* objective: sort pals transactions by account#, item#,& tax-year #* was=i2000q32000s2000t100000 # file inf dtf=miram,lfd=paladjw,rcsz=63,bksz=2048,keys=yes fili1=${DD_PALADJW},rcs=0063,typ=ISFl1 # file ofa dtf=miram,lfd=pal065w,rcsz=63,bksz=2048,keys=no filo2=${DD_PAL065W},rcs=0063,typ=RSFl0 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),paladjw # ++include paladjw lodc1=qq0(32) $srtrec =e0(63) # equ srtrec ofa1-63 /* sorted adjustment file $reccnt =i0(4p) # equ reccnt wst1-4-p ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # sort area rl63 on macct mitem mtxyr # @run # <-- INSERT 'sxo' specify SORT rcsz & keys opn all open files clr t0(100000),'~' clear table to all tildes # mvc $reccnt,0 # move p'0000' to reccnt # tag0100 get fili1,a0 # 0100 get inf atend 0200 /* read paladjw skp> tag0200 <--- CHANGE required see next page ---> cmc a23(1),$hivalues # if inf24 is eq hivalues skp= tag0100 # goto 0100. = sxp a0(63) # release inf1-63 to sort add $reccnt,1 # add c'1' to reccnt skp tag0100 # goto 0100 # # <--- INSERT required see next page ---> # tag0200 sxg a0(63) # 0200 return sorted into inf1-63 atend 9999 /* read sorte skp> tag9999 mvc e0(63),a0(63) # move inf1-63 to ofa1-63 put filo2,e0 # write ofa skp tag0200 # goto 0200 # tag9999 mvc p4(1),$reccnt # 9999 move reccnt to prt5 c mvc p15(0014),c'RECORDS SORTED' putb filo1,p0 # print skp tageoj # goto eoj tageoj cls all eoj
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq065 - #* #* objective: sort pals transactions by account#, item#,& tax-year #* was=i2000q32000s2000t100000 # file inf dtf=miram,lfd=paladjw,rcsz=63,bksz=2048,keys=yes fili1=${DD_PALADJW},rcs=0063,typ=ISFl1 # file ofa dtf=miram,lfd=pal065w,rcsz=63,bksz=2048,keys=no filo2=${DD_PAL065W},rcs=0063,typ=RSFl0 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),paladjw # ++include paladjw lodc1=qq0(32) $srtrec =e0(63) # equ srtrec ofa1-63 /* sorted adjustment file $reccnt =i0(4p) # equ reccnt wst1-4-p ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # sort area rl63 on macct mitem mtxyr # @run sxo 63,'0(9),9(3),12(2)' #1<-- INSERTED sxo specify SORT rcsz & keys opn all open files clr t0(100000),'~' clear table to all tildes # mvc $reccnt,0 # move p'0000' to reccnt # tag0100 get fili1,a0 # 0100 get inf atend 0200 /* read paladjw skp> tag0150 #2<-- CHANGED (tag0200 to tag0150) cmc a23(1),$hivalues # if inf24 is eq hivalues skp= tag0100 # goto 0100. = sxp a0(63) # release inf1-63 to sort add $reccnt,1 # add c'1' to reccnt skp tag0100 # goto 0100 # tag0150 sxs #3<-- INSERTED (sxs execute sort) # tag0200 sxg a0(63) # 0200 return sorted into inf1-63 atend 9999 /* read sorte skp> tag9999 mvc e0(63),a0(63) # move inf1-63 to ofa1-63 put filo2,e0 # write ofa skp tag0200 # goto 0200 # tag9999 mvc p4(1),$reccnt # 9999 move reccnt to prt5 c mvc p15(0014),c'RECORDS SORTED' putb filo1,p0 # print skp tageoj # goto eoj tageoj cls all eoj
Goto: Begin this document , End this document , UVSI Home-Page
We can determine the SORT fields by looking up the 'paladjw' record layout in the 'qjcs' directory (converted from original quikjob EQU directory). Here are a few fields from both directories:
EQU MKEY1 INF1-23 /* PRIMARY KEY EQU MACCT INF1-9 /* ACCOUNT NUMBER EQU MITEM INF10-12 /* ITEM NUMBER EQU MTXYR INF13-14 /* TAX YEAR
$mkey1 =a0(23) #equ mkey1 inf1-23 /* primary key $macct =a0(9) #equ macct inf1-9 /* account number $mitem =a9(3) #equ mitem inf10-12 /* item number $mtxyr =a12(2) #equ mtxyr inf13-14 /* tax year
SORT AREA RL63 ON MACCT MITEM MTXYR - original quikjob sxo 63,'0(9),9(3),12(2)' #1<-- INSERTED sxo SORT rcsz & keys sxo 63,'0(14)' - could combine
skp> tag0200 - original conversion skp> tag0150 #2<-- CHANGED (tag0200 to tag0150)
tag0150 sxs #3<-- INSERTED (sxs execute sort)
We must insert the 'sxs' for uvcopy to perform the sort. Quikjob did not need this because it automatically perfomed the sort after the last RELEASE & on the 1st RETURN (uvcopy does not do this for added flexibility).
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=palq515 - * OBJECTIVE: SORT PALS BILLING EXTRACTION RECORDS IN * ZIP, ACCOUNTNO, TAX YEAR,& ITEM NUMBER ORDER * DROP ANY TAX YEARS < 1998 FILE INF DTF=MIRAM,LFD=PAL510W,RCSZ=255,BKSZ=20480,KEYS=NO FILE OFA DTF=MIRAM,LFD=PAL515W,RCSZ=255,BKSZ=20480,KEYS=NO
EQU BLEXREC INF1-255 /* BILLING EXTRACTION RECORD EQU BLSZIP INF1-5 /* SORT ZIP EQU BLSACCT INF6-14 /* ACCOUNT NUMBER EQU BLSTXYR INF22-25 /* TAX YEAR EQU BLSITEM INF26-28 /* ITEM NUMBER EQU RECCNT WST1-4-P
SORT FILE INF ON BLSZIP BLSACCT BLSITEM BLSTXYR (D)
MOVE P'0000' TO RECCNT
0100 GET INF ATEND 9999 IF BLSTXYR < C'1998' GO TO 0100. MOVE INF1-255 TO OFA1-255 WRITE OFA ADD C'1' TO RECCNT GO TO 0100
9999 MOVE RECCNT TO PRT5 C MOVE C'RECORDS SORTED' TO PRT16 PRINT GOTO EOJ
This job can be rewritten (on 1 line) using 'uvsort':
uvsort "fili1=$PAL510W,rcs=255,typ=ISF,filo1=$PAL510W,typ=RSF\ ============================================================= ,keys=(0,5,c,a,5,9,c,a,25,3,c,a,23,2,c,d),del=21(4)<1998" =========================================================
The Quikjob printed record counts, but uvsort automatically displays record counst when input & output files are closed.
If you really wanted to you could convert the uvcopy equivalent similar to the preceding example#4, but you would have more instructions to add since quikjob 'SORT FILE' does not include the RELEASE/RETURN as did the 'SORT AREA' of example#4.
Goto: Begin this document , End this document , UVSI Home-Page
** palq022 - initialize indexed file ** Open & Close to init empty file with keys & rcsz ** FILE OFA TYPE=MIRAM,RCSZ=31,BKSZ=2048,INDXBLK=1,K1LOC=1,K1LEN=9 0010 OPEN OFA CLOSE OFA GO TO EOJ
This QuikJob replaced with UV script 'makeISF0', 1 line inserted into the script calling the quikjob (jcls/pals021)
makeISF0 $DM/ipaldcal 31 0,9 ============================
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=palq072 - * * OBJECTIVE: REINITIALIZE THE TRANSACTION FILE (PALADJW). * WRITE A DUMMY HIGH-KEY NINES RECORD * FILE DET DTF=JCS FILE OFA DTF=MIRAM,RCSZ=63,BKSZ=2048,K1LOC=1,K1LEN=23,INDXBLK=1
0100 GET DET /* READ JCLDATA DUMMY RECORD MOVE DET1-63 TO OFA1-63 WRITE OFA GOTO EOJ
# QuikJob=palq072 - # # REINIT TRANSACTION FILE (PALADJW) by writing a DUMMY HIGH-KEY # - High Key value changed from '9's (mainframe) to 'z's for UNIX # filo1=$DM/paladjw,rcs=63,typ=ISF,isk1=0(23) # lod=k0(63) zzzzzzzzzzzzzzzzzzzzzzz dummy high key record to init file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @run opn filo1 put filo1,k0(63) cls filo1 eoj
This rewritten job would be called from the script (JCL) as follows:
uvcopy palq072,filo1=$DM/paladjw ================================
This quikjob was rewritten (rather than use the converted code) - Loading a table in uvcopy is a useful technique for various uses. - In this case it is just 1 record, but the table could have many lines - Most areas default to 1024 bytes, which can be increased via 'was=' which must appear prior to the file declaration, for example if you wanted to load 100 lines of 63 bytes each, you could code: was=k6300
wtb filo1,k0(63),k0(63)
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=bosq003 * * PRINT BUSINESS LICENSE TAPE MASTER FILE * LOAD CLASS CODES FROM PARAM CARDS TO A TABLE OCCURS 100. * WILL SEARCH CLASS TABLE FOR CLASS DESCRIPTION TO PRINT * CLASS TABLE ENTRIES 30 BYTES (CODE 3, FILLER 2, DESCRIPTION 25) * FILE IND DTF=JCS FILE INF DTF=TAPE,BKSZ=8000,RCSZ=100,LFD=BLIC20A
EQU START-MASTER INF EQU ACCOUNT (08) EQU LICENSEE (30) EQU MAIL-ADD (25) EQU CITY-STATE (25) EQU CLASS-CODE (03) EQU FILLER (09) * TABLSPEC 0100 01 03 04 27 /* 100 ENTRIES of 30 bytes * SET TSA INITIAL /* INITIALIZE TABLE POINTER * 1000 GET IND ATEND 2000 /* READ JCS RECORD MOVE IND1-30 TO TSA1-30 /* CLASS CODE & DESCRIPTION SET TSA UP 30 /* ADVANCE TABLE POINTER GO TO 1000 /* LOOP BACK * 2000 GET INF ATEND 9000 MOVE ACCOUNT TO PRT01-09 MOVE LICENSEE TO PRT11-48 MOVE CLASS-CODE TO PRT51-53 IF CLASS-CODE ONTABLE MOVE TBH6-30 TO PRT55-79. PRINT GO TO 2000.
9000 GO TO EOJ
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=bosq003 #* #* print business license tape master file #* load class codes from param cards to a table occurs 100. #* will search class table for class description to print #* class table entries 30 bytes (code 3, filler 2, description 25) #* was=i2000q32000s2000t100000 # file ind dtf=jcs fili4=${DD_IND},rcs=0080,typ=LST # file inf dtf=tape,bksz=8000,rcsz=100,lfd=blic20a fili1=${DD_BLIC20A},rcs=0100,typ=RSFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32) $start-master =a0(0) # equ start-master inf $account =a0000(08) # equ account (08) $licensee =a0008(30) # equ licensee (30) $mail-add =a0038(25) # equ mail-add (25) $city-state =a0063(25) # equ city-state (25) $class-code =a0088(03) # equ class-code (03) $filler =a0091(09) # equ filler (09) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # tablspec 0100 01 03 04 27 /* 100 entries of 30 bytes @run opn all open files clr t0(100000),'~' clear table to all tildes mvn $rt,0 # set tsa initial /* initialize table pointer #* tag1000 get fili4,d0 # 1000 get ind atend 2000 /* read jcs record skp> tag2000 mvc tt0(30),d0(30) # move ind1-30 to tsa1-30 /* class code & description add $rt,30 # set tsa up 30 /* advance table pointer skp tag1000 # goto 1000 /* loop back #* tag2000 get fili1,a0 # 2000 get inf atend 9000 skp> tag9000 mvc p0(9),$account # move account to prt01-09 mvc p10(38),$licensee # move licensee to prt11-48 mvc p50(3),$class-code # move class-code to prt51-53 # lokz1 tt0(__),tt0(__),$class-code <--INSERT length, see next page--> skp! ifb0010 mvc p54(25),tt5(25) # move tbh6-30 to prt55-79. ifb0010 putb filo1,p0 # ifb0010 print skp tag2000 # goto 2000. # tag9000 skp tageoj # 9000 goto eoj tageoj cls all eoj
Goto: Begin this document , End this document , UVSI Home-Page
Please see the sample table load & lookup job listed on the previous page. In this case the only manual change required is to insert the table entry length on the lookup instruction. Before & After as follows:
lokz1 tt0(__),tt0(__),$class-code <--- as converted (length) omitted
lokz1 tt0(30),tt0(30),$class-code <--- CHANGED, entry length inserted
If desired you could insert the table data within the job, rather than load it from a file at job initialization. You might do this if the table data was used only in this 1 job & it was only a few lines. For example you could insert the following code after the file declarations, and then remove the code to load from a file (tag1000 get ... skp tag1000).
lod=t0(30) 001 X-----description#1-----X 002 X-----description#2-----X 003 X-----description#3-----X 999 - - - etc - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Or if you do want to load the table from a file, you could reduce the table loading code to 1 line by replacing the tag1000 get ... skp tag1000 with:
rtb fili4,t0(30),t0(30)
Please see the 'rtb' instruction in uvcopy3.doc in volume 2 of UVdoc. Also note there is a 'wtb' instruction to write out tables, which might be used at EOJ, after accumulating totals into a table.
Goto: Begin this document , End this document , UVSI Home-Page
*QuikJob=palq735 - * * OBJECTIVE: PRINT BUSINESS ACCOUNTS TO BE AUDITED * FILE INF DTF=MIRAM,BKSZ=24576,RCSZ=255,LFD=PALNAME * ++INCLUDE PALNAME EQU PALNAME-REC INF1-255 /* NAME-ADDRESS RECORD EQU BREAK-LVL-FLG VAL180 /* BREAK-LEVEL FLAG (1-9,F) EQU BREAK-PRT-FLG VAL181 /* BREAK TOTAL-PRINT FLAG EQU PAGE-EJECT-FLG VAL182 /* BREAK PAGE-EJECT FLAG (ON=E) EQU NAME-EOF-FLG VAL196 /* PALNAME FILE EOF FLAG (ON=E) EQU SORT-EOF-FLG VAL200 /* SORT FILE EOF FLAG (ON=E) EQU SORT-REC-CTR CTA5-8-P 0C /* TOTAL RECORDS SORTED
SORT AREA RL255 ON NAUDTR NACCT
TITLE 'PALQ735 BUSINESS PERSONAL PROPERTY ACCOUNTS TO BE AUD' TITLE 'ITED $TIM$' * REPORT NACCT (ACCOUNTNO) NNAME1 (OWNER NAME) NNAME2 (TRADE NAME) NBPLOC (LOCATION) NAUDST (STATUS) NAUDTR (AUDITOR)
BREAK 1 NAUDTR
1000 GET INF ATEND 2000 /* READ PALNAME-FILE (SEQ BY KEY) IF NAUDST = C'A' /* AUDIT STATUS = A? RELEASE PALNAME-REC TO SORT. /* RELEASE NAME RECORD TO SORT GOTO 1000
2000 RETURN SORTED INTO PALNAME-REC ATEND 2099. /* RETURN SORT-FILE RECORD ACCUM ONE IN A 4 BYTE CTA. CHECKBREAKS ON BREAKS PERFORM 5000 THRU 5099. PRINT REPORT. GOTO 2000.
5000 IF BREAK-LVL-FLG = C'1' MOVE C'E' TO PAGE-EJECT-FLG GOTO 5099. IF BREAK-LVL-FLG = C'F' MOVE C'TOTAL AUDIT RECORDS PRINTED =' TO PRT1 MOVE SORT-REC-CTR TO PRT31 GOTO 5099. 5099 EXIT
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq735 - #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=24576,rcsz=255,lfd=palname fili1=${DD_PALNAME},rcs=0255,typ=RSF filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR #* objective: print business accounts to be audited #* - select accounts from palname with audit-status code 'A' #* - sort these records on auditor-code & acct-number. #* print the sort-file, begin new page on auditor-code break. #* - count sorted records & print total (accounts to be audited). #* lodc1=qq0(32),palname # ++include palname lodc1=qq0(32) $palname-rec =a0(255) # equ palname-rec inf1-255 /* name-address record $upsi-0 =o21(1) # equ upsi-0 val22 /* fatal-err flag (on=1) $break-lvl-flg =o179(1) # equ break-lvl-flg val180 /* break-level flag (1-9,f) $page-eject-flg =o181(1) # equ page-eject-flg val182 /* break page-eject flag (on=e $sort-rec-ctr =a4(4p) # equ sort-rec-ctr cta5-8-p 0c /* total records sorted ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #sort area rl255 on naudtr nacct # head8=h8000(66),PALQ735 BUSINESS PERSONAL PROPERTY ACCOUNTS TO BE AUD' head8=h8066(66),ITED $time' #* #report nacct (accountno) # nname1 (owner name) # nname2 (trade name) # nbploc (location) # naudst (status) # naudtr (auditor) # head1s2=h1000(60),'accountno owner-name trade-name location status auditor' ref=$nacct,'accountno' ref=$nname1,'owner-name' ref=$nname2,'trade-name' ref=$nbploc,'location' ref=$naudst,'status' ref=$naudtr,'auditor' # ctll1=$naudtr,'naudtr' # break 1 naudtr # # continued on the next page -------->
Goto: Begin this document , End this document , UVSI Home-Page
@dtl nop # tag1000 get fili1,a0 # 1000 get inf atend 2000 /* read palname-file (seq by key skp> tag2000 cmc $naudst,c'A' # if naudst = c'A' /* audit status = a? skp! ifb0010 sxp $palname-rec # release palname-rec to sort. /* release name record to s ifb0010 skp tag1000 # ifb0010 goto 1000 # tag2000 sxg $palname-rec # 2000 return sorted into palname-rec atend 2099. /* retur skp> tag2099 add $ca01,onex # accum one in a 4 byte cta. #acum01=$one,'one' # accum one in a 4 byte cta. # checkbreaks on breaks perform 5000 thru 5099. putb filo1,p0 # print report. skp tag2000 # goto 2000. # tag5000 cmc $break-lvl-flg,c'1' # 5000 if break-lvl-flg = c'1' skp! ifb0020 mvc $page-eject-flg,c'E' # move c'E' to page-eject-flg skp tag5099 # goto 5099. ifb0020 cmc $break-lvl-flg,c'F' # ifb0020 if break-lvl-flg = c'F' skp! ifb0030 mvc p0(0029),c'TOTAL AUDIT RECORDS PRINTED =' mvc p30(1),$sort-rec-ctr # move sort-rec-ctr to prt31 skp tag5099 # goto 5099. ifb0030 nop tag5099 ret= # 5099 exit tageoj cls all eoj #-----------------------------------------------------------------------
Note that the above code (page 2 of example 7) will be deleted since uvqrpg can provide similar functionality using only the page 1 declarations. A few manual changes are required to allow deleting the procedural code above.
Goto: Begin this document , End this document , UVSI Home-Page
#*quikjob=palq735 - #* was=i2000q32000s2000t100000 # file inf dtf=miram,bksz=24576,rcsz=255,lfd=palname fili8=${DD_PALNAME},rcs=0255,typ=ISF #<#1-- change fili1 to fili8 for SORT filo8=tmp/palnames,rcs=255,typ=RSF #<#1-- insert filo8 sort output to tmp fili1=tmp/palnames,rcs=0255,typ=RSF #<#1-- insert fili1 sort input from tmp filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR #* lodc1=qq0(32),palname # ++include palname # #sort area rl255 on naudtr nacct sort=255,'205(1),0(9)' #<#2-- uvqrpg equivalent SORT keep=204(1),'A' #<#3-- uvqrpg record sort selection # head8=h8000(66),PALQ735 BUSINESS PERSONAL PROPERTY ACCOUNTS TO BE AUD' head8=h8066(66),ITED $time' #* #report nacct (accountno) # nname1 (owner name) # nname2 (trade name) # nbploc (location) # naudst (status) # naudtr (auditor) # head1s2=h1000(60),'account owner-name trade-name location status auditor count' ref=$nacct,'account' ref=$nname1,'owner-name' ref=$nname2,'trade-name' ref=$nbploc,'location' ref=$naudst,'status' ref=$naudtr,'auditor' acum1=1,'count' #<#4-- insert for count & total ctll1h1=$naudtr,'naudtr' #<#5-- total level 1, option 'h1' for new page # # #<-- all remaining code deleted, not required for uvqrpg --> #-------------------------------------------------------------------------- # # - the only required changes are marked above & summarized below
<#1-- uvqrpg SORT expects input from fili8, outputs to filo8 which is then input to the report via fili1 (as always)
<#2-- sort=255,'205(1),0(9)' <-- uvqrpg equivalent SORT
<#3-- keep=204(1),'A' <-- uvqrpg record sort selection
<#4-- acum1=1,'count' <-- insert for count & total
<#5-- ctll1h1=$naudtr,'naudtr' <-- total level 1, option 'h1' for new page
Goto: Begin this document , End this document , UVSI Home-Page
** PALQ017 QuikJob - original mainframe code BEFORE conversions * * * * OBJECTIVE: PRINT REPORT OF CHANGES TO TRANSFER REFUND DATE * * * FILE INF TYPE=MIRAM,RCSZ=450,BKSZ=2048,LFD=PALACCT,KEYS=YES,INDXBLK=8 * ++INCLUDE VALEQU ++INCLUDE PALACCT EQU START-WST WST EQU OLDDT (6) EQU ATTX (6)-P 2C
TITLE '$JOBNAM$- PALQ017 MAINTAIN TRANSFE' TITLE 'R REFUND DATE $IPLDAT$ $TIM$ PAGE $PG$'
REPORT AACCT (ACCOUNT NUMBER) AITEM (ITEM) ATXYR (TAX YEAR) ATTX (AMOUNT DUE) 2C OLDDT (OLD DATE,) ADTTR (NEW DATE,)
0010 GET INF ATEND 9999
MOVE ZEROES TO ATTX ADD ATTX1 TO ATTX ADD ATTX2 TO ATTX IF ATTX LT P'00000000000' GO TO 20.
IF ADTTR GT C'000000' MOVE ADTTR TO OLDDT MOVE ZEROES TO ADTTR REWRITE INF MOVE SPACES TO ADTTR PRINT REPORT. GO TO 10
0020 IF ADTTR EQ ZEROES MOVE SPACES TO OLDDT MOVE MMDDYY TO ADTTR REWRITE INF PRINT REPORT. GO TO 10
9999 GOTO EOJ
Goto: Begin this document , End this document , UVSI Home-Page
** PALQ017 QuikJob - converted to uvcopy - BEFORE manual changes ** - compare to original mainframe, after conversion,& AFTER manual changes ** - also see the uvqrpg version & notes re which best ?? #* * #* objective: print report of changes to transfer refund date * #* * was=k2000q32000s2000t100000 # file inf type=miram,rcsz=450,bksz=2048,lfd=palacct,keys=yes,indxblk=8 fili1=${DD_PALACCT},rcs=0450,typ=ISFl1 filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR # lodv3c1=h0(200) $jobname $jobid $logname $datetime ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),valequ # ++include valequ lodc1=qq0(32),palacct # ++include palacct lodc1=qq0(32) $start-wst =k0(0) # equ start-wst wst $olddt =k0000(6) # equ olddt (6) $attx =k0006(6p) # equ attx (6)-p 2c ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodv3c1=hh0(200) $jobname - PALQ017 MAINTAIN TRANSFE R REFUND DATE $date $time page#### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #report aacct (account number) # aitem (item) # atxyr (tax year) # attx (amount due) 2c # olddt (old date,) # adttr (new date,) # lodv3c1=hh0(200) account-number item tax-year amount-due old-date new-date ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mvc $account-number,$aacct mvc $item,$aitem mvc $tax-year,$atxyr edt $amount-due,$attx,'zzzz,zzz.99-' mvc $old-date,$olddt mvc $new-date,$adttr
#########################################################################
See palq017 @run instructions continued on the next page ---------------->
This is a quikjob 'REPORT' conversion - the 'REPORT' definition above is usually best handled by converting to 'uvqrpg', but the update in place requires 'filr1' (vs fili1) which is only possible with 'uvcopy'.
The 'uvcopy' version will require more manual changes. Please compare this to the AFTER changes listing 2 pages ahead. We will move the 6 'mvc/edt' instructions above to the end & setup as a sub-routine, so we can 'bal' to it from 2 places in the code (see 'PRINT REPORT' on the next page).
Goto: Begin this document , End this document , UVSI Home-Page
@run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) wtbe filo1,h0(200),h0(200) dump headings to outfile # tag0010 get fili1,a0 # 0010 get inf atend 9999 skp> tag9999 # mvc $attx,$zeros # move zeroes to attx add $attx,$attx1 # add attx1 to attx add $attx,$attx2 # add attx2 to attx cmn $attx,0 # if attx lt p'00000000000' skp< tag0020 # goto 20. < # cmc $adttr,c'000000' # if adttr gt c'000000' skp<= ifb0010 mvc $olddt,$adttr # move adttr to olddt mvc $adttr,$zeros # move zeroes to adttr upd fili1,a0 # rewrite inf mvc $adttr,$spaces # move spaces to adttr putb filo1,p0 # PRINT REPORT <-- see below ifb0010 skp tag0010 # ifb0010 goto 10 # tag0020 cmc $adttr,$zeros # 0020 if adttr eq zeroes skp! ifb0020 mvc $olddt,$spaces # move spaces to olddt mvc $adttr,$mmddyy # move mmddyy to adttr upd fili1,a0 # rewrite inf putb filo1,p0 # PRINT REPORT <-- see below ifb0020 skp tag0010 # ifb0020 goto 10 # tag9999 skp tageoj # goto eoj tageoj cls all eoj
###########################################################################
These conversion notes continue from bottom of previous page.
The 'mvc' instructions generated from the quikjob 'REPORT' definition will be moved here & setup as a subroutine, so we can 'bal' to it from the 2 places marked above.
See the results on the 'AFTER CHANGES' listing 2 pages ahead ---------->
Goto: Begin this document , End this document , UVSI Home-Page
## PALQ017 QuikJob - converted to uvcopy - AFTER manual changes ## - compare to original mainframe, after conversion,& BEFORE manual changes ## - also see the uvqrpg version & notes re which best ?? #* * #* objective: print report of changes to transfer refund date * #* * was=k2000q30000s2000t100000 # file inf type=miram,rcsz=450,bksz=2048,lfd=palacct,keys=yes,indxblk=8 # fili1=${DD_PALACCT},rcs=0450,typ=ISF #<-- as generated filr1=${DD_PALACCT},rcs=0450,typ=ISF #<-- CHANGE fili1 to filr1 for update filo1=${DD_PRNTR},rcs=256,typ=LSTt fild7=${RUNLIBS}/qjcs,rcs=80,typ=DIR # lodv3c1=h0(200) $jobname $jobid $logname $datetime ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),valequ # ++include valequ lodc1=qq0(32),palacct # ++include palacct lodc1=qq0(32) $start-wst =k0(0) # equ start-wst wst $olddt =k0000(6) # equ olddt (6) $attx =k0006(6p) # equ attx (6)-p 2c # # next 6 $symbols added manually (uvcopy conversion of REPORT function) $account-number =p00(9) # $item =p16(3) # $tax-year =p21(2) # <-- $symbols added manually $amount-due =p30(12) # - using dsp(lth)'s calculated below $old-date =p44(6) # - see 0(9) 16(3) 21(2) etc $new-date =p53(6) # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodv3c1=hh0(200) $jobname PALQ017 MAINTAIN TRANSFER REFUND DATE $date $time page#### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #> put TITLE parts together TRANSFE R (shift 4 left ??) #report aacct (account number) # aitem (item) # atxyr (tax year) # attx (amount due) 2c # olddt (old date,) # adttr (new date,) # lodv3c1=hh0(200) account-number item tax-year amount-due old-date new-date ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # 0(9) 16(3) 21(2) 30(12) 44(6) 53(6) # # - uvcopy does not simulate REPORT as well as uvqrpg, but is often best # - I suggest you note the field dsplcmnts(& lengths) as shown above # (determine by moving cursor to fieldname & noting CRT column) # - then makeup $symbol equates for the 6 fields as shown 15 lines above # - then move the 6 mvc/edt generated instrns to wherever 'PRINT REPORT' # occurs within the quikjob (occurred 2x, so we made it a bal subrtn).
Goto: Begin this document , End this document , UVSI Home-Page
@run opn all open files clr t0(100000),'~' clear table to all tildes clr h400(200),'~' mark end 2 hdrs 200 each (change if more) wtbe filo1,h0(200),h0(200) dump headings to outfile # #tag0010 get fili1,a0 # 0010 get inf atend 9999 <-- original tag0010 redm2 filr1,a0 # 0010 get inf atend 9999 <-- mod for upd skp> tag9999 # #?# mvc $attx,$zeros # move zeroes to attx <-- generated WRONG mvn $attx,0 # move 0 to attx <-- NOTE correction add $attx,$attx1 # add attx1 to attx add $attx,$attx2 # add attx2 to attx cmn $attx,0 # if attx lt p'00000000000' skp< tag0020 # goto 20. < # cmc $adttr,c'000000' # if adttr gt c'000000' skp<= ifb0010 mvc $olddt,$adttr # move adttr to olddt mvc $adttr,$zeros # move zeroes to adttr #< upd fili1,a0 # rewrite inf <-- original upd filr1,a0 # rewrite inf <-- mod for upd # update requires change fili1 to filr1 & get to redm2 (get next) mvc $adttr,$spaces # move spaces to adttr bal rept # PRINT REPORT <-insert bal ifb0010 skp tag0010 # ifb0010 goto 10 # tag0020 cmc $adttr,$zeros # 0020 if adttr eq zeroes skp! ifb0020 mvc $olddt,$spaces # move spaces to olddt mvc $adttr,$mmddyy # move mmddyy to adttr #< upd fili1,a0 # rewrite inf <-- original upd filr1,a0 # rewrite inf # update requires change fili1 to filr1 & get to redm2 (get next) bal rept # PRINT REPORT <-insert bal ifb0020 skp tag0010 # ifb0020 goto 10 # tag9999 skp tageoj # goto eoj tageoj cls all eoj #----------------------------------------------------------------- # rept - subrtn to PRINT REPORT # - instrns generated by converter from REPORT fields # - moved here & bal rept inserted above at 2 places # & original 2 put's reduced to 1 here rept mvc $account-number,$aacct mvc $item,$aitem mvc $tax-year,$atxyr edt $amount-due,$attx,'zzzz,zzz.99-' mvc $old-date,$olddt mvc $new-date,$adttr putb filo1,p0 # PRINT REPORT ret=
Goto: Begin this document , End this document , UVSI Home-Page
Conversion percentage depends on the nature of the mainframe quikjob. Some jobs such as file manipulations & simple field listings will convert 100%, but others will require close inspection and manual fixups. In any case the quikjob2 converter will save a lot of keyboarding.
--------------------- post conversion fixups --------------------------
was=i2000q32000s2000t100000 # file inf dtf=tape,bksz=6328,rcsz=113,lfd=pubmred fili1=${DD_PUBMRED},rcs=0113,typ=RSFl1 # file inc dtf=miram,bksz=8192,rcsz=2048,indxblk=1,lfd=pubrate fili3=${DD_PUBRATE},rcs=2048,typ=ISFl1 # file ofa dtf=miram,bksz=6375,rcsz=255,k1loc=1,k1len=40,indxblk=8 filo2=${DD_OFA},rcs=0255,typ=ISFl0,isk1=S(L) filo1=${DD_PRNTR},rcs=256,typ=LSTt
1a. Check file typ=___ assignments typ=RSFl1 - Record Sequential Fixed, l1=lock option 'read only/input' typ=ISFl1 - Indexed Sequential Fixed, l1=lock option 'read only/inpit' typ=ISFl0 - Indexed Sequential Fixed, l0=lock option 'exclusive/output' - see uvcopy2.doc in volume 2 of UV doc for complete details
There may a few cases where the converter could not determine whether input file is RSF or ISF. Default is RSF, may have to change.
1b. Watch for 'isk1=S(L)', the converter does not convert the output keys. Please note 'k1loc=1,k1len=40' of file OFA/filo2 above. You would change 'isk1=S(L)' to 'isk1=0(40)'. Note that QuikJob key location was 1 relative, but uvcopy is 0 relative.
# file ofa dtf=miram,bksz=6375,rcsz=255,k1loc=1,k1len=40,indxblk=8 filo2=${DD_OFA},rcs=0255,typ=ISFl0,isk1=0(40)
Goto: Begin this document , End this document , UVSI Home-Page
QJfile UVfile UVarea sizedefault ================================================================= INF fili1 a 1024 input file #1 DET fili2 b 1024 input file #2 INC fili3 c 1024 input file #3 IND fili4 d 1024 input file #4 print filo1 p 1024 print area OFA filo2 e 1024 output file #1 OFB filo3 f 1024 output file #2 OFC filo4 g 1024 output file #3 HDA+ page-hdngs h 1024 page headings WST work i 2000 quikjob work area j-n 1024 available for user changes VALEQU QJ special o 1024 EQU $symbols q 32000 allows 1000 $symbols (32 bytes each) r 1024 available to user SAV save area s 2000 quikjob save area TBL tables t 100000 table storage u-z ..... uvcopy/uvqrpg reserved areas (see uvcopy2.doc in vol 2 of UVdoc)
uvcopy areas are assigned as follows (prior to files, see prior page)
was=i2000q32000s2000t100000 ===========================
# file inc dtf=miram,bksz=8192,rcsz=2048,indxblk=1,lfd=pubrate fili3=${DD_PUBRATE},rcs=2048,typ=ISFl1
So you would have to specify area 'c' as 2048 in the 'was' stmnt:
was=i2000q32000s2000t100000c2048 <-- area 'c' specified as 2048 bytes ================================
Goto: Begin this document , End this document , UVSI Home-Page
Watch for 'mvc's (move character) that should be 'mvn's (move numeric) & for 'cmc's (compare character) that should be 'cmn's (compare numeric). If op1 & op2 are different lengths you must change 'mvc' to 'mvn' or 'cmc' to 'cmn'. The converter does not always know the correct type especially if $symbols are used & fields have been unpacked. For example:
$sale =a101(5) #equ sale (5) $tax =a106(5) #equ tax (5) $total-sale =a110(7) # equ total-sale (007)
mvc $total-sale,$sale # move sale to total-sale add $total-sale,$tax # add tax to total-sale cmc $total-sale,c'0010000' # /* over $ 100.00 ?
The 'mvc' is WRONG because it moves left to right & because uvcopy/uvqrpg do not imply decimal points (the programmer must keep track). For example
Before mvc: sale=123.45, tax=008.25, total-sale=00000.00 After mvc: sale=123.45, tax=008.25, total-sale=12345.00 After add: sale=123.45, tax=008.25, total-sale=12353.25
The mvc length is determined only by the operand 1 length (7 in this case) so the 5 digit sale is moved to 1st 5 bytes of total-sale & then 1st 2 bytes of tax (following field) are moved to the 7 byte total-sale field (in effect multiplying by 100, obviously all wrong).
The solution is to change any such 'mvc's of numeric fields to 'mvn's.
mvn $total-sale,$sale # move sale to total-sale add $total-sale,$tax # add tax to total-sale cmn $total-sale,10000 # /* over $ 100.00 ?
'mvn' respects different length operands, in effect moves right to left & zero-fills any extra length on the left side of operand 1.
The original 'cmc' with op2 c'0010000' would work OK, because the quickjob programmer always padded the constant to the same length, but the 'cmn' would be necessary for fields of different lengths.
I recommend you use the vi editor /search command to 'search next' thru all 'mvc's in the program & change to 'mvn' when the operands are numeric. Then 'search next' thru all 'cmc's & change to 'cmn' as required.
This problem is caused by unpacking, both quikjob & uvcopy work OK with packed fields of different lengths, but unpacked fields are not identified as numeric vs character.
Of course you must be careful not to change non-numeric fields or fields that are more than 10 bytes which is the maximum for numeric fields. (will be 16 bytes for UnixWare 7.1.1).
Goto: Begin this document , End this document , UVSI Home-Page
Do not change 'mvc's to numeric unpacked fields from '$zeros'. Would be wrong if op1 were packed, would be OK if unpacked, but 'mvn' would cause error message since $zeros is 300 bytes long & numerics are checked for greater than 16 bytes.
mvc $attx,$zeros - $zeros is character, $attx is numeric - this will work if $attx is unpacked numeric mvn $attx,0 <-- this works for packed or unpacked mvn $attx,0 <-- must change to this if $attx is packed
QJ example: IF INF21-25 = C'00123' - QuikJob comparison char/numeric ?
conversion: cmc a20(5),c'00123' - uvcopy conversion
correction: cmn a20(5),123 - might change 'cmc' to 'cmn' & char constant to numeric constant
QJ example: IF INF31-33 = P'00123' - Quikjob compare on packed field
conversion: cmn a30(3p),123 - uvcopy conversion OK
There may be some circumstances where character instructions may need to be changed to numeric equivalents (mvc to mvn, cmc to cmn).
The cmc .. c'00123' does not need to be changed - ie character compares will work as long as the fields are same length & both zero filled.
But numeric comparisons are better since the fields do not have to be the same lengths & any constants do not have to be zero filled.
Goto: Begin this document , End this document , UVSI Home-Page
Watch for multiply/divide/rounding with decimal place adjustments. Some fields may not be big enough to hold the results of the multiply inserted prior to divide, which is required to develop extra decimal places &/or for rounding. Consider the following example:
$usage =i231(7) # equ usage $days =i238(3) # equ days $avg =i241(7) # equ avg <-- NOT BIG ENOUGH ??? $xxx =i248(5) # equ xxx
# DIVD USAGE 0D BY DAYS 0D GIVING AVG 4DR. <-- original QuikJob Divide
mvn $avg,$usage # divd usage 0d by days 0d giving avg 4dr mpy $avg,100000 # divd usage 0d by days 0d giving avg 4dr div $avg,$days # divd usage 0d by days 0d giving avg 4dr add $avg,5 div $avg,10
The converter generates 5 instructions: 1. move dividend to result field 2. multiply by 10... to develop decimal places specified in result + extra for rounding (10000 for 4 decimals * 10 for rounding). 3. DIVIDE by the divisor 4. add 5 for rounding 5. divide by 10 to drop the extra decimal place for rounding
$avg =i241(7) # equ avg <-- NOT BIG ENOUGH ???
It is obvious that we need to increase the size of '$avg' to allow for multiply by 100000, but if we increase in its original p[osition we would have to increase any following fields. Since this is the quikjob/ uvcopy WST/working storage, we can just reassign to a higher position beyond all current WST fields, for example:
$avg =i500(12) # equ avg <-- reassigned & enlarged
You would have to watch for any divides within a record layout which you cant change. Then you could do the divide in an alternate field & move back after. Would be convenient to use 1 of the uvcopy built-in counters $ca1, $ca2, etc. This would require 1 extra instruction:
mvn $ca1,$usage # divd usage 0d by days 0d giving avg 4dr mpy $ca1,100000 # divd usage 0d by days 0d giving avg 4dr div $ca1,$days # divd usage 0d by days 0d giving avg 4dr add $ca1,5 div $ca1,10 mvn $avg,$ca1 # <-- extra instrn, move results back
I recommend you use the vi editor to search for all /mpy instructions & for decimal place expansion prior to divide & modify if required.
Goto: Begin this document , End this document , UVSI Home-Page
5a. REWRITE - requires several changes because uvcopy does not allow updates to sequential input file 'fili1' - but you can change 'fili1' to 'filr1' random file - change 'get fili1' to 'redm2 filr1' (read next) - change 'upd fili1' (from REWRITE) to 'upd filr1' - see example#9 in this document
5b. REPORT - uvcopy only partially converts - generates 'mvc's for the fields where REPORT is specified - you must move to 'PRINT REPORT' location in code - you also have to setup $symbols for the print fields & determine positions from the heading line generated (see sample conversion in example#9)
6a. For uvqrpg, you must remove 'get' instructions for the primary file & any skip back to repeat the instruction loop for each primary record.
6b. REWRITE - as of June 2000, uvqrpg would not do the job in example#9. - because the built in cycle reads from 'fili1' with 'get' - we need filr1 with redm2 to allow upd.
Goto: Begin this document , End this document , UVSI Home-Page
# TABLSPEC 1250 01 04 05 26 <-- info only - - - - - - - - # CALL TBLSRT TSA1 C'30' C'01' C'04' C'A' C'C'
srtn1 t0(30),t0(4),5000 <-- uvcopy/uvqrpg equivalent
IF PRT67-70 IS ONTABLE MOVE FUN1-18 TO PRT72.
lokz1 tt0(__),tt0(__),p66(4) <-- converter omits entrylth&keylth skp! 01 mvc p71(18),tt0(18) <-- table entry adrs tt0 incorrect
lokz1 tt0(30),tt0(04),p66(4) <-- manual fixup entry lth & keylth skp! 01 mvc p71(18),tt4(18) <-- manual fix dsplcmnt tt0 to tt4
Goto: Begin this document , End this document , UVSI Home-Page
SET PTA DET21 --> mvn $ra,20 --- MOVE PTA1-2 TO PRT41 --> mvc p40(2),ba0(2) |^-----register 'a' ^------area 'b'
QUikJob: SORT AREA RL75 ON OFA21-26 - will not be converted
convert: # sort area rl75 on ofa21-26 - just #commented out
correct#1: sxo 75,'20(6)' <-- insert uvcopy equivalent at init
correct#2: sxs <-- also need to insert sort execute
note |
|
SORT FILE was built in to QuikJob and would require more manual coding than SORT AREA (described above). You would have to code 'sxp' (put to sort) & 'sxg' (get from sort), as well as 'sxo' & 'sxs'.
However in some cases, you can completely replace the SORT FILE quikjob with a 1 line 'uvsort' directly in the JCL/script that called the quikjob. uvsort has select/delete capability that might be used in quikjobs. See example#5 on page 'H1'.
Goto: Begin this document , End this document , UVSI Home-Page
Most quikjobs do not explicitly code open & close. The uvcopy converter assumes this & inserts 'opn all' at the begining of the program.
So for those jobs that do code open & close you will have to analyze why & correct accordingly. Open & close are probably used where a program might have had variable number of input tapes or wrote a file which was then read back in , etc.
For example assume a program has opens & closes for the input file but none for the output file, modify as follows:
converted: opn all ... opn fili1 ... cls fili1 ... cls all eoj
corrected: opn filo1 <-- replace 'opn all' with opens only for files that quikjob did not open --- - same cls all - cls all is OK regardless (only closes files yet unclosed)
QuikJob: EQU YEAR+1 WST21-24
convert: $year+1 =i20(4)
correct: $year_1 =i20(4) <-- remove/change '+'
Goto: Begin this document , End this document , UVSI Home-Page
For QuikJobs with over 500 lines of instructions (comments dont count) will require the 'rop=j' option to specify a larger instruction area. The 'rop=j' option needs to be inserted prior to the 'was=' (work area sizes) and the file declarations (fili1=..., filo1=..., etc). For example:
rop=j128000 |
|
rop=j64000 |
|
The uvcopy conversion presumes not more than 2 headers (HDA & HDB). An instruction is generated at the begining to ensure the header storage area is terminated after HDA & HDB. For example:
clr h400(200),'~' mark end 2 hdrs 200 each (change if more)
You will need to modify if more than 2 headers are used. For 3 headers:
clr h600(200),'~' <-- mark end table after 3 hdrs (200 each)
This is relevant if the program is building headers in HDA, HDB, HDC, etc & using DOHEADERS to write the headings to the print file.
wtbe filo1,h0(200),h0(200) <-- doheaders converted to wtbe
If the headrs were built via HDRA, HDRB, HDRC, etc declarations then the conversion would have already stored the line of tildes after the last HDR declared.
Goto: Begin this document , End this document , UVSI Home-Page
Example |
|
MOVE C'CONSLOG ' TO DPS042-MODE MOVE SPACES TO DPS042-DISPLAY MOVE C'PALPAYT READ' TO DPS042-DISPLAY CALL DPS042 DPS042-MODE MOVE SPACES TO DPS042-DISPLAY MOVE PAYT-READ TO DPS042-DISPLAY CALL DPS042 DPS042-MODE
#- mvc a41(10),c'CONSLOG ' #- mvc a41(1),$spaces #- mvf a41(0012),c'PALPAYT RECS' #- call dps042 dps042-mode #- mvc a41(1),$spaces #- mvc a41(1),$payt-read #- call dps042 dps042-mode
mvf j0(80),'PAL019W RECS ' #+ format msg in area 'j' edt j14(8),$sort-cnt,'zzz,zz9-' #+ edit value beside hdng msg j(60) # display msg on console
The converter converts 'DPS042-XXX' to a41(1) because DPS042 looks like an area address (like INF21-25, DET31-50, etc). The length is often (1) because the '-XXX' has no numeric value.
We have replaced the 6 MOVEs & 2 CALLs with 3 instructions as shown above. We will show the field-heading & the field-value side by side (vs 2 lines). The MOVE SPACES to clear is unnecessary since the 'mvf' instruction moves the constant & clears the remainder of the 80 byte area.
Note that areas j,k,l,m,n are not used by the quikjob converter & are available for you to use as you see fit.
Also note the convention of showing QUIKJOB lines disabled & uvcopy enabled.
'#-' - indicates a quikjob conversion line disabled - usually in cols 1 & 2 to disable entire line
'#+' - indicates a uvcopy line inserted - usually on the right side of the uvcopy instruction inserted
Goto: Begin this document , End this document , UVSI Home-Page
Watch for 'PERFORM THRU' where thre is an 'EXIT' prior to the line# specified on the THRU line#. Here is a sample of OS3 & uvcopy code:
PERFORM 5000 THRU 5099. --- 5000 ... ... 5050 EXIT ... 5099 EXIT
bal tag5000 --- tag5000 ... ... tag5050 ret= ... tag5099 ret=
The converter does not consider the THRU line# (5099 in this case), but returns on the 1st EXIT (tag5050 ret= in this case). I dont think many quikjobs would be coded this way, but you must be aware of the possibility.
Goto: Begin this document , End this document , UVSI Home-Page
This section will document some more things to 'WATCH OUT FOR', things that dont convert automatically & require inspections & fixups.
QuikJob include a 'VAL' area which stored some useful values which programs could use or test status after certain operations. Here is the VAL area Equates with any uvcopy equivalents noted on the right side.
uvcopy equivalent EQU UNDLEN VAL1-4-P /* LEN.LAST UNDEF REC READ EQU IPLDAT VAL5-12 /* IPL DATE MM/DD/YY $date EQU MONTH VAL13-21 /* MONTH-FULL SPELLING $longdate EQU UPSI-0 VAL22 /* *0000000 EQU UPSI-1 VAL23 /* 0*000000 EQU UPSI-2 VAL24 /* 00*00000 EQU UPSI-3 VAL25 /* 000*0000 EQU UPSI-4 VAL26 /* 0000*000 EQU UPSI-5 VAL27 /* 00000*00 EQU UPSI-6 VAL28 /* 000000*0 EQU UPSI-7 VAL29 /* 0000000* EQU REMNDR VAL30-37-P /* DIVIDE REMAINDER $rem EQU JOBNAM VAL38-45 /* JOB NAME $jobname EQU IOSTAT VAL46-49 /* IO STATUS-0000=OK,0004=BAD EQU MMYYDD VAL50-55 /* DATE, IN MMDDYY FMT $mmddyy EQU MMDDYY VAL50-55 /* DATE, IN MMDDYY FORMAT $mmddyy EQU YYMMDD VAL56-61 /* DATE, IN YYMMDD FORMAT $yymmdd EQU SYSTIM VAL62-66 /* TIME, IN HH.MM FORMAT $time EQU ABNDCD VAL67-70 /* ABEND CODE EQU JULDAT VAL71-75 /* JULIAN DATE YYDDD EQU BRKLVL VAL180 /* LEVEL NO. PRESENT BREAK EQU PRTSW VAL181 /* PRINT TOTALS SWITCH EQU EJCTSW VAL182 /* PAGE EJECT SWITCH EQU INFEOF VAL196 /* INF END-OF-FILE ~EOF in area 'a' EQU DETEOF VAL197 /* DET END-OF-FILE ~EOF in area 'b' EQU INCEOF VAL198 /* INC END-OF-FILE ~EOF in area 'c' EQU INDEOF VAL199 /* IND END-OF-FILE ~EOF in area 'd' EQU SRTEOF VAL200 /* SORT END-OF-FILE EQU RECLEN VAL201-204 /* REC. LEN (SORT, AREA-V) EQU CALLEN VAL205-208-B /* LEN. LAST MODULE CALLED EQU RECCNT VAL209-212-B /* REC COUNT (LAST FILE USED) EQU RECNO VAL213-216-B /* RELATIVE RECORD NO. (MIRAM) EQU CURKEY VAL217 /* CURRENT KEY OF REFERENCE EQU DUPS VAL218-222 /* (DTF ONLY) KEY W/DUPS EQU SCANCT VAL225-228-B /* SCAN COUNT (WHEN INCLUDE) EQU LSTFIL VAL229-231 /* NAME OF LAST FILE USED $fili1,$fili2,etc EQU DTFCDM VAL232-235-B /* DTF/CDIB MEMORY ADDRESS
Goto: Begin this document , End this document , UVSI Home-Page
uvcopy & uvqrpg do not store UPSI as did QuikJob, but if the calling script was converted from mainframe JCL by 'jclunix2' (Vancouver utility converter) then you could test the $UPSI environmental variable set by the script. For example you could test UPSI-1 as follows:
mvfv3 j0(8),'${UPSI}' store UPSI value in any unused area cmc j1(1),'1' UPSI-1 on ? skp= xxx
Many quikjobs set UPSI-0 to '1' to indicate an error condition to the calling JCL. They would set UPSI-0 on at begining & off at succesful EOJ and any ABEND would cause UPSI-0 to be still ON if the job abended.
MOVE '1' to UPSI-0 <-- at begin job ABEND <-- would mean UPSI-0 ON at EOJ MOVE '0' to UPSI-0 <-- at successful End of Job
By convention UNIX scripts test the return code.
if [ $? -gt 0 ]; then echo "job error, enter to exit"; read; exit 9; fi
The cancel 'can' instruction will set a nonzero return code, whereas the normal 'eoj' instruction sets retun code zero.
9998 IF VAL22-24 = C'111' GOTO 9999. MOVE C'0' TO VAL22 9999 GO TO EOJ END
tag9998 cmc o21(3),c'111' # 9998 if val22-24 = c'111' skp= tag9999 # goto 9999. = mvc o21(1),c'0' # move c'0' to val22 tag9999 skp tageoj # 9999 goto eoj tageoj cls all eoj
You might see the above code at the end of a quickjob. The converted quikjob (now uvcopy) does not load UPSI nor pass UPSI back to the JCL, but in this case the quikjob code (prior to eoj code shown) has set the VAL22-24 (UPSI) switches to '111' to signal some error condition. I suggest modifying the code as shown below:
tag9998 cmc o21(3),c'111' # 9998 if val22-24 = c'111' skp= tag9999 # goto 9999. = msg 'error - ?????' <-- display appropriate error message ? can <-- cancel to return non-zero to script tag9999 skp tageoj # 9999 goto eoj tageoj cls all eoj
Goto: Begin this document , End this document , UVSI Home-Page
1000 GET INF IF INFEOF EQ C'E' GO TO 9000.
tag1000 get fili1,a0 # 0035 get inf skp> tag0000 cmc $infeof,c'E' # if infeof eq c'E' skp= tag9000 # goto 9000
The above code wont work since uvcopy does not store '$infeof' in VALEQU. Most quikjobs use the 'ATEND' test which does convert correctly for example:
1000 GET INF ATEND 9000.
tag1000 get fili1,a0 # 1000 get inf atend 9000. skp> tag9000
So you can simply change the 4 instructions from conversion to the 2 instructions that would be created by the ATEND version.
References to the 'VAL' area will be converted to area 'o', for example:
IF VAL196 = C'E' GOTO 9000.
cmc o195(1),c'E' # if val196 = c'E' skp= tag9000 # goto 9000. =
If you needed a delayed test for EOF vs testing condition code immediately (as shown above in the ATEND conversion), then you could test the file area for '~EOF' in 1st 4 bytes, for example:
cmc a0(4),'~EOF' skp= tag9000
Goto: Begin this document , End this document , UVSI Home-Page
1000 PERFORM 5000 THRU 5099 IF INFEOF EQ C'E' GOTO 1500
--------------
5000 GET INF EXIT
tag1000 bal tag5000 cmc $infeof,c'E' # if infeof eq c'E' skp= ifb1500
------------
tag5000 get fili1,a0 # 0035 get inf skp> tag0000 ret=
tag1000 bal tag5000 cmc $infeof,c'E' # if infeof eq c'E' skp= ifb1500
------------
tag5000 get fili1,a0 # 0035 get inf skp= tag5099 #+ go exit if cc = (not EOF) mvc $infeof,c'E' #+ set EOF switch tag5099 ret=
This is the best solution because you only need to modify the subrtn & not the perform/bals (could be multiple). Note that '#+' marks the only lines needing changes.
Goto: Begin this document , End this document , UVSI Home-Page
READKEY DET USING INF1 IF IOSTAT EQ C'0004' MOVE C'NO PALNAME RECORD FOUND' TO SNAME1.
redm5 fili2,b0 # readkey det using inf1 skp= tag____ cmc $iostat,c'0004' # if iostat eq c'0004' skp! 1 mvc $sname1,c'NO PALNAME RECORD FOUND'
uvcopy sets the condition code to indicate the I/O STATUS, so in this case just remove 2 instructions (cmc & skp!) and change the tag____ to ifb0010.
redm5 fili2,b0 # readkey det using inf1 skp= ifb0010 mvc $sname1,c'NO PALNAME RECORD FOUND' ifb0010 nop
Goto: Begin this document , End this document , UVSI Home-Page
PERFORM 5000 IF IOSTAT EQ C'0004' MOVE C'NO PALNAME RECORD FOUND' TO SNAME1.
---------------------
5000 READKEY DET USING INF1 EXIT
bal tag5000 cmc $iostat,c'0004' # if iostat eq c'0004' skp! 1 mvc $sname1,c'NO PALNAME RECORD FOUND'
-------------------
tag5000 redm5 fili2,b0 # readkey det using inf1 skp= tag____ ret=
bal tag5000 cmc $iostat,c'0004' # if iostat eq c'0004' skp! 1 mvc $sname1,c'NO PALNAME RECORD FOUND'
-------------------
tag5000 mvc $iostat,c'0000' #+ presume I/O stat good redm5 fili2,b0 # readkey det using inf1 skp= tag5099 #+ skip if cc = (I/O good) mvc $iostat,c'0004' #+ set I/O stat BAD tag5099 ret=
This is the best solution because you only need to modify the subrtn & not the perform/bals (could be multiple). Note that '#+' marks the only lines needing changes.
Goto: Begin this document , End this document , UVSI Home-Page
You should check the FILE conversions, since there are some situations that can not be converted automatically. Note that the original Mainframe FILE code is shown as a #comment before the converted equivalent:
# file#1 inf dtf=miram,bksz=4224,rcsz=127,keys=yes,lfd=pal671w fili1=${DD_PAL671W},rcs=0127,typ=ISFl1 # # file#2 det dtf=miram,bksz=8000,rcsz=80,lfd=pal672w fili2=${DD_PAL672W},rcs=0080,typ=RSF # # file#3 inc dtf=miram,bksz=1000,rcsz=100,keys=no,lfd=pal673w fili2=${DD_PAL673W},rcs=0100,typ=RSFl1 # # file#4 ofa dtf=miram,bksz=4224,rcsz=127,lfd=pal674w,keys=yes,k1loc=1,k1len=9 filo2=${DD_PAL674W},rcs=0127,typ=ISF,isk1=S(L)
file#1 |
|
file#2 |
|
file#3 |
|
file#4 |
|
If you are unpacking files with packed fields, you must check for possible changes in record sizes & key locations. Input Indexed files may still work but Sequential files & all output files must be updated to new rcszs & keys.
Goto: Begin this document , End this document , UVSI Home-Page
Watch for references to fieldnames in preceding ++INCLUDE copybooks. For example PUBQWATS copybook defines the 'W-ADDRESS' field which occurs 450 bytes up in the record layout, but this is not known to the converter so it converts the displacement as '0000'.
EQU PUBQWATS WST ++INCLUDE PUBQWATS *** REDEFINITION OF ADDRESS FIELD IN PUBWATS *** EQU W-ADDRESS EQU W-HOUSE (006) EQU W-STREET (016)
lodc1=qq0(32) $pubqwats =i0(0) # equ pubqwats wst ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),pubqwats # ++include pubqwats #******* redefinition of address field in pubwats ******* lodc1=qq0(32) $w-filler =i0000(0) # equ ws-filler <-- WRONG $w-house =i0000(006) # equ w-house (006) <-- WRONG $w-street =i0006(016) # equ w-street (016) <-- WRONG
lodc1=qq0(32) $pubqwats =i0(0) # equ pubqwats wst ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lodc1=qq0(32),pubqwats # ++include pubqwats #******* redefinition of address field in pubwats ******* lodc1=qq0(32) $w-filler =i0450(0) #+ equ ws-filler <-- corrected $w-house =i0450(006) #+ equ w-house (006) <-- corrected $w-street =i0456(016) #+ equ w-street (016) <-- corrected
You need to examine the 'pubqwats' copybook (qjcs/pubqwats) to see what the true displacement of the 'w-filler' symbol, which in this case was:
$w-filler =i0450(0) #+ equ ws-filler
You can then modify the displacments of any following definitions as shown above.
You might check any displacement '0000' but there are many legitimate '0000' displacements.
Goto: Begin this document , End this document , UVSI Home-Page
Here is an easier way to find quikjob conversion problems - use the editor to search for patterns that represent incomplete conversions.
a. /tag0000 <-- search for missing EOF tests ========
/tag____ <-- also search for this ========
QJ example: GET INF - vs GET INF ATEND 9000
conversion: get fili1,a0 skp> tag0000 - tag0000 generated when no ATEND
correction: get fili1,a0 skp> tag_____ <-- need to research or use VALEQU correction below
b. /val[0-9] - search for refernces to VALEQU (not converted) =========
QJ example: IF VAL196 = C'E' - test EOF on INF file
conversion: cmc o195(1),c'E' - VALEQU converted to area 'o' but area 'o' not stored by uvcopy
correction: cmc a0(4),'~EOF' - uvcopy stores '~EOF' in record area
c. /(1) - search for incorrect field lengths ==== - converter uses (1) when length cannot be determined so any (1) lengths are suspicious & need to be checked
QJ example: MOVE REC-COUNT TO PRT61 - length will not be determined
conversion: mvc p60(1),$rec-count - (1) used when length unknown
correction: mvc p60(5),$rec-count - research $symbols to find length
Goto: Begin this document , End this document , UVSI Home-Page
d1. /mvc <-- check all 'mvc's, change to 'mvn' if numeric ====
d2. /cmc <-- check all 'cmc's, change to 'cvn' if numeric ====
Watch for 'mvc's (move character) that should be 'mvn's (move numeric) & 'cmc's (compare character) that should be 'cmn's (compare numeric). If op1 & op2 are different lengths you must change 'mvc' to 'mvn' or 'cmc' to 'cmn'. The converter does not always know the correct type especially if $symbols are used & fields have been unpacked.
<------- please see the full explanation & examples on page 'M3'.
e. /mpy <-- check multiply for extra decimals before divide ====
Watch for multiply/divide/rounding with decimal place adjustments. Some fields may not be big enough to hold the results of the multiply inserted prior to divide, which is required to develop extra decimal places &/or for rounding. Consider the following example:
$usage =i231(7) # equ usage $days =i238(3) # equ days $avg =i241(7) # equ avg <-- NOT BIG ENOUGH ??? $xxx =i248(5) # equ xxx
# DIVD USAGE 0D BY DAYS 0D GIVING AVG 4DR. <-- original QuikJob Divide
mvn $avg,$usage # divd usage 0d by days 0d giving avg 4dr mpy $avg,100000 # divd usage 0d by days 0d giving avg 4dr div $avg,$days # divd usage 0d by days 0d giving avg 4dr add $avg,5 div $avg,10
Note |
|
Goto: Begin this document , End this document , UVSI Home-Page
f1. /c\'& - search for &symbols (global substitutions) set in JCL =====
QJ example: MOVE C'&TITLE' TO PRT51 - &symbols set in JCL
conversion: mvc p50(6),C'&TITLE' - & needs conversion to ${...} - length also needs correction
correction: mvfv2 p50(20),C'${TITLE}' - research print layout for length
f2. Here is another example of the '&symbol' problem that requires an extra instruction - when the substitution value is smaller than the ${...} symbol & there is no extra room available. In this case use a 3rd area for ther extra length (area j below) & then move the substitution value back to the intended area. &CODE is only 1 byte & we cannot destroy any following bytes.
QJ example: MOVE C'&CODE' TO WST1 - capture 1 byte code
conversion: mvc i0(1),C'&CODE' - original conversion
correction: mvfv2 j0(7),'${CODE}' - use area j for required length mvc i0(1),j0 - then move value to 1 byte code
Goto: Begin this document , End this document , UVSI Home-Page
g. Use the vi editor to search converted quikjobs for the following patterns:
/spaces - ensure receiving field < 300 bytes =======
/zeros - ensure receiving field < 300 bytes ======= - also check receiving field, if packed you must change mvc $xxx,$zeros <-- OK if $xxx unpacked mvn $xxx,0 <-- use this if packed
/hivalues - ensure receiving field < 64 bytes =========
/lovalues - ensure receiving field < 64 bytes =========
QJ example: MOVE SPACES TO OFA1-512 - clearing 512 byte record
conversion: mvc e0(512),$spaces - uvcopy/uvqrpg conversion
correction: clr e0(512),' ' <-- change 'mvc' to 'clr' with 1 byte - clear any length to all op2 char
Goto: Begin this document , End this document , UVSI Home-Page
h. /lodc1 - search for lines such as: ======
lodc1=qq0(32),pubqbase - modify as follows:
lodc1=qq0(32),pubqbase,a - modify as follows: ^^ - note addition of ',a' area
You must add the area code on 'lodc1' references to a quikjob copybook, since the same QJ copybook could be used in different files in different quikjob programs. You can easily determine which area by examining the file declarations, for example:
INF --> fili1 --> area 'a' DET --> fili2 --> area 'b' INC --> fili3 --> area 'c' IND --> fili4 --> area 'd'
i1. /sort area <-- search for SORT AREA (RELEASE/RETURN) ==========
You must insert 'sxo' (sort open) & 'sxs' (execute sort). See example#4 & changes explained on pages 'G3' & 'G4'.
i2. /sort file <-- search for SORT FILE ==========
See example#5 on page 'H1'. You may be able to convert to 'uvsort' in the jcl/script & eliminate the quikjob ??.
Goto: Begin this document , End this document , UVSI Home-Page
j. /lfd=& - search for LFD variable names on FILE statements ======
LFD &variable names on FILE stmnts need to be replaced with actuals
# file inf dtf=tape,bksz=6328,rcsz=113,lfd=&tpubq159b fili1=${DD_&TPUBQ159B},rcs=0113,typ=RSFl1 # file inc dtf=miram,bksz=6350,rcsz=127,indxblk=1,lfd=pubrate fili3=${DD_PUBRATE},rcs=0127,typ=ISFl1 # file ofa dtf=miram,bksz=6400,rcsz=113,keys=no,rcb=no,lfd=&pubq159a filo2=${DD_&PUBQ159A},rcs=0113,typ=RSFl0 filo1=${DD_PRNTR},rcs=256,typ=LSTt
You will need to examine the JCL that calls this QuikJob to determine what the LFD names are. To find the job you could use grep, for example:
grep PUBQ159 jcl7/* <-- find jcl calling pubq159 - in jcl subdir BEFORE $symbols replaced grep PUBQ159 jcl8/* <-- find jcl calling pubq159 - in jcl subdir AFTER $symbols replaced
if [ "$TPUBQ159B" = "" ]; then TPUBQ159B="PUBMRED"; fi if [ "$PUBQ159A" = "" ]; then PUBQ159A="PUB159A"; fi .................... export DD_PUBRATE=$DM/ipubrate export DD_$TPUBQ159B=$DT/$TPUBQ159B export DD_$PUBQ159A=$DW/$PUBQ159A export DD_PRNTR=$DP/${PROGID}_${FPUBQ159B}_$(date +%H%M%S) logmsg "step# $stp pubq159 begun" uvcopy pubq159
export DD_PUBRATE=$DM/ipubrate export DD_PUBMRED=$DT/pubmred export DD_PUB159A=$DW/pub159a export DD_PRNTR=$DP/${PROGID}_STAND1_$(date +%H%M%S) logmsg "step# $stp pubq159 begun" uvcopy pubq159
fili1=${DD_&TPUBQ159B},rcs=0113,typ=RSFl1 filo2=${DD_&PUBQ159A},rcs=0113,typ=RSFl0
fili1=${DD_PUBMRED},rcs=0113,typ=RSFl1 filo2=${DD_PUB159A},rcs=0113,typ=RSFl0
Goto: Begin this document , End this document , UVSI Home-Page
k. /isk1=S(L) <-- search for key definitions on indexed output files ==========
Not converted automatically, you have to do manually, for example:
# file ofa bksz=4224,rcsz=127,lfd=pal674w,keys=yes,k1loc=1,k1len=9 filo2=${DD_OFA},rcs=0127,typ=ISFl1,isk1=S(L) <-- change this
filo2=${DD_OFA},rcs=0127,typ=ISFl1,isk1=0(9) <-- to this
l. /??????? <-- any other patterns you find useful ?? ========
Goto: Begin this document , End this document , UVSI Home-Page
There are some situations where you can replace the quikjob converted code with alternative uvcopy code that is much shorter.
Example 1a |
|
IF INF1 = C'A' OR <-- original mainframe QuikJob code IF INF1 = C'B' OR IF INF1 = C'C' GOTO 1500.
cmc a0(1),c'A' <-- converted to uvcopy skp= ifa0010 cmc a0(1),c'B' skp= ifa0010 cmc a0(1),c'C' skp! ifb0020 ifa0010 skp tag1500 ifb0020 nop
tst a0(1),'ABC' <-- uvcopy equivalent (manual change) skp= tag1500
Example 1b |
|
IF INF61 = C'NY' OR <-- original mainframe QuikJob code IF INF61 = C'NJ' OR IF INF61 = C'VA' GOTO 1500.
tstl2 a0(1),'NYNJVA' <-- uvcopy equivalent (manual change) skp= tag1500
The 'tst' instruction assumes multiple 1 byte values, unless you code the 'l' option to specify how long each subfield is ('l2' for 2 bytes). See full description of the 'tst' in uvcopy3.doc in volume 2 of UVdoc.
Goto: Begin this document , End this document , UVSI Home-Page
Example 2 |
|
IF INF61-62 = C'NY' MOVE C'NEW YORK' TO STATE-DES. IF INF61-62 = C'NJ' MOVE C'NEW JERSEY' TO STATE-DES. IF INF61-62 = C'VA' MOVE C'VIRGINIA' TO STATE-DES.
cmc a60(2),c'NY' # if inf61-62 = c'NY' skp! ifb0010 mvc $state-des,c'NEW YORK' # move c'NEW YORK' to state-des. ifb0010 cmc a60(2),c'NJ' # ifb0010 if inf61-62 = c'NJ' skp! ifb0020 mvc $state-des,c'NEW JERSEY' # move c'NEW JERSEY' to state-des. ifb0020 cmc a60(2),c'VA' # ifb0020 if inf61-62 = c'VA' skp! ifb0030 mvc $state-des,c'VIRGINIA' # move c'VIRGINIA' to state-des. ifb0030 nop
lod=k0(20) <-- lod a table up front NY NEW YORK NJ NEW JERSEY VA VIRGINIA ~~~~~~~~~~~~~~~~~~~~
lok k0(20),k0(20),a60(2) <-- lookup the table skp! 1 mvc $state-des,kx3
You can see the full description of the 'lod' & 'lok' instructions in uvcopy3.doc in volume 2 of UVdoc, but briefly:
'lok' looks up a table stored previously. The entry length must match on lod & lok. Op1 & op2 'k0(20)' are the same in this case, but op2 allows you to look up multi-column tables.
The search argument 'a60(2)' in this case specifies the compare length, (the 1st 2 bytes of each 20 byte table entry).
When a match is found, the condition code is set '=' and register 'x' points to the matching entry in the table. If the state were 'VA' register 'x' would be '40', and 'kx3' would then address byte 43 in the table. The '3' bypasses bytes 0,1,2 'VA ' to address 1st byte of VIRGINIA. We left a blank between state code & description for aesthetics.
Goto: Begin this document , End this document , UVSI Home-Page
In the previous example the state was in a known fixed location. In this example the state could be anywhere in the address3 field.
WHEN ADRS3 INCLUDES 'NY' <-- original quikjob code MOVE C'NEW YORK' TO STATE-DES. WHEN ADRS3 INCLUDES 'NJ' MOVE C'NEW JERSEY' TO STATE-DES. WHEN ADRS3 INCLUDES 'VA' MOVE C'VIRGINIA' TO STATE-DES.
lod=k0(40) <-- lod a table up front NY ~~~~~~~~~~~~~~~~NEW YORK NJ ~~~~~~~~~~~~~~~~NEW JERSEY VA ~~~~~~~~~~~~~~~~VIRGINIA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sct $adrs3,k0(40),k0(20) <-- scan adrs3 for table match skp! 1 mvc $state-des,ky20
The table entries are made 40 bytes just to conform to example#4.
The 1st '~' on each entry marks the end of the search pattern. We leave a blank before & after the 2 byte state code, so we wont match 2 characters within a longer word.
Register 'y' will point to the matching table entry, so 'ky20' will address the right side of the matching 40 byte entry.
Goto: Begin this document , End this document , UVSI Home-Page
Here is an example that can not be done with mainframe quikjob.
Required |
|
lod=k0(40) NY ~~~~~~~~~~~~~~~~ NEW YORK ~~~~~~~~~~ NJ ~~~~~~~~~~~~~~~~ NEW JERSEY ~~~~~~~~ VA ~~~~~~~~~~~~~~~~ VIRGINIA ~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rpt $adrs3,k0(40),k0(20) <-- search/replace state/description ===========================
Table entries are 40 bytes, 20 max search pattern, 20 max replacement. In this case the search patterns are all 4 bytes but they could be variable as are the replacement patterns.
The end of the search pattern & replace pattern is marked by 1st tilde.
The 'rpt' (replace by table) instruction replaces if it finds a match & does nothing if there is no match. If you wanted to know whether a match occurred, you could test the condition code.
rpt $adrs3,k0(40),k0(20) skp= match <-- test if replacement made
Goto: Begin this document , End this document , UVSI Home-Page
There is a debug facility for QuikJobs (converted to uvcopy/uvqrpg) which is somewhat similar to the Micro Focus COBOL Animator. You can step through the program & display desired areas. You can turn on debugging by exporting a variable, which means you dont have to modify the uvcopy code or the JCL.
export UVQRPGROP=d <-- turn on debugging for uvcopy/uvqrpg =================== export UVQRPGROP="" <-- turn off debugiing
Here is a sample debugging session using the 'palq671' quikjob listed on page 'D2' of this QuikJob.doc. Here is what you would see if there were only 1 record in the file & you kept pressing enter to execute the next instruction.
debug> opn.. all debug> clr.. t0(100000),'~' debug> clr.. h400(200),'~' debug> wtb..e filo1,h0(200),h0(20 debug> tag1000 get.. fili1,a0 debug> skp>. tag9999 debug> mvc.. $p-title,$e-title debug> mvc.. $p-state-lic,$e-stat debug> mvc.. $p-acct-num,$e-acct- debug> mvc.. $p-mail1,$e-mail1 debug> mvc.. $p-mail2,$e-mail2 debug> put..b filo1,p0 <-- see display below debug> skp.. tag1000
debug> tag1000 get.. fili1,a0 <-- return to read record#2 debug> skp>. tag9999 debug> tag9999 skp.. tageoj debug> tageoj cls.. all debug> eoj..
Note that at any point, you can display any area from any displacement. For example if you displayed area a & area p at the 'put' instruction:
debug> d a0 <-- display area 'a' (1st 60 bytes) ====
debug> d a60 <-- display area 'a' (bytes 61-120) =====
Goto: Begin this document , End this document , UVSI Home-Page