|
Special Feature: Using CHECK FILE HOLD to Document Files
The
CHECK FILE filename command is a very useful tool for checking the accuracy and syntax of a Master File Description (MFD). In addition, in the case of multi-segment and multi-path file structures, the
PICTURE option provides a graphic representation of the file structure that illustrates the paths that FOCUS uses to retrieve data.
An additional option is the use of the
HOLD keyword:
CHECK FILE filename HOLD
This option produces a special
HOLD file with an associated MFD that offers a considerable amount of information about a FOCUS file and allows users to create reports that produce useful documentation. This is especially helpful when files are joined together, as information about the cross-referenced file(s) is included in the
HOLD file. The
HOLD file may be named by specifying the
AS 'filename' option. An extension to the
HOLD option,
ALL, provides additional information about dates and special indices.
In this article, we use the
EMPLOYEE file (Figure 1) to produce some sample reports. A good starting point is to look at the MFD resulting from the following command:
CHECK FILE EMPLOYEE HOLD
(See Figure 2, which contains the
FOCMAST MFD.)
Asterisks indicate the fields in this MFD used to produce reports, as well as other fields of interest. As you see, the available information includes the fieldname, alias, format, and segtype and indicates whether a field is a key and if it is indexed. All of this information can be used to create production control documentation, end-user computing documentation, internal helpdesk information, and documentation for extract or non-FOCUS files. (You will notice that some fields are not marked and parts of the MFD are missing. This is because many of the fields and information are for the internal use of Information Builders technical staff and are not relevant here.)
The following reports illustrate the use of the information in the
HOLD file produced by
CHECK FILE.
1. The first report produces an alphabetic listing of the fieldname, alias, format, the positional number of the field in the MFD, the segment in which the field resides, and whether the field is in a cross-reference file and indexed. The FOCEXEC and output appear in Figure 3.
Figure 1: EMPLOYEE MFD
FILENAME=EMPLOYEE, SUFFIX=FOC
SEGNAME=EMPINFO, SEGTYPE=S1
FIELDNAME=EMP_ID, ALIAS=EID, FORMAT=A9, $
FIELDNAME=LAST_NAME, ALIAS=LN, FORMAT=A15, $
FIELDNAME=FIRST_NAME, ALIAS=FN, FORMAT=A10, $
FIELDNAME=HIRE_DATE, ALIAS=HDT, FORMAT=I6YMD, $
FIELDNAME=DEPARTMENT, ALIAS=DPT, FORMAT=A10, $
FIELDNAME=CURR_SAL, ALIAS=CSAL, FORMAT=D12.2M, $
FIELDNAME=CURR_JOBCODE, ALIAS=CJC, FORMAT=A3, $
FIELDNAME=ED_HRS, ALIAS=OJT, FORMAT=F6.2, $
SEGNAME=FUNDTRAN, SEGTYPE=U, PARENT=EMPINFO
FIELDNAME=BANK_NAME, ALIAS=BN, FORMAT=A20, $
FIELDNAME=BANK_CODE, ALIAS=BC, FORMAT=I6S, $
FIELDNAME=BANK_ACCT, ALIAS=BA, FORMAT=I9S, $
FIELDNAME=EFFECT_DATE, ALIAS=EDATE, FORMAT=I6YMD, $
SEGNAME=PAYINFO, SEGTYPE=SH1, PARENT=EMPINFO
FIELDNAME=DAT_INC, ALIAS=DI, FORMAT=I6YMD, $
FIELDNAME=PCT_INC, ALIAS=PI, FORMAT=F6.2, $
FIELDNAME=SALARY, ALIAS=SAL, FORMAT=D12.2M, $
FIELDNAME=JOBCODE, ALIAS=JBC, FORMAT=A3, $
SEGNAME=ADDRESS, SEGTYPE=S1, PARENT=EMPINFO
FIELDNAME=TYPE, ALIAS=AT, FORMAT=A4, $
FIELDNAME=ADDRESS_LN1, ALIAS=LN1, FORMAT=A20, $
FIELDNAME=ADDRESS_LN2, ALIAS=LN2, FORMAT=A20, $
FIELDNAME=ADDRESS_LN3, ALIAS=LN3, FORMAT=A20, $
FIELDNAME=ACCTNUMBER, ALIAS=ANO, FORMAT=I9L, $
SEGNAME=SALINFO, SEGTYPE=SH1, PARENT=EMPINFO
FIELDNAME=PAY_DATE, ALIAS=PD, FORMAT=I6YMD, $
FIELDNAME=GROSS, ALIAS=MO_PAY, FORMAT=D12.2M, $
SEGNAME=DEDUCT, SEGTYPE=S1, PARENT=SALINFO
FIELDNAME=DED_CODE, ALIAS=DC, FORMAT=A4, $
FIELDNAME=DED_AMT, ALIAS=DA, FORMAT=D12.2M, $
SEGNAME=JOBSEG, SEGTYPE=KU ,PARENT=PAYINFO, CRFILE=JOBFILE, CRKEY=JOBCODE,$
SEGNAME=SECSEG, SEGTYPE=KLU,PARENT=JOBSEG, CRFILE=JOBFILE,$
SEGNAME=SKILLSEG,SEGTYPE=KL, PARENT=JOBSEG, CRFILE=JOBFILE,$
SEGNAME=ATTNDSEG,SEGTYPE=KM, PARENT=EMPINFO, CRFILE=EDUCFILE,CRKEY=EMP_ID,$
SEGNAME=COURSEG, SEGTYPE=KLU,PARENT=ATTNDSEG,CRFILE=EDUCFILE,$
|
Figure 2:
FOCMAST MFD from
CHECK FILE
FILE=FOCMAST, SUFFIX=FIX,$
SEGMENT=FILEATTR,$
FIELD=RECTYPE,FLE,A4,A4,$
FIELD=FILENAME,FILN12,A8,A8,$ * FILENAME
FIELD-SUFFIX,FILN34,A8,A8,$ * SUFFIX
FIELD=VIEW FIELD,VWFIELD,A12,A12,$ * ROOT VIEW FIELD
FIELD=VIEW INDEX,VWINDEX,A12,A12,$ * ROOT VIEW INDEX
FIELD=REAL ROOT,REALROOT,A8,A8,$ * REAL ROOT SEGMENT
SEGMENT=SEGATTR,PARENT=FILEATTR,$
FIELD=RECTYPE,SEG,A4,A4,$
FIELD=SEGNO,SEGNUM,I2S,I4,$ * SEGMENT NUMBER
FIELD=LEVEL,LLEVELI,I2S,I2,$
FIELO=PARNO,LLEVEL2,I2S,I2,$ * NUMBER OF PARENT SEGMENT
FIELD=LEVTY,LLEVEL3,I2S,I2,$
FIELD=OCCURS,LLEVEL4,I4S,I2,$
FIELD=SEGSIZE,LLEVEL5,15S,I2,$ * FIELD SIZE OF SEGMENT IN BYTES
FIELD=FSTFLD,LLEVEL6,I5S,I2,$ * FIELD NO. OF 1ST FIELD IN SEGMENT
FIELD=LSTFLD,LLEVEL7,I5S,I2,$ * FIELD NO. OF LAST FIELD IN SEGMENT
FIELD=NUMDEC,LLEVELB,I2S,I2,$ * NO. OF DESCENDANT SEGMENT
FIELD=FDEC,LLEVEL9,I2S,I2,$ * SEGMENT NO. OF 1ST DESCENDANT
FIELD=FTWIN,LLEVEL1O,I2S,I2,$
FIELD=SKEYS,LLEVELll,I2S,I2,$ * NO. OF KEY FIELDS
FIELD=VKEYRC,LLEVELI2,I4S,I2,$
FIELD=SEGNAME,SEGMENT,A8,A8,$ * SEGMENT NAME
FIELD=PATH,LLEVEL17,I2S,I2,$ * NO. DESIGNATION FOR PATH
.
.
.
FIELD=PARENT,PARSEG,A8,A8,$ * PARENT OF SEGMENT
FIELD=SEGTYPE,SEGT,A4,A4,$ * SEGMENT TYPE
FIELD=CR INDEX,CRINDEX,A12,A12,$ * X-REF INDEX
FIELD=CRKEY,CRKEY,A12,A12,$ * X-REF KEY
FIELD=CRFILE,CRFILE,A8,A8,$ * X-REF FILE
FIELD=TAGNAME,TAG,A8,A8,$
SEGMENT=FLDATTR,PARENT=SEGATTR,$
FIELD=RECTYPE,FLD,A4,A4,$
FIELD=FLDNO,FLDNUM,I4S,I4,$ * FIELD NO.
FIELD=FIELDNAME,FIELD,A66,A66,$ * FIELD NAME
FIELD=ALIAS,SYNONYM,A66,A66,$ * ALIAS
FIELD=FORMAT,USAGE,A8,A8,$ * FORMAT/USAGE
FIELD=AUTHORITY,AUTHCODE,A8,A8,$ * DBA INFORMATION
FIELD=FLDSEG,RECDIS21,I2S,I2,$ * SEGMENT NO.
FIELD=FTYPE,RECDIS22,I2S,I2,$ * FIELD FORMAT CODE
FIELD=DEC,RECDIS23,I2S,I2,$ * NO. OF DECIMAL PLACES
FIELD=FLEN,RECDIS24,I3S,I2,$ * FIELD STORAGE IN BYTES
FIELD=WLEN,RECDIS25,I3S,I2,$
FIELD=EXLEN,RECDIS26,I3S,I2,$ * DISPLAY LENGTH
FIELD=OFFSET,RECDIS27,I4,I2,$
.
.
.
FIELD=INDX,RECDIS34,I2S,I2,$ * FIELD NO. OF INDEXED FIELD
FIELD=KIND,RECDIS3536,U4,A4,$
FIELD=ACTUAL,ACTUAL,A8,A8,$ * ACTUAL
FIELD=IXGRDUPELM,KINDB1I,A1,Al,$
FIELD=GRDUPELM,KINDBI2,A1,Al,$
FIELD=KINDBI3,KMISSING,A1,Al,$ * MISSING ATTRIBUTE
FIELD=HASIXELM,KINDBI4,Al,Al,$
FIELD=MIXFDRM,KINDB15,Al,Al,$
FIELD=GRDUP,KINDB16,Al,Al,$
FIELD=HELPMESSAGE,MESSAGE,A80,A80,$ * HELPMESSAGE ATTRIBUTE
FIELD=TITLE,TITLE,A64,A64,$ * TITLE ATTRIBUTE
|
Figure 3: Alphabetic Listing of Fieldname, Alias, Format, etc.
FOCEXEC
-* THIS PRODUCES AN ALPHA LISTING OF FIELDNAME,
_* ALIASES AND FORMAT FOR A FILE
-* FOR THIS AND ALL REPORTS, FIELDNAME HAS BEEN SHORTENED FROM
_* 66 TO 12 CHARS, BY CREATING THE DEFINED FIELD, XFIELDNAME.
SET PAGE=OFF
DEFINE FILE HOLD
SWI/A8=IF INDX NE 0 THEN 'INDEXED' ELSE ' ';
XFIELDNAME/A12=EDIT(FIELDNAME,'999999999999');
END
TABLE FILE HOLD
HEADING
"<12 AN ALPHA LISTING DF FIELD NAMES FDR THE EMPLDYEE FILE"
"<24 SUFFIX FDR FILE IS -- <SUFFIX"
"<12 *****************************************************"
" "
PRINT ALIAS IN 20 USAGE IN 30 FLDNO IN 40
SEGMENT CRFILE SWI AS 'INDEX,FIELD'
BY XFIELDNAME AS 'FIELDNAME'
END
|
Figure 3 Output
AN ALPHA LISTING DF FIELD NAMES FDR THE EMPLDYEE FILE
SUFFIX FOR FILE IS -- FOC
*****************************************************
INDEX
FIELDNAME ALIAS FORMAT FLDNO SEGNAME CRFILE FIELD
--------- ----- ------ ----- ------- ------ -----
ACCTNUMBER ANO I9L 21 ADDRESS
ADDRESS_LN1 LN1 A20 18 ADDRESS
ADDRESS_LN2 LN2 A20 19 ADDRESS
ADDRESS_LN3 LN3 A20 20 ADDRESS
BANK_ACCT BA I9S 11 FUNDTRAN
BANK_CODE BC I6S 10 FUNDTRAN
BANK_NAME BN A20 9 FUNDTRAN
COURSE_CODE CC A6 33 COURSEG EDUCFILE
COURSE_NAME CD A30 34 COURSEG EDUCFILE
CURR_JOBCODE CJC A3 7 EMPINFO
CURR_SAL CSAL D12.2M 6 EMPINFO
DAT_INC DI I6YMD 13 PAYINFO
DATE_ATTEND DA I6YMD 31 ATTNDSEG EDUCFILE
DED_AMT DA D12.2M 25 DEDUCT
DED_CODE DC A4 24 DEDUCT
DEPARTMENT DPT A10 5 EMPINFO
ED_HRS OJT F6.2 8 EMPINFO
EFFECT_DATE EDATE I6YMD 12 FUNDTRAN
EMP_ID EID A9 1 EMPINFO
EID A9 32 ATTNDSEG EDUCFILE INDEXED
FIRST_NAME FN A10 3 EMPINFO
GROSS MO_PAY D12.2M 23 SALINFO
HIRE_DATE HDT I6YMD 4 EMPINFO
JOB_DESC JD A25 27 JOBSEG JOBFILE
JOBCODE JBC A3 16 PAYINFO
JC A3 26 JOBSEG JOBFILE INDEXED
LAST_NAME LN A15 2 EMPINFO
PAY_DATE PD I6YMD 22 SALINFO
PCT_INC PI F6.2 14 PAYINFO
SALARY SAL D12.2M 15 PAYINFO
SEC_CLEAR SC A6 28 SECSEG JOBFILE
SKILL_DESC SD A30 30 SKILLSEG JOBFILE
SKILLS A4 29 SKILLSEG JOBFILE
TYPE AT A4 17 ADDRESS
|
2. The second report (Figure 4)
is a simple report that shows the fieldname, alias, and format. What makes this report
different is that it is sorted by the type of format.
Figure 4: Fieldname, Alias, and Format Sorted by
Type of Format
FOCEXEC
-* THIS PR0CEDURE PR0DUCES A SIMPLE LISTING 0F THE FIELD NAME,
-* ALIAS, AND FORMAT, BY FORMAT TYPE.
DEFINE FILE HOLD
NAME/A20=DECODE FTYPE( 1 'INTEGER, - I' 2 'SINGLE PRECISION - F'
3 'DOUBLE PRECISION - D' 4 'PACKED' - P' 6 'ALPHANUMERIC' A');
ORDER/I2= IF FTYPE EQ 6 THEN 0 ELSE FTYPE;
XFIELDNAME/A12=EDIT(FIELDNAME,'999999999999');
END
TABLE FILE HOLD
HEADING
"<12 A FIELD NAME LIST BY TYPE OF FORMAT"
"<12 ***********************************"
" "
PRINT ALIAS AS '' IN 30 USAGE AS '' IN 40
BY ORDER NOPRINT
BY XFIELDNAME AS '' IN 10
ON ORDER SUBHEAD
"FORMAT OF FIELDS IS: <NAME"
" "
" FIELDNAME ALIAS FORMAT"
" --------- ----- ------"
" "
ON ORDER NOSPLIT
END
|
Figure 4 Output
A FIELD NAME LIST BY TYPE OF FORMAT
***********************************
FORMAT OF FIELDS IS: ALPHANUMERIC - A
FIELDNAME ALIAS FORMAT
--------- ----- ------
ADDRESS_LN1 LN1 A20
ADDRESS_LN2 LN2 A20
ADDRESS_LN3 LN3 A20
BANK_NAME BN A20
COURSE_CODE CC A6
COURSE_NAME CD A30
CURR_JOBCODE CJC A3
DED_CODE DC A4
DEPARTMENT DPT A10
EMP_ID EID A9
EID A9
FIRST_NAME FN A10
JOB_DESC JD A25
JOBCODE JBC A3
JC A3
LAST_NAME LN A15
SEC_CLEAR SC A6
SKILL_DESC SD A30
SKILLS A4
TYPE AT A4
FORMAT OF FIELDS IS: INTEGER - I
FIELDNAME ALIAS FORMAT
--------- ----- ------
ACCTNUMBER ANO I9L
BANK_ACCT BA I9S
BANK_CODE BC I6S
DAT_INC DI I6YMD
DATE_ATTEND DA I6YMD
EFFECT_DATE EDATE I6YMD
HIRE_DATE HDT I6YMD
PAY_DATE PD I6YMD
FORMAT OF FIELDS IS: SINGLE PRECISION - F
FIELDNAME ALIAS FORMAT
--------- ----- ------
ED_HRS OJT F6.2
PCT_INC PI F6.2
FORMAT OF FIELDS IS: DOUBLE PRECISION - D
FIELDNAME ALIAS FORMAT
--------- ----- ------
CURR_SAL CSAL D12.2M
DED_AMT DA D12.2M
GROSS MO_PAY D12.2M
SALARY SAL D12.2M
|
3. The next report (Figure 5) provides
information that does not appear in the first two reports. It shows the space
requirements internal bytes of storage for each field. This is very handy
when calculating total storage requirements or deciding if certain field
formats should be changed. In addition, we see the display length of each
field, which is helpful in designing report layouts.
Figure 5: Space Required by Each Field
-* THIS PROCEDURE PRODUCES AN ALPHA LIST OF FIELDNAMES IN
-* A FILE. IT PROVIDES INFORMATION ON THE INTERNAL STORAGE
-* LENGTH AND THE DISPLAY LENGTH. THIS CAN BE USEFUL IN
-* DETERMINING A FILE'S STORAGE REOUIREMENTS AND REPORT LAYOUTS.
-* THE REPORT ALSO INDICATES WHICH FIELDS ARE ACTUALLY IN
-* CROSS-REFERENCE FILE
DEFINE FILE HOLD
XFIELDNAME/A12=EDIT(FIELDNAME,'999999999999');
END
TABLE FILE HOLD
HEADING
"<12 A LISTING OF FIELD INTERNAL STORAGE AND DISPLAY LENGTH"
"<21 FOR THE EMPLOYEE FILE -- SUFFIX = <SUFFIX"
"<12 ******************************************************"
" "
" "
PRINT ALIAS IN 20 USAGE IN 30
FLEN AS 'BYTES OF,STORAGE' IN 40
EXLEN AS 'DISPLAY,LENGTH' IN 50
CRFILE AS 'X-REF,FILE' IN 60
BY XFIELDNAME AS 'FIELD NAME'
END
|
Figure 5 Output
A LISTING OF FIELD INTERNAL STORAGE AND DISPLAY LENGTH
FOR THE EMPLOYEE FILE -- SUFFIX = FOC
******************************************************
BYTES Of DISPLAY X-REF
FIELD NAME ALIAS FORMAT STORAGE LENGTH FILE
---------- ----- ------ -------- ------- -----
ACCTNUMBER ANO I9L 4 9
ADDRESS_LN1 LN1 A20 20 20
ADDRESS_LN2 LN2 A20 20 20
ADDRESS_LN3 LN3 A20 20 20
BANK_ACCT BA I9S 4 9
BANK_CODE BC I6S 4 6
BANK_NAME BN A20 20 20
COURSE_CODE CC A6 6 6 EDUCFILE
COURSE_NAME CD A30 30 30 EDUCFILE
CURR_JOBCODE CJC A3 3 3
CURR_SAL CSAL D12.2M 8 15
DAT_INC DI I6YMD 4 8
DATE_ATTEND DA I6YMD 4 8 EDUCFILE
DED_AMT DA D12.2M 8 15
DED_CODE DC A4 4 4
DEPARTMENT DPT A10 10 10
ED_HRS OJT F6.2 4 6
EFFECT_DATE EDATE I6YMD 4 8
EMP_ID EID A9 9 9
EID A9 9 9 EDUCFILE
FIRST_NAME FN A10 10 10
GROSS MO_PAY D12.2M 8 15
HIRE_DATE HDT I6YMD 4 8
JOB_DESC JD A25 25 25 JOBFILE
JOBCODE JBC A3 3 3
JC A3 3 3 JOBFILE
LAST_NAME LN A15 15 15
PAY_DATE PD I6YMD 4 8
PCT_INC PI F6.2 4 6
SALARY SAL D12.2M 8 15
SEC_CLEAR SC A6 6 6 JOBFILE
SKILL_DESC SD A30 30 30 JOBFILE
SKILLS A4 4 4 JOBFILE
TYPE AT A4 4 4
|
4. The fourth report (Figure 6)
gives much of the information seen in the previous reports, but broken
down on a segment-by-segment basis. In addition, we are given the segment number,
the segtype, the number of keys in that segment, and the fields that are key
fields (indicated by the word KEY).
Figure 6: Segment Information
FOCEXEC
-* THIS PROCEDURE WILL PRODUCE A LIST OF FIELD NAMES BY SEGMENT,
-* ALONG WITH THE ALIAS, FIELD FORMAT, AND INDICATE KEY FIELDS
-* IN EACH SEGMENT.
-* THIS REPORT ALSO INCLUDES CROSS-REFERENCE SEGMENT INFORMATION
DEFINE FILE HOLD
FIRST/I3 = FSTFLD+SKEYS-1;
KEY1/A3 = IF SEGTYPE CONTAINS 'U' THEN ' ' ELSE
IF FLDNO GE FSTFLD AND FLDNO LE FIRST THEN 'KEY' ELSE ' ';
KEY2/I3 = IF SEGTYPE CONTAINS 'U' THEN 0 ELSE SKEYS;
XFIELDNAME/A12=EDIT(FIELDNAME,'999999999999');
END
TABLE FILE HOLD
HEADING
"A LISTING OF FIELD NAMES ARRANGED BY SEGMENT"
"FOR THE EMPLOYEE FILE -- SUFFIX = <SUFFIX"
"********************************************"
" "
PRINT ALIAS AS '' IN 20 USAGE AS '' IN 30
KEY1 AS '' IN 40
BY SEGNO NOPRINT BY SEGMENT NOPRINT BY XFIELDNAME AS ''
ON SEGMENT SUBHEAD
" "
"SEGMENT: <SEGNO -- <SEGMENT SEGTYPE: <SEGTYPE NO. OF KEYS: <KEY2"
"------------------------------------------------------"
" "
" <1 FIELD NAME <20 ALIAS <30 FORMAT <40 KEY FIELD"
" <1 ---------- <20 ----- <30 ------ <40 ---------"
ON SEGMENT SKIP-LINE
ON SEGMENT NOSPLIT
END |
Figure 6 Output
A LISTING OF FIELD NAMES ARRANGED BY SEGMENT
FOR THE EMPLOYEE FILE -- SUFFIX = FOC
********************************************
SEGMENT: 1 -- EMPINFO SEGTYPE: S NO. OF KEYS: 1
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
CURR_JOBCODE CJC A3
CURR_SAL CSAL D12.2M
DEPARTMENT DPT A10
ED_HRS OJT F6.2
EMP_ID EID A9 KEY
FIRST_NAME FN A10
HIRE_DATE HDT I6YMD
LAST_NAME LN A15
SEGMENT: 2 -- FUNDTRAN SEGTYPE: U NO. OF KEYS: 0
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
BANK_ACCT BA I9S
BANK_CODE BC I6S
BANK_NAME BN A20
EFFECT_DATE EDATE I6YMD
SEGMENT: 3 -- PAYINFO SEGTYPE: SH NO. OF KEYS: 1
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
DAT_INC DI I6YMD KEY
JOBCODE JBC A3
PCT_INC PI F6.2
SALARY SAL D12.2M
SEGMENT: 4 -- JOBSEG SEGTYPE: KU NO. OF KEYS: 0
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
JOB_DESC JD A25
JOBCODE JC A3
SEGMENT: 5 -- SECSEG SEGTYPE: KLU NO. OF KEYS: 0
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
SEC_CLEAR SC A6
SEGMENT: 6 -- SKILLSEG SEGTYPE: KL NO. OF KEYS: 1
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
SKILL_DESC SD A30
SKILLS A4 KEY
SEGMENT: 7 -- ADDRESS SEGTYPE: S NO. OF KEYS: 1
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
ACCTNUMBER ANO I9L
ADDRESS_LN1 LN1 A20
ADDRESS_LN2 LN2 A20
ADDRESS_LN3 LN3 A20
TYPE AT A4 KEY
SEGMENT: 8 -- SALINFO SEGTYPE: SH NO. OF KEYS: 1
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
GROSS MO_PAY D12.2M
PAY_DATE PD I6YMD KEY
SEGMENT: 9 -- DEDUCT SEGTYPE: S NO. OF KEYS: 1
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
DED_AMT DA D12.2M
DED_CODE DC A4 KEY
SEGMENT: 10 -- ATTNDSEG SEGTYPE: KM NO. OF KEYS: 1
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
DATE_ATTEND DA I6YMD KEY
EMP_ID EID A9
SEGMENT: 11 -- COURSEG SEGTYPE: KLU NO. OF KEYS: 0
------------------------------------------------------
FIELD NAME ALIAS FORMAT KEY FIELD
---------- ----- ------ ---------
COURSE_CODE CC A6
COURSE_NAME CD A30
|
5. The next report (Figure 7)
allows us to check for the presence of duplicate fieldnames in files. In this
report we see like-named fields in cross-reference files.
Figure 7: Duplicate Fieldnames
FOCEXEC
-* THIS PROCEDURE WILL PRODUCE A LISTING OF DUPLICATE FIELDNAMES.
-* THIS CAN BE USEFUL BOTH FOR FILES WITHOUT ANY CROSS-REFERENCES.
-* AS WELL AS IDENTIFY LIKE FIELDNAMES THAT ACTUALLY ARE PART OF
-* A CROSS-REFERENCE STRUCTURE.
DEFINE FILE HOLD
XFIELDNAME/A12=EDIT(FIELDNAME,'999999999999');
END
TABLE FILE HOLD
HEADING
" <20 A LISTING OF DUPLICATE FIELD NAMES"
" <20 **********************************"
" "
COUNT FIELDNAME IN 15
BY XFIELDNAME AS 'FIELDNAME'
PRINT ALIAS IN 30 USAGE IN 40
SEGMENT AS 'SEGMENT,NAME' CRFILE AS 'X-REF,FILE'
BY XFIELDNAME AS 'FIELDNAME'
IF TOTAL COUNT NE 1
END |
Figure 7 Output
A LISTING OF DUPLICATE FIELD NAMES
**********************************
FIELDNAME SEGMENT X-REF
FIELDNAME COUNT ALIAS FORMAT NAME FILE
--------- --------- ----- ------ ------- -----
EMP_ID 2 EID A9 EMPINFO
EID A9 ATTNDSEG EDUCFILE
JOBCODE 2 JBC A3 PAYINFO
JC A3 JOBSEG JOBFILE
|
6. The sixth report (Figure 8)
produces a segment analysis showing each segment, the segtype, the length of all the
fields in the segment, the length of the internal pointers, the total segment length
and the number of instances per page.
Figure 8: Segment Analysis
FOCEXEC
-* THIS PROCEDURE USES THE HOLD FILE PRODUCED BY
-* CHECK FILE HOLD, AND PRODUCES INFORMATION REGARDING
-* THE LENGTH OF FIELDS PER SEGMENT, THE LENGTH OF POINTERS,
-* THE TOTAL SEGMENT LENGTH, AND INSTANCES PER PAGE
DEFINE FILE HOLD
KEY1/I2=IF SEGTYPE CONTAINS 'U' THEN 0 ELSE SKEYS;
KEY2/A2=EDIT(KEYl);
SEGTYP/A6=IF SEGTYPE EQ 'S' OR 'SH' THEN SEGTYPE||KEY2 ELSE SEGTYPE;
PNTRS/I4S=IF SEGNO EQ 1 THEN NUMDEC + 1 ELSE NUMDEC + 2;
SEG1/I4S=INT((SEGSIZE+3)/4);
SEG2/I4S=SEG1 * 4;
PNTR_LEN/I4S=PNTRS * 4;
TOT_LEN/I4S=SEG2 + PNTR_LEN;
END
TABLE FILE HOLD
HEADING
"AN ANALYSIS OF SEGMENTS IN THE EMPLOYEE FILE"
" "
PRINT SEGTYP AS 'SEGMENT,TYPE'
SEG2 AS 'LENGTH OF,FIELDS'
PNTR_LEN AS 'POINTER,LENGTH'
TOT_LEN AS 'TOTAL,SEGMENT,LENGTH'
AND COMPUTE
PAGE_INST/I4S=3968/TOT_LEN; AS 'INSTANCES,PER PAGE'
BY SEGNO AS 'SEGMENT,NUMBER'
BY SEGNAME AS 'SEGMENT,NAME'
END |
Figure 8 Output
AN ANALYSIS OF SEGMENTS IN THE EMPLOYEE FILE
TOTAL
SEGMENT SEGMENT SEGMENT LENGTH OF POINTER SEGMENT INSTANCES
NUMBER NAME TYPE FIELDS LENGTH LENGTH PER PAGE
------- ------- ------- --------- ------- ------- ---------
1 EMPINFO S01 64 24 88 45
2 FUNDTRAN U 32 8 40 99
3 PAYINFO SH01 20 12 32 124
4 JOBSEG KU 28 16 44 90
5 SECSEG KLU 8 8 16 248
6 SKILLSEG KL 36 8 44 90
7 ADDRESS S01 68 8 76 52
8 SALINFO SH01 12 12 24 165
9 DEDUCT S01 12 8 20 198
10 ATTNDSEG KM 16 12 28 141
11 COURSEG KLU 36 8 44 90
|
These same reports, with little modification, can be used to document
non-FOCUS files and extract files produced by the ON
TABLE HOLD syntax. To illustrate this, I have chosen the
ECOURSE and
COURSE files used in the current Relational Data Adapter manual
(see Figure 9 for the MFDs).
This final report (Figure 10) is based on a
CHECK FILE filename
HOLD of a DB2 table. As you can see, the report shows the fieldnames, the actual, the usage,
the presence of remote segments for read-only access, and whether the
MISSING attribute is used for certain fields.
Figure 9: ECOURSE and COURSE MFDs
ECOURSE MASTER FILE
FILENAME=ECOURSE, SUFFIX=SQLDS, $
SEGNAME=EMPINFO, SEGTYPE=S0, $
FIELD=EMP_ID ,ALIAS=EID ,USAGE=A9 ,ACTUAL=A9,$
FIELD=LAST_NAME ,ALIAS=LN ,USAGE=A15 ,ACTUAL=A15,$
FIELD=FIRST_NAME ,ALIAS=FN ,USAGE=A10 ,ACTUAL=A10,$
FIELD=HIRE_DATE ,ALIAS=HDT ,USAGE=YMD ,ACTUAL=DATE,$
FIELD=DEPARTMENT ,ALIAS=DPT ,USAGE=A10 ,ACTUAL=A10,
MISSING=ON,$
FIELD=CURRENT_SALARY,ALIAS=CSAL ,USAGE=P9.2 ,ACTUAL=P4,$
FIELD=CURR_JOBCODE ,ALIAS=CJC ,USAGE=A3 ,ACTUAL=A3,$
FIELD=ED_HRS ,ALIAS=OJT ,USAGE=F6.2 ,ACTUAL=F4,
MISSING=ON,$
FIELD=BONUS_PLAN ,ALIAS=BONUS_PLAN ,USAGE=I4 ,ACTUAL=I4,$
SEGNAME=COURSE ,SEGTYPE=KL ,PARENT=EMPINFO, CRFILE=COURSE,$
|
COURSE MASTER FILE
$ THIS IS THE CROSS-REFERENCE FILE USED FOR PRODUCING A
$ REPORT FOR A NON-FOCUS FILE FILENAME=COURSE, SUFFIX=SQLDS,$
FILENAME=COURSE ,SUFFIX=SQLDS,$
SEGNAME=COURSE ,SEGTYPE=S0 ,$
FIELD=CNAME ,ALIAS=COURSE_NAME ,USAGE=A15, ACTUAL=A15,$
FIELD=WHO ,ALIAS=EMP_NO ,USAGE=A9, ACTUAL=A9,$
FIELD=GRADE ,ALIAS=GRADE ,USAGE=A1, ACTUAL=A1, MISSING=ON,$
FIELD=YR_TAKEN,ALIAS=YR_TAKEN ,USAGE=A2, ACTUAL=A2,$
FIELD=QTR ,ALIAS=QUARTER ,USAGE=A1, ACTUAL=A1,$ |
Figure 10: Report for Non-FOCUS File
FOCEXEC
CHECK FILE ECOURSE HOLD
-* THIS PRODUCES AN ALPHA LISTING OF FIELDNAME, ALIASES,
-* AND FORMAT FOR A NON-FOCUS FILE.
-* NOTICE, THAT IN THIS PROCEDURE WE ARE INDICATING WHETHER A
-* FIELD HAS THE 'MISSING' ATTRIBUTE IN THE MASTER.
-* THIS FEATURE IS HANDY FOR FOCUS FILES.
DEFINE FILE HOLD
ACT/A8=IF USAGE EQ 'YMD' THEN 'DATE' ELSE ACTUAL;
XFIELDNAME/A12=EDIT(FIELDNAME,'999999999999');
END
TABLE FILE HOLD
HEADING
"<12 AN ALPHA LISTING OF FIELD NAMES FOR THE EMPLOYEE FILE"
"<21 SUFFIX FOR FILE IS -- <SUFFIX"
"<12 ******************************************************"
" "
PRINT ALIAS IN 20 ACT AS 'ACTUAL' IN 30 USAGE AS 'USAGE' IN 40
SEGMENT CRFILE AS 'REMOTE,SEGMENT' KMISSING AS 'MISSING,SET ON'
BY XFIELDNAME AS 'FIELDNAME'
END |
Figure 10 Output
AN ALPHA LISTING OF FIELD NAMES FOR THE EMPLOYEE FILE
SUFFIX FOR FILE IS -- SQLDS
******************************************************
REMOTE MISSING
FIELDNAME ALIAS ACTUAL USAGE SEGNAME SEGMENT SET ON
--------- ----- ------ ----- ------- ------- -------
BONUS_PLAN BONUS I004 I4 EMPINFO
CNAME COURSE A015 A15 COURSE COURSE
CURR_JOBCODE CJC A003 A3 EMPINFO
CURRENT_SALARY CSAL P004 P9.2 EMPINFO
DEPARTMENT DPT A010 A10 EMPINFO Y
ED_HRS OJT F004 F6.2 EMPINFO Y
EMP_ID EID A009 A9 EMPINFO
FIRST_NAME FN A010 A10 EMPINFO
GRADE GRADE A001 A1 COURSE COURSE Y
HIRE_DATE HDT DATE YMD EMPINFO
LAST_NAME LN A015 A15 EMPINFO
QTR QUARTER A001 A1 COURSE COURSE
WHO EMP_NO A009 A9 COURSE COURSE
YR_TAKEN YR_TAKEN A002 A2 COURSE COURSE |
|
|