In this section: |
Most standard Master File attributes are used with VSAM and ISAM data sources in the standard way. For more information, see Identifying a Data Source, Describing a Group of Fields, and Describing an Individual Field.
The only exception involves unrelated RECTYPEs, where the root SEGNAME must be DUMMY.
All non-repeating data goes in the root segment. The remaining segments may have any valid name from one to eight characters.
Any segment except the root is the descendant, or child, of another segment. The PARENT attribute supplies the name of the segment that is the hierarchical parent or owner of the current segment. If no PARENT attribute appears, the default is the immediately preceding segment. The PARENT name may be one to eight characters.
How to: |
A single-segment data source may have only one key field, but it must still be described with a GROUP declaration. The group must have ALIAS=KEY.
Groups can also be assigned simply to provide convenient reference names for groups of fields. Suppose that you have a series of three fields for an employee: last name, first name, and middle initial. You use these three fields consistently to identify the employee. You can identify the three fields in your Master File as a GROUP named EMPINFO. Then, you can refer to these three linked fields as a single unit, called EMPINFO. When using the GROUP feature for non-keys, the parameter ALIAS= must still be used, but should not equal KEY.
For group fields, you must supply both the USAGE and ACTUAL formats in alphanumeric format. The length must be exactly the sum of the subordinate field lengths.
The GROUP declaration USAGE attribute specifies how many positions to use to describe the key in a VSAM KSDS data source. If a Master File does not completely describe the full key at least once, the following warning message appears:
(FOC1016) INVALID KEY DESCRIPTION IN MASTER FILE
The cluster key definition is compared to the Master File for length and displacement.
When you expand on the key in a RECTYPE data source, describe the key length in full on the last non-OCCURS segment on each data path.
Do not describe a group with ALIAS=KEY for OCCURS segments.
If the fields that make up a group key are not alphanumeric fields, the format of the group key is still alphanumeric, but its length is determined differently. The ACTUAL length is still the sum of the subordinate field lengths. The USAGE format, however, is the sum of the internal storage lengths of the subordinate fields because regardless of the data types, the group will be displayed as alphanumeric. You determine these internal storage lengths as follows:
GROUP = keyname, ALIAS = KEY, USAGE = Ann, ACTUAL = Ann ,$
where:
Can have up to 66 characters.
In the library data source, the first field, PUBNO, can be described as a group key. The publisher number consists of three elements: a number that identifies the publisher, one that identifies the author, and one that identifies the title. They can be described as a group key, consisting of a separate field for each element if the data source is a VSAM data structure.
The Master File looks as follows:
FILE = LIBRARY5, SUFFIX = VSAM,$ SEGMENT = ROOT, SEGTYPE = S0,$ GROUP = BOOKKEY ,ALIAS = KEY ,USAGE = A10 ,ACTUAL = A10 ,$ FIELDNAME = PUBNO ,ALIAS = PN ,USAGE = A3 ,ACTUAL = A3 ,$ FIELDNAME = AUTHNO ,ALIAS = AN ,USAGE = A3 ,ACTUAL = A3 ,$ FIELDNAME = TITLNO ,ALIAS = TN ,USAGE = A4 ,ACTUAL = A4 ,$ FIELDNAME = AUTHOR ,ALIAS = AT ,USAGE = A25 ,ACTUAL = A25 ,$ FIELDNAME = TITLE ,ALIAS = TL ,USAGE = A50 ,ACTUAL = A50 ,$ FIELDNAME = BINDING ,ALIAS = BI ,USAGE = A1 ,ACTUAL = A1 ,$ FIELDNAME = PRICE ,ALIAS = PR ,USAGE = D8.2N ,ACTUAL = D8 ,$ FIELDNAME = SERIAL ,ALIAS = SN ,USAGE = A15 ,ACTUAL = A15 ,$ FIELDNAME = SYNOPSIS ,ALIAS = SY ,USAGE = A150 ,ACTUAL = A150 ,$ FIELDNAME = RECTYPE ,ALIAS = B ,USAGE = A1 ,ACTUAL = A1 ,$
GROUP = A, ALIAS = KEY, USAGE = A14, ACTUAL = A8 ,$ FIELDNAME = F1, ALIAS = F1, USAGE = P6, ACTUAL=P2 ,$ FIELDNAME = F2, ALIAS = F2, USAGE = I9, ACTUAL=I4 ,$ FIELDNAME = F3, ALIAS = F3, USAGE = A2, ACTUAL=A2 ,$
The lengths of the ACTUAL attributes for subordinate fields F1, F2, and F3 total 8, which is the length of the ACTUAL attribute of the group key. The display lengths of the USAGE attributes for the subordinate fields total 17. However, the length of the group key USAGE attribute is found by adding their internal storage lengths as specified by their field types: 8 for USAGE=P6, 4 for USAGE=I9, and 2 for USAGE=A2, for a total of 14.
When you use a group field with multiple formats in a query, you must account for each position in the group, including trailing blanks or leading zeros. The following example illustrates how to access a group field with multiple formats in a query:
GROUP = GRPB, ALIAS = KEY, USAGE = A8, ACTUAL = A8 ,$ FIELDNAME = FIELD1, ALIAS = F1, USAGE = A2, ACTUAL = A2 ,$ FIELDNAME = FIELD2, ALIAS = F2, USAGE = I8, ACTUAL = I4 ,$ FIELDNAME = FIELD3, ALIAS = F3, USAGE = A2, ACTUAL = A2 ,$
The values in fields F1 and F3 may include some trailing blanks, and the values in field F2 may include some leading zeros. When using the group in a query, you must account for each position. Because FIELD2 is a numeric field, you cannot specify the IF criteria as follows:
IF GRPB EQ 'A 0334BB'
You can eliminate this error by using a slash (/) to separate the components of the group key:
IF GRPB EQ 'A/334/BB'
Note: Blanks and leading zeros are assumed where needed to fill out the key.
How to: |
Reference: |
A GROUP declaration in a Master File describes several fields as a single entity. One use of a group is to describe Group keys in a VSAM data source. Sometimes referring to several fields by one group name facilitates ease of reporting.
Traditionally, when describing a GROUP field, you had to take account of the fact that while the USAGE and ACTUAL format for the GROUP field are both alphanumeric, the length portion of the USAGE format for the group had to be calculated as the sum of the component lengths, where each integer or single precision field counted as 4 bytes, each double precision field as 8 bytes, and each packed field counted as either 8 or 16 bytes depending on its size.
To avoid the need to calculate these lengths, you can use the GROUP ELEMENTS option, which describes a group as a set of elements without USAGE and ACTUAL formats.
GROUP=group1, ALIAS=g1alias,ELEMENTS=n1,$ FIELDNAME=field11, ALIAS=alias11, USAGE=ufmt11, ACTUAL=afmt11, $ . . . FIELDNAME=field1h, ALIAS=alias1h, USAGE=ufmt1h, ACTUAL=afmt1h, $ GROUP=group2,ALIAS=g2alias,ELEMENTS=n2,$ FIELDNAME=field21, ALIAS=alias21, USAGE=ufmt21, ACTUAL=afmt21, $ . . . FIELDNAME=field2k, ALIAS=alias2k, USAGE=ufmt2k, ACTUAL=afmt2k, $
where:
Are valid names assigned to a group of fields. The rules for acceptable group names are the same as the rules for acceptable field names.
Are the number of elements (fields and/or groups) that compose the group. If a group is defined within another group, the subgroup (with all of its elements) counts as one element of the parent group.
Are valid field names.
Are valid alias names.
Are USAGE formats for each field.
Are ACTUAL formats for each field.
In the following Master File, GRP2 consists of two elements, fields FIELDA and FIELDB. GRP1 consists of two elements, GRP2 and field FIELDC. Field FIELDD is not part of a group:
FILENAME=XYZ , SUFFIX=FIX , $ SEGMENT=XYZ, SEGTYPE=S2, $ GROUP=GRP1,ALIAS=CCR,ELEMENTS=2,$ GROUP=GRP2,ALIAS=CC,ELEMENTS=2,$ FIELDNAME=FIELDA, ALIAS=E01, USAGE=A10, ACTUAL=A10, $ FIELDNAME=FIELDB, ALIAS=E02, USAGE=A16, ACTUAL=A16, $ FIELDNAME=FIELDC, ALIAS=E03, USAGE=P27, ACTUAL=A07, $ FIELDNAME=FIELDD, ALIAS=E04, USAGE=D7, ACTUAL=A07, $
The following chart shows the offsets and formats of these fields.
Field Number |
Field Name |
Offset |
USAGE |
ACTUAL |
---|---|---|---|---|
1 |
GRP1 |
0 |
A42 - Supports 16 characters for FIELDC (P27) |
A33 |
2 |
GRP2 |
0 |
A26 |
A26 |
3 |
FIELDA |
0 |
A10 |
A10 |
4 |
FIELDB |
10 |
A16 |
A16 |
5 |
FIELDC |
26 |
P27 |
A7 |
6 |
FIELDD |
42 |
D7 |
A7 |
Note that the display characteristics of the group have not changed. The mixed format group GRP1 will still display as all alphanumeric.