/TITLE RTVDB2 - Build DDS member *--------------------------------------------------------------* * Programmers Group & Management Resources Copyright 1998 * * * * \\\\\\\ * * ( o o ) * *---------------------oOOO----(_)----OOOo----------------------* * * * System name. . : Programmer Tool * * Program name . : RTVDB2 * * Text . . . . . : Build DDS member * * * * Author . . . . : Alex Nubla * * * * Description. . : This program builds the temporary DDS * * member requested for the entry file * * using the RTVDBSRC command. * * * * Return Codes: * * *Blank = Good Retrieval * * 99 = No *ACCPTH record in QAFDACCP * * * * * * OOOOO OOOOO * * ( ) ( ) * *--------------------( )-------------( )-------------------* * (_) (_) * * Modules: * * * * 1. RTVDB1 CLLE Build temporary files * * 2. RTVDB2 RPGLE Build DDS member * * * * Programs: * * * * 1. *none * * * *--------------------------------------------------------------* * Modification Log : * * * * Task Programmer/ * * Date No. Description * * -------- ------ ------------------------------------------ * * Alex Nubla * * Creation Date * * * *--------------------------------------------------------------* * APIs Used: * * * * QUSDLTUS Ä Delete user space * * QUSCRTUS Ä Create user space * * QUSCUSAT Ä Change user space attributes * * QUSPTRUS Ä Retrieve pointer to user space * * QUSLRCD Ä List Record Formats * * QUSLFLD Ä List Fields * * QUSRTVUS Ä Retrieve user space * * * *--------------------------------------------------------------* /EJECT H COPYRIGHT('(C) Alex Nubla of PGMR, Inc. 1998') **************************************************************** * F I L E D E S C R I P T I O N S P E C I F I C A T I O N * **************************************************************** FQAFDACCP IF E DISK * * File Access Path (built in RTVDB1) * *--------------------------------------------------------------* FQAFDJOIN IF E DISK UsrOpn * * *Join File description (built in RTVDB1) * *--------------------------------------------------------------* FQAFDSELO IF E DISK UsrOpn * * *Select / *Omit fields (built in RTVDB1) * *--------------------------------------------------------------* FQDDSSRC UF A F 92 DISK * * New member (built in RTVDB1) * *--------------------------------------------------------------* **************************************************************** * D E F I N I T I O N S P E C I F I C A T I O N * **************************************************************** * * Program Status Data Structure * D PGMDS SDS D Pgmq## *PROC D ErrorSts *STATUS D PrvStatus 16 20S 0 D SrcLinNum 21 28 D Routine *ROUTINE D NumParms *PARMS D ExcpType 40 42 D ExcpNum 43 46 * D PgmLib 81 90 D ExcpData 91 170 D ExcpId 171 174 D LastFile 201 208 D FileErr 209 243 D JobName 244 253 D User 254 263 D JobNumA 264 269 D JobNum 264 269S 0 D JobDate 270 275S 0 D RunDate 276 281S 0 D RunTime 282 287S 0 D PgmCrtDt 288 293 D PgmCrtTm 294 299 D CmplrLvl 300 303 D SrcFile 304 313 D SrcLib 314 323 D SrcMbr 324 333 D ProcPgm 334 343 D ProcMod 344 353 *--------------------------------------------------------------* * * User space parameters * * @ prefix - names * # prefix - pointers * * ========== * Space name * ========== * D @SpcName S 10 Based(#SpcName) D #SpcName S * * * ============= * Space library * ============= * D @SpcLib S 10 Based(#SpcLib) D #SpcLib S * * * ========== * Space size * ========== * D @SpcSize S 9B 0 Based(#SpcSize) D #SpcSize S * * * ============= * Space pointer * ============= * D @SpcPtr S * Based(#SpcPtr) D #SpcPtr S * * * ================ * Error message id * ================ * D @MsgId S 7 Based(#MsgId) D #MsgId S * * * ================== * Error message data * ================== * D @MsgDta S 184 Based(#MsgDta) D #MsgDta S * *--------------------------------------------------------------* * * Initial User Space Name & Library * D @UsNameLib DS 20 D @UsName 10 Inz('DBSPACE') D @UsLib 10 Inz('QTEMP') *--------------------------------------------------------------* * * Fields used in List Record Formats (QUSLRCD) API * and List Field (QUSLFLD) API * D @FormatR S 8 Inz('RCDL0200') QUSLRCD Format name D @FormatF S 8 Inz('FLDL0100') QUSLFLD Format name D @RecFmt S 10 Inz Record Format D @OvrdPrc S 1 Inz('1') Override Processing D @QFile S 20 Inz Qualified File name D @RecText S 50 Inz Record Format Text * * Format RCDL0200 List Data Section * D @Receiver1 DS 82 D @200Name 10 D @200Id 13 D @200Res1 1 D @200RecLen 9B 0 D @200NoFld 9B 0 D @200Text 50 * * Format FLDL0100 List Data Section * D @Receiver2 DS 268 D @100Field 10 D @100Type 1 D @100Use 1 D @100OutBuf 9B 0 D @100InBuf 9B 0 D @100FldLen 9B 0 D @100Digits 9B 0 D @100DecPos 9B 0 D @100FldTxt 50 D @100EdtCde 2 D @100EdwLen 9B 0 D @100EdtWrd 64 D @100ColHdg1 20 D @100ColHdg2 20 D @100ColHdg3 20 D @100IntFld 10 D @100Alias 30 D @100AliasLn 9B 0 D @100NoDBCS 9B 0 D @100AlwNull 1 D @100Host 1 D @100DTFmt 4 D @100DTSep 1 D @100MIMap 1 *--------------------------------------------------------------* * * Additional User Space parameters * D @ExtAttr S 10 Inz('RTVDBSRC') D @InitValue S 1 Inz(X'00') D @PubAut S 10 Inz('*ALL') D @Text S 50 Inz('User space for RTVDBSRC') D @Replace S 10 Inz('*NO') D @FrcToAux S 1 Inz('1') D @StartPos S 9B 0 Inz(1) D @StartEnt S 9B 0 Inz(1) D @DataLen S 9B 0 Inz(192) D @Size S 9B 0 Inz(4096) D @Loop S 5P 0 D @BasePtr S * *--------------------------------------------------------------* * * Record structure for error code parameter * D@ErrData DS D @BytesProv 9B 0 Inz(200) D @BytesAval 9B 0 D @ExcpId 7 D @Reserved1 1 D @ExcpData 184 *--------------------------------------------------------------* * * Change attribute parameters * D@ChgAttr DS D @NbrAttr 9B 0 Inz(2) * D @Attr2 9B 0 Inz(2) D @Attr2Len 9B 0 Inz(1) D @Attr2Dta 1 Inz(X'00') * D @Attr3 9B 0 Inz(3) D @Attr3Len 9B 0 Inz(1) D @Attr3Dta 1 Inz('1') *--------------------------------------------------------------* * * Generic Header Format 0100 * D@GenHeader DS Based(@SpcPtr) D @QUserArea 1 64 D @QSzGenHdr 65 68B 0 D @QStrRelLv 69 72 D @QFmtName 73 80 D @QApiUsed 81 90 D @QDtTmCrtd 91 103 D @QInfoSts 104 104 D @QUsSize 105 108B 0 D @QOfstInp 109 112B 0 D @QSizeInp 113 116B 0 D @QOfstHdr 117 120B 0 D @QSzHdrSec 121 124B 0 D @QOfstLst 125 128B 0 D @QSizeLst 129 132B 0 D @QNoLstEnt 133 136B 0 D @QLstEntSz 137 140B 0 D @QCCSIdLst 141 144B 0 D @QCntryId 145 146 D @QLangId 147 149 D @QSubLstIn 150 150 D @QUsResrvd 151 192 *--------------------------------------------------------------* * * New source date * D ds D DateRtn 32A D NewDat 6S 0 overlay(DateRtn: 1) *--------------------------------------------------------------* * * New source record * DNewSource ds Inz D NsSeqNo 1 5 Inz D NsFormType 6 6 Inz D NsComment 7 7 Inz D NsConditn 8 16 Inz D NsNameType 17 17 Inz D NsReservd1 18 18 Inz D NsName 19 28 Inz D NsRef 29 29 Inz D NsLen 30 34 Inz D NsDataType 35 35 Inz D NsDec 36 37 Inz D NsUsage 38 38 Inz D NsLocation 39 44 Inz D NsKeyword 45 80 Inz D NsLen# S 5S 0 Inz D NsDec# S 2S 0 Inz *--------------------------------------------------------------* * * Record Format array and information * D RfArray DS D RfInfo 60 dim(99) D RfName 10 overlay(RfInfo: 1) D RfText 50 overlay(RfInfo: 11) D Rf# S 3 0 Inz EXPORT D Lf# S 3 0 Inz *--------------------------------------------------------------* * * Physical File array - for logical file only * D PfArray DS EXPORT D PfInfo 10 dim(32) D Pf# S 3 0 Inz EXPORT D PfAccess S 3 0 Inz EXPORT *--------------------------------------------------------------* * * Join File array - for logical file only * D JfArray DS EXPORT D JfInfo 10 dim(32) D Jf# S 3 0 Inz EXPORT *--------------------------------------------------------------* * * Text Line array * D LnArray DS Inz D Line1 36 D Line2 36 D Line3 36 D Line4 36 D Line5 36 D Line6 36 D Line7 36 D Line8 36 D Line9 36 D Line10 36 D Lin S 36 Inz Dim(10) D Ln# S 3 0 Inz *--------------------------------------------------------------* * * From & To file for Join * D CurJFiles DS D JNJFNM 10 D JNJTNM 10 * D SavJFiles DS D SVJFNM 10 D SVJTNM 10 *--------------------------------------------------------------* * * Constants * D @Yes C const('Y') D @No C const('N') D @PF C const('Physical File . . :') D @LF C const('Logical file . . . :') D @Unique C const('UNIQUE') D @Minus C const('-') D @Plus C const('+') D @Descend C const('DESCEND') D @Ascend C const(' ') D @Signed C const('SIGNED') D @Unsigned C const(' ') D @Zone C const('ZONE') D @NotZone C const(' ') *--------------------------------------------------------------* * * Standalone fields * D Lilian S 9B 0 Inz D Second S 8A Inz D GregDt S 17A Inz D Picture S 32A Inz('Mmmmmmmmmz ZD, YYYY') D Picture2 S 32A Inz('MM/DD/YY') D DateTxt S 32A Inz D DateMDY S 32A Inz D Lbl S 80 Dim(24) CtData PerRcd(1) Std comments D Lbl# S 3 0 D Fil# S 3 0 D Maint S 8 D KeyOrder S 8 D Unique S 1 D Keyed S 1 D SelOmt S 1 D Join S 1 D Key# S Inz Like(APNKYF) D KeyFld S Inz Like(APKEYF) D LFFormat S Inz Like(APBOLF) D Pfile S Inz Like(APBOF) D Jfile S Inz Like(JNDNAM) D KeySeq S 8 Inz D KeySign S 8 Inz D KeyZone S 4 Inz D TstTxt S 360 Inz D Txt34 S 34 Inz D Cont S 1 Inz D TxtLen S 3 0 Inz D Remain S 3 0 Inz D Scan S 3 0 Inz D BrkPos S 3 0 Inz /EJECT **************************************************************** * I N P U T S P E C I F I C A T I O N * **************************************************************** IQDDSSRC NS I S 1 6 2SRCSEQ I S 7 12 0SRCDAT I 13 92 SRCDTA /EJECT **************************************************************** * C A L C U L A T I O N S P E C I F I C A T I O N * **************************************************************** * * Entry parameter list * C *Entry plist C parm File 10 C parm FileL 10 C parm ObjAtr 10 C parm Mbr 10 C parm Text 50 C parm Rtncde 2 * C Eval %Subst(@QFile: 1: 10) = File C Eval %Subst(@QFile:11: 10) = FileL *----------------------------------------------------* * Get the local date * *----------------------------------------------------* C Callb(d) 'CEELOCT' C Parm Lilian C Parm Second C Parm GregDt C Parm *Omit * C Callb(d) 'CEEDATE' C Parm Lilian C Parm 'YYMMDD' Picture C Parm DateRtn C Parm *Omit * C Reset Picture C Callb(d) 'CEEDATE' C Parm Lilian C Parm Picture C Parm DateTxt C Parm *Omit * C Reset Picture2 C Callb(d) 'CEEDATE' C Parm Lilian C Parm Picture2 C Parm DateMDY C Parm *Omit * *----------------------------------------------------* * Initialize pointers * *----------------------------------------------------* C Eval #SpcName = %addr(@UsName) C Eval #SpcLib = %addr(@UsLib) C Eval #SpcSize = %addr(@Size) C Eval #SpcPtr = %addr(@BasePtr) *----------------------------------------------------* * Create a new user space * *----------------------------------------------------* C Exsr $CrtUs * C Eval SRCSEQ = 0 C Eval SRCDAT = NewDat *----------------------------------------------------* * Retrieve list of Record formats for the file * *----------------------------------------------------* C Exsr $RecFmt * *----------------------------------------------------* * Write the standard label & file level keywords * *----------------------------------------------------* C Exsr $StdLbl * *----------------------------------------------------* * Write record & field level source * *----------------------------------------------------* C If RtnCde = *Blanks C 1 Do Rf# Lf# C Exsr $CrtUs C Eval @RecFmt = RfName(Lf#) C Eval @RecText = RfText(Lf#) C Eval LnArray = *Blanks * C Eval NsComment = '*' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource * *------------------------------------------* * * Write the Record Level * * *------------------------------------------* C Eval TstTxt = %Trimr('TEXT(''') + C %Trim(@RecText) + C ''')' C Eval Cont = @Plus C @RecText CasNe *Blanks $BrkLin C EndCs * C If Line1 <> *Blanks C Eval NsKeyword = Line1 C EndIf C Eval NsFormType = 'A' C Eval NsNameType = 'R' C Eval NsName = @RecFmt C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource * C 2 Do 9 Ln# C If Lin(Ln#) <> *Blanks C Eval NsFormType = 'A' C Eval NsKeyword = Lin(Ln#) C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Else C Leave C EndIf C EndDo * * *------------------------------------------* * * Write PFILE keyword * * *------------------------------------------* C If Pfile <> *Blanks C Eval NsFormType = 'A' C Eval NsKeyword = %Trimr('PFILE(') + C %Trimr(Pfile) + C ')' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Else * *------------------------------------------* * * Write Join logical keywords * * *------------------------------------------* C Join CasEq @Yes $LstJoin C EndCs C EndIf * *------------------------------------------* * * Write the Field Level * * *------------------------------------------* C Eval NsComment = '*' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Exsr $LstFld * *------------------------------------------* * * Write the Key fields (if any) * * *------------------------------------------* C Exsr $LstKFld * *------------------------------------------* * * Write the Select/Omit fields (if any) * * *------------------------------------------* C SelOmt CasEq @Yes $LstSelO C EndCs C EndDo C EndIf C Eval *InLr = *On C Return /EJECT **************************************************************** * S U B R O U T I N E S * **************************************************************** /SPACE *==============================================================* * * * Create a new user space for this job * * * * Parameters: All parameters used in this routine are based * * on pointers -- names prefix by #. (E.g. If you * * use @SpaceName, the pointer used is called * * #SpaceName. Prior to executing the routine, * * you should have initialized the pointer using * * Eval #SpaceName = %addr(@SpaceName).) * * * * Input: * * @SpcName Name of the user space to be used * * by this routine. This field is * * based on #SpcName. Prior to * * running this routine, it is assumed* * that #SpcName has been initialized.* * @SpcLib Name of the library used by the * * space name. * * @SpcSize Initial size of the user space to * * be allocated by the job. * * * * Output: * * @SpcPtr Pointer used by the user space * * @MsgId Error id received when using the * * API's. This will be blank If all * * executions are sucessful. * * @MsgDta Message data associated with the * * Message Id. * * * C $CrtUs BEGSR *==============================================================* * *----------------------------------------------------* * Delete any existing user space * *----------------------------------------------------* C Call 'QUSDLTUS' C Parm @UsNameLib C Parm @ErrData *----------------------------------------------------* * Create the user space * *----------------------------------------------------* C Eval @ExcpId = *Blanks C Eval @BytesProv = 200 * C Call 'QUSCRTUS' C Parm @UsNameLib C Parm @ExtAttr C Parm @SpcSize C Parm @InitValue C Parm @PubAut C Parm @Text C Parm @Replace C Parm @ErrData * C If @BytesAval > 0 C Eval @MsgId = @ExcpId C Eval @MsgDta = @ExcpData C Else * *----------------------------------------------------* * Change the user space & expand the size * *----------------------------------------------------* C Eval @ExcpId = *Blanks C Eval @BytesProv = 200 * C Call 'QUSCUSAT' C Parm @UsLib C Parm @UsName C Parm @ChgAttr C Parm @ErrData * C If @BytesAval > 0 C Eval @MsgId = @ExcpId C Eval @MsgDta = @ExcpData C Else * *----------------------------------------------------* * Retrieve pointer to user space * *----------------------------------------------------* C Call 'QUSPTRUS' C Parm @UsNameLib C Parm @SpcPtr C Parm @ErrData * C EndIf C EndIf * C #CrtUs ENDSR /EJECT *==============================================================* * * * Get all record format for the file * * * C $RecFmt BEGSR *==============================================================* C Eval @ExcpId = *Blanks C Eval @BytesProv = 200 *----------------------------------------------------* * List Record Formats (QUSLRCD) API * *----------------------------------------------------* C Call 'QUSLRCD' C Parm @UsNameLib C Parm @FormatR C Parm @QFile C Parm @OvrdPrc * *------------------------------------------* * * Look for the generic header format to * * * determine how info will be retrieved * * * in the user space. * * *------------------------------------------* C Eval @BytesProv = 200 * C Call 'QUSRTVUS' C Parm @UsNameLib C Parm @StartPos C Parm @DataLen C Parm @GenHeader C Parm @ErrData * C If @BytesAval > 0 C Eval @MsgId = @ExcpId C Eval @MsgDta = @ExcpData C EndIf * * *------------------------------------------* * * Determine the size of each entries * * *------------------------------------------* C If @QLstEntSz < 82 C Eval @DataLen = @QLstEntSz C Else C Eval @DataLen = 82 C EndIf * *------------------------------------------* * * Retrieve the number of entries * * *------------------------------------------* C Eval @Loop = @QNoLstEnt * *------------------------------------------* * * Get the starting position and increased * * * the offset by 1 (user space is based on * * * base 0, we compute under base 1) * * *------------------------------------------* C Eval @StartEnt = @QOfstLst + 1 *----------------------------------------------------* * Loop thru the list of record format entries * *----------------------------------------------------* C Dow @Loop > 0 * C Call 'QUSRTVUS' C Parm @UsNameLib C Parm @StartEnt C Parm @DataLen C Parm @Receiver1 C Parm @ErrData * C If @200Name = *Blanks C Leave C EndIf * C If @BytesAval > 0 C Eval @MsgId = @ExcpId C Eval @MsgDta = @ExcpData C EndIf * *------------------------------------------* * * Store info into array - up to 99 elem * * *------------------------------------------* C Eval Rf# = Rf# + 1 C Eval RfName(Rf#) = @200Name C Eval RfText(Rf#) = @200Text * C If Rf# = 99 C Leave C EndIf * * *------------------------------------------* * * Position to the record format entry * * *------------------------------------------* C Eval @StartEnt = @StartEnt + @QLstEntSz C Eval @Loop = @Loop - 1 C EndDo * C #RecFmt ENDSR /EJECT *==============================================================* * * * List all the fields per record format & write to source * * * C $LstFld BEGSR *==============================================================* C Eval @ExcpId = *Blanks C Eval @BytesProv = 200 *----------------------------------------------------* * List Fields (QUSLFLD) API * *----------------------------------------------------* C Call 'QUSLFLD' C Parm @UsNameLib C Parm @FormatF C Parm @QFile C Parm @RecFmt C Parm @OvrdPrc * *------------------------------------------* * * Look for the generic header format to * * * determine how info will be retrieved * * * in the user space. * * *------------------------------------------* C Eval @BytesProv = 200 * C Call 'QUSRTVUS' C Parm @UsNameLib C Parm @StartPos C Parm @DataLen C Parm @GenHeader C Parm @ErrData * C If @BytesAval > 0 C Eval @MsgId = @ExcpId C Eval @MsgDta = @ExcpData C EndIf * * *------------------------------------------* * * Determine the size of each entries * * *------------------------------------------* C If @QLstEntSz < 268 C Eval @DataLen = @QLstEntSz C Else C Eval @DataLen = 268 C EndIf * *------------------------------------------* * * Retrieve the number of entries * * *------------------------------------------* C Eval @Loop = @QNoLstEnt * *------------------------------------------* * * Get the starting position and increased * * * the offset by 1 (user space is based on * * * base 0, we compute under base 1) * * *------------------------------------------* C Eval @StartEnt = @QOfstLst + 1 *----------------------------------------------------* * Loop thru the list of record format entries * *----------------------------------------------------* C Dow @Loop > 0 * C Call 'QUSRTVUS' C Parm @UsNameLib C Parm @StartEnt C Parm @DataLen C Parm @Receiver2 C Parm @ErrData * C If @100Field = *Blanks C Leave C EndIf * C If @BytesAval > 0 C Eval @MsgId = @ExcpId C Eval @MsgDta = @ExcpData C EndIf C Eval LnArray = *Blanks * *------------------------------------------* * * Field Name, Length, Type, Decimal & Text* * *------------------------------------------* C Eval TstTxt = %Trimr('TEXT(''') + C %Trim(@100FldTxt) + C ''')' C Eval Cont = @Plus C @100FldTxt CasNe *Blanks $BrkLin C EndCs * C If Line1 <> *Blanks C Eval NsKeyword = Line1 C EndIf C Eval NsFormType = 'A' C Eval NsName = @100Field C Eval NsDataType = @100Type * *--Time/Date/Timestamp---------------------* C If @100Type = 'L' or Date C @100Type = 'T' or Time C @100Type = 'Z' TimeStamp C Eval NsLen = *Blanks C Else * *--Other data type-------------------------* C Eval NsLen# = @100FldLen C Eval NsLen = %Editc(NsLen#:'Z') * *--Packed/Zoned/Binary---------------------* C If @100Type = 'P' or Packed C @100Type = 'Z' or Zoned C @100Type = 'B' Binary C Eval NsLen# = @100Digits C Eval NsLen = %Editc(NsLen#:'Z') C Eval NsDec# = @100DecPos C Eval NsDec = %Editc(NsDec#:'Z') C EndIf C EndIf C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource * C 2 Do 9 Ln# C If Lin(Ln#) <> *Blanks C Eval NsFormType = 'A' C Eval NsKeyword = Lin(Ln#) C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Else C Leave C EndIf C EndDo * *------------------------------------------* * * Column Heading * * *------------------------------------------* C If @100ColHdg1<> *Blanks or C @100ColHdg2<> *Blanks or C @100ColHdg3<> *Blanks * C Eval TstTxt = %Trimr('COLHDG(''') C If @100ColHdg1<> *Blanks C Eval TstTxt = %Trimr(TstTxt) + C %Trim(@100ColHdg1) + C '''' C EndIf C If @100ColHdg2<> *Blanks C Eval TstTxt = %Trimr(TstTxt) + C ' ''' + C %Trim(@100ColHdg2) + C '''' C EndIf C If @100ColHdg3<> *Blanks C Eval TstTxt = %Trimr(TstTxt) + C ' ''' + C %Trim(@100ColHdg3) + C '''' C EndIf C Eval TstTxt = %Trimr(TstTxt) + C ')' C Eval Cont = @Plus C Exsr $BrkLin * C Do 10 Ln# C If Lin(Ln#) <> *Blanks C Eval NsFormType = 'A' C Eval NsKeyword = Lin(Ln#) C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Else C Leave C EndIf C EndDo * C EndIf * *------------------------------------------* * * Alternative field name * * *------------------------------------------* C If @100Alias <> *Blanks * C Eval TstTxt = %Trimr('ALIAS(') + C %Trim(@100Alias) + C ')' C Eval Cont = @Minus C Exsr $BrkLin * C Do 10 Ln# C If Lin(Ln#) <> *Blanks C Eval NsFormType = 'A' C Eval NsKeyword = Lin(Ln#) C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Else C Leave C EndIf C EndDo * C EndIf * *------------------------------------------* * * Edit Code * * *------------------------------------------* C If @100EdtCde <> *Blanks * C Eval NsFormType = 'A' C Eval NsKeyword = %Trimr('EDTCDE') + C %Trimr(@100EdtCde) + C ')' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource * C EndIf * *------------------------------------------* * * Date Format * * *------------------------------------------* * * *--Time/Date/Timestamp---------------------* C If @100Type = 'L' or Date C @100Type = 'T' or Time C @100Type = 'Z' TimeStamp * C If @100DTFmt <> *Blanks * C Eval NsFormType = 'A' C Eval NsKeyword = %Trimr('DATFMT(') + C %Trimr(@100DTFmt) + C ')' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource * C EndIf * *------------------------------------------* * * Date Seperator * * *------------------------------------------* * * *--Time/Date-------------------------------* C If NsDataType = 'L' or Date C NsDataType = 'T' Time C If @100DTSep <> *Blanks * C Eval NsFormType = 'A' C Eval NsKeyword = %Trimr('DATSEP(') + C %Trimr(@100DTSep) + C ')' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource * * C EndIf C EndIf Type = L,T * C EndIf Type = L,T,Z * *------------------------------------------* * * Allow Null * * *------------------------------------------* C If @100AlwNull = '1' C Eval NsFormType = 'A' C Eval NsKeyword = 'ALWNULL' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C EndIf * * *------------------------------------------* * * Position to the record format entry * * *------------------------------------------* C Eval @StartEnt = @StartEnt + @QLstEntSz C Eval @Loop = @Loop - 1 C EndDo * C #LstFld ENDSR /EJECT *==============================================================* * * * List all the key fields per record format & write to source * * * C $LstKFld BEGSR *==============================================================* C If Key# > 0 C Eval NsComment = '*' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C EndIf * C Do Key# *----------------------------------------------------* * Write key field & keywords to source * *----------------------------------------------------* C Eval NsFormType = 'A' C Eval NsNameType = 'K' C Eval NsName = KeyFld C Eval NsKeyword = %Trimr(KeySeq) + ' ' + C %Trimr(KeySign) + ' ' + C %Trimr(KeyZone) C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource *----------------------------------------------------* * Read the next key from QAFDACCP * *----------------------------------------------------* C Read QAFDACCP 90 C If *In90 C Leave C EndIf * *------------------------------------------* * * Get Key information * * *------------------------------------------* C Eval KeyFld = APKEYF C If APKSEQ = 'A' C Eval KeySeq = @Ascend C Else C Eval KeySeq = @Descend C EndIf C If APKSIN = @Yes C Eval KeySign = @Signed C Else C Eval KeySign = @Unsigned C EndIf C If APKZD = @Yes C Eval KeyZone = @Zone C Else C Eval KeyZone = @NotZone C EndIf * *------------------------------------------* * * Get Pfile info if different * * *------------------------------------------* C If APJOIN = @No and C APFATR = 'LF' C If Pfile <> APBOF C Eval Pfile = APBOF C Eval Pf# = Pf# + 1 C Eval PfInfo(Pf#) = APBOF C EndIf C EndIf * *------------------------------------------* * * Make sure the same record format * * *------------------------------------------* C If APBOLF <> *Blanks and C LFFormat <> @RecFmt C Eval LFFormat = APBOLF C Leave C EndIf * C Enddo * C #LstKFld ENDSR /EJECT *==============================================================* * * * List Join keywords * * * C $LstJoin BEGSR *==============================================================* C Eval LnArray = *Blanks *----------------------------------------------------* * Write JFILE keyword * *----------------------------------------------------* C Eval TstTxt = %Trimr('JFILE(') C Do Jf# Fil# C If Fil# = 1 C Eval TstTxt = %Trimr(TstTxt) + JfInfo(Fil#) C Else C Eval TstTxt = %Trimr(TstTxt) + ' ' + C JfInfo(Fil#) C EndIf C Enddo C Eval TstTxt = %Trimr(TstTxt) + ')' C Eval Cont = @Plus C Exsr $BrkLin * C Do 10 Ln# C If Lin(Ln#) <> *Blanks C Eval NsFormType = 'A' C Eval NsKeyword = Lin(Ln#) C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Else C Leave C EndIf C EndDo *----------------------------------------------------* * Write JOIN & JFLD keywords * *----------------------------------------------------* C 1 Chain QAFDJOIN 92 C Dow Not *In92 C If JNJFRM > *Zero and C JNJTO > *Zero C If CurJFiles <> SavJFiles C Eval SVJFNM = JNJFNM C Eval SVJTNM = JNJTNM * *------------------------------------------* * * JOIN keyword * * *------------------------------------------* C Eval NsFormType = 'A' C Eval NsNameType = 'J' C Eval NsKeyword = %Trimr('JOIN(') + C %Trimr(JNJFNM) + ' ' + C %Trimr(JNJTNM) + ')' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource * *------------------------------------------* * * JFLD keyword * * *------------------------------------------* C Eval NsFormType = 'A' C Eval NsKeyword = %Trimr('JFLD(') + C %Trimr(JNJFD1) + ' ' + C %Trimr(JNJFD2) + ')' C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C EndIf C EndIf C Read QAFDJOIN 92 C EndDo * C #LstJoin ENDSR /EJECT *==============================================================* * * * List all select / omit fields per record format & write * * * C $LstSelO BEGSR *==============================================================* * C 1 Chain QAFDSELO 91 C Dow Not *In91 C If SORFMT = @RecFmt *----------------------------------------------------* * Write select / omit keywords to source * *----------------------------------------------------* C Eval NsFormType = 'A' C Eval NsNameType = SORULE C Eval NsName = SOFLD C If SOCOMP = 'AL' C Eval NsKeyword = 'ALL' C Else C Eval NsKeyword = %Trimr('COMP(') + C %Trimr(SOCOMP) + C ' ' + C %Trimr(SOVALU) + C ')' C EndIf C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C EndIf C Read QAFDSELO 91 C EndDo * C #LstSelO ENDSR /EJECT *==============================================================* * * * Print Standard DDS Labels * * * C $StdLbl BEGSR *==============================================================* C 1 Do 24 Lbl# C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = Lbl(Lbl#) C Select * *------------------------------------------* * * Database Label * * *------------------------------------------* C When Lbl# = 8 C If ObjAtr = 'PF' C Eval %Subst(SRCDTA: 10: 20) = @PF C Else C Eval %Subst(SRCDTA: 10: 20) = @LF C EndIf C Eval %Subst(SRCDTA: 32: 10) = File * *------------------------------------------* * * Text Label * * *------------------------------------------* C When Lbl# = 9 C Eval %Subst(SRCDTA: 32: 34) = Text * *------------------------------------------* * * Date Label * * *------------------------------------------* C When Lbl# = 10 C Eval %Subst(SRCDTA: 32: 32) = DateTxt C When Lbl# = 22 C Eval %Subst(SRCDTA: 9: 8) = DateMDY C EndSl C Except WrtSrc C Enddo *----------------------------------------------------* * Build fields used for file level keywords. Read * * the first record of QAFDACCP for this info. * *----------------------------------------------------* C Read QAFDACCP 90 C If *In90 C Eval RtnCde = '99' C Else * * *------------------------------------------* * * Get Access path order of key * * *------------------------------------------* C Select C When APKEYO = 'L' C Eval KeyOrder = 'LIFO' C When APKEYO = 'F' C Eval KeyOrder = 'FIFO' C When APKEYO = 'C' C Eval KeyOrder = 'FCFO' C EndSl * *------------------------------------------* * * Is key UNIQUE * * *------------------------------------------* C Eval Unique = APUNIQ * *------------------------------------------* * * Access path: A-Arrival, K-Keyed * * *------------------------------------------* C Eval Keyed = APACCP * *------------------------------------------* * * Select/Omit file: Y-Yes, N-No * * *------------------------------------------* C Eval SelOmt = APSELO C If SelOmt = @Yes C Open QAFDSELO C EndIf * *------------------------------------------* * * Join logical file: Y-Yes, N-No * * *------------------------------------------* C Eval Join = APJOIN C If APJOIN = @Yes C Open QAFDJOIN C Eval *In92 = *Off C Eval JFile = *Blanks * C Dow Not *In92 C Read QAFDJOIN 92 C If Not *In92 and C JFile <> JNDNAM C Eval JFile = JNDNAM C Eval Jf# = Jf# + 1 C Eval JfInfo(Jf#) = JNDNAM C EndIf C EndDo C Else * *------------------------------------------* * * Based on Physical File - for LF only * * *------------------------------------------* C If APFATR = 'LF' C Eval PfAccess = APNSCO C Eval Pfile = APBOF C Eval Pf# = Pf# + 1 C Eval PfInfo(Pf#) = APBOF C EndIf C EndIf * *------------------------------------------* * * Get Key information (& First Key Field) * * *------------------------------------------* C Eval Key# = APNKYF C Eval KeyFld = APKEYF C Eval LFFormat = APBOLF C If APKSEQ = 'A' C Eval KeySeq = @Ascend C Else C Eval KeySeq = @Descend C EndIf C If APKSIN = @Yes C Eval KeySign = @Signed C Else C Eval KeySign = @Unsigned C EndIf C If APKZD = @Yes C Eval KeyZone = @Zone C Else C Eval KeyZone = @NotZone C EndIf * *------------------------------------------* * * Get Access path maintenance * * *------------------------------------------* C Select C When APMANT = 'R' C Eval Maint = '*REBLD' C When APMANT = 'D' C Eval Maint = '*DLY' C Other C Eval Maint = '*IMMED' C EndSl * *----------------------------------------------------* * File Level Keywords * *----------------------------------------------------* C Reset NewSource * *------------------------------------------* * * UNIQUE * * *------------------------------------------* C If Unique = @Yes C Eval NsFormType = 'A' C Eval NsKeyword = @Unique C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C Else * *------------------------------------------* * * FCFO, FIFO or LIFO * * *------------------------------------------* C If KeyOrder <> *Blanks C Eval NsFormType = 'A' C Eval NsKeyword = KeyOrder C Eval SRCSEQ = SRCSEQ + 1 C Eval SRCDTA = NewSource C Except WrtSrc C Reset NewSource C EndIf C EndIf * C EndIf * C #StdLbl ENDSR /EJECT *==============================================================* * * * Break Text Line to Line 1, 2 & 3 * * * C $BrkLin BEGSR *==============================================================* C Eval LnArray = *Blanks C ' ' Checkr TstTxt TxtLen C MoveA '1000000000' *In(21) *----------------------------------------------------* * Continuation tag is minus * *----------------------------------------------------* C If Cont = @Minus C Dow TxtLen > 0 * *------------------------------------------* * * Check if TstTxt is less than / equal 36 * * *------------------------------------------* C If TxtLen <= 36 C 21 Eval Line1 = TstTxt C 22 Eval Line2 = TstTxt C 23 Eval Line3 = TstTxt C 24 Eval Line4 = TstTxt C 25 Eval Line5 = TstTxt C 26 Eval Line6 = TstTxt C 27 Eval Line7 = TstTxt C 28 Eval Line8 = TstTxt C 29 Eval Line9 = TstTxt C 30 Eval Line10 = TstTxt C Leave C Else * *------------------------------------------* * * Greater than 36, break text * * *------------------------------------------* C Eval TstTxt = %Trim(TstTxt) C Eval Remain = 1 C Eval Scan = 1 C Dow Remain < 36 C ' ' Scan TstTxt:Scan Scan C If Scan = 0 C Leave C Else C Eval Remain = Scan - 1 C Eval Scan = Scan + 1 C EndIf C EndDo C If Remain <= 36 C 21 Eval Line1 = TstTxt C 22 Eval Line2 = TstTxt C 23 Eval Line3 = TstTxt C 24 Eval Line4 = TstTxt C 25 Eval Line5 = TstTxt C 26 Eval Line6 = TstTxt C 27 Eval Line7 = TstTxt C 28 Eval Line8 = TstTxt C 29 Eval Line9 = TstTxt C 30 Eval Line10 = TstTxt C Leave C Else C 21 Eval Line1 = %Subst(TstTxt: 1: 35) + '-' C 22 Eval Line2 = %Subst(TstTxt: 1: 35) + '-' C 23 Eval Line3 = %Subst(TstTxt: 1: 35) + '-' C 24 Eval Line4 = %Subst(TstTxt: 1: 35) + '-' C 25 Eval Line5 = %Subst(TstTxt: 1: 35) + '-' C 26 Eval Line6 = %Subst(TstTxt: 1: 35) + '-' C 27 Eval Line7 = %Subst(TstTxt: 1: 35) + '-' C 28 Eval Line8 = %Subst(TstTxt: 1: 35) + '-' C 29 Eval Line9 = %Subst(TstTxt: 1: 35) + '-' C 30 Eval Line10 = TstTxt C EndIf C EndIf * C Select C When *In21 C MoveA '0100000000' *In(21) C When *In22 C MoveA '0010000000' *In(21) C When *In23 C MoveA '0001000000' *In(21) C When *In24 C MoveA '0000100000' *In(21) C When *In25 C MoveA '0000010000' *In(21) C When *In26 C MoveA '0000001000' *In(21) C When *In27 C MoveA '0000000100' *In(21) C When *In28 C MoveA '0000000010' *In(21) C When *In29 C MoveA '0000000001' *In(21) C When *In30 C Leave C EndSl C Eval TxtLen = TxtLen - 35 C Eval TstTxt = %Subst(TstTxt: 36: TxtLen) C Enddo C Else * *----------------------------------------------------* * Continuation tag is plus * *----------------------------------------------------* C Eval BrkPos = 1 C Dow TxtLen > 0 * *------------------------------------------* * * Check if TstTxt is less than / equal 34 * * *------------------------------------------* C If TxtLen <= 34 C 21 Eval Line1 = TstTxt C 22 Eval Line2 = TstTxt C 23 Eval Line3 = TstTxt C 24 Eval Line4 = TstTxt C 25 Eval Line5 = TstTxt C 26 Eval Line6 = TstTxt C 27 Eval Line7 = TstTxt C 28 Eval Line8 = TstTxt C 29 Eval Line9 = TstTxt C 30 Eval Line10 = TstTxt C Leave C Else * *------------------------------------------* * * Greater than 34, break text * * *------------------------------------------* C Eval Txt34 = %Subst(TstTxt: 1: 34) C Eval Txt34 = %Trim(Txt34) C Eval Remain = 1 C Eval Scan = 1 C Dow Remain < 34 C ' ' Scan Txt34:Scan Scan C If Scan = 0 C Leave C Else C Eval Remain = Scan - 1 C Eval Scan = Scan + 1 C EndIf C EndDo C 21 Eval Line1 = %Subst(Txt34: 1: Remain) + ' +' C 22 Eval Line2 = %Subst(Txt34: 1: Remain) + ' +' C 23 Eval Line3 = %Subst(Txt34: 1: Remain) + ' +' C 24 Eval Line4 = %Subst(Txt34: 1: Remain) + ' +' C 25 Eval Line5 = %Subst(Txt34: 1: Remain) + ' +' C 26 Eval Line6 = %Subst(Txt34: 1: Remain) + ' +' C 27 Eval Line7 = %Subst(Txt34: 1: Remain) + ' +' C 28 Eval Line8 = %Subst(Txt34: 1: Remain) + ' +' C 29 Eval Line9 = %Subst(Txt34: 1: Remain) + ' +' C 30 Eval Line10 = TstTxt C EndIf * C Select C When *In21 C MoveA '0100000000' *In(21) C When *In22 C MoveA '0010000000' *In(21) C When *In23 C MoveA '0001000000' *In(21) C When *In24 C MoveA '0000100000' *In(21) C When *In25 C MoveA '0000010000' *In(21) C When *In26 C MoveA '0000001000' *In(21) C When *In27 C MoveA '0000000100' *In(21) C When *In28 C MoveA '0000000010' *In(21) C When *In29 C MoveA '0000000001' *In(21) C When *In30 C Leave C EndSl C Eval BrkPos = Remain + 2 C Eval TxtLen = TxtLen - Remain C Eval TstTxt = %Subst(TstTxt: BrkPos: TxtLen) C EndDo * C EndIf * C MoveA LnArray Lin * C #BrkLin ENDSR /EJECT **************************************************************** * O U T P U T S P E C I F I C A T I O N * **************************************************************** OQDDSSRC EADD WRTSRC O SRCSEQ O SRCDAT O SRCDTA ** LBL Source label A*--------------------------------------------------------------* A* Source Retrieval from Retrieve Database Source (RTVDBSRC) * A* * A* \\\\\\\ * A* ( o o ) * A*---------------------oOOO----(_)----OOOo----------------------* A* * A* Database File. . . : * A* Text . . . . . . . : * A* Date . . . . . . . : * A* * A* OOOOO OOOOO * A* ( ) ( ) * A*--------------------( )-------------( )-------------------* A* (_) (_) * A* * A* MODIFICATION LOG : * A* * A* Task Programmer/ * A* Date No. Description * A* ======== ====== ========================================== * A* Creation Date * A* * A*--------------------------------------------------------------*