COBOL:GDG文件描述符(FD)可以引用多个代吗?
我有一个程序,可以读取GDG文件并将数据移动到工作存储器。我很想知道是否可以通过引用文件定义,对多代GDG重复这个过程。也许有一种方法可以在文件定义上使用下标?我的想法是,必须有一种方法将不同的文件定义移动到一个引用变量中,从中访问文件。在大型机COBOL中,COBOL:GDG文件描述符(FD)可以引用多个代吗?,cobol,Cobol,我有一个程序,可以读取GDG文件并将数据移动到工作存储器。我很想知道是否可以通过引用文件定义,对多代GDG重复这个过程。也许有一种方法可以在文件定义上使用下标?我的想法是,必须有一种方法将不同的文件定义移动到一个引用变量中,从中访问文件。在大型机COBOL中,FD指的是一个SELECT,它指的是一个DD语句,附加到调用JCL中的程序的EXEC PGM语句。DD语句可能涉及一个或多个GDG。这是在编译时确定的 我认为您要求的是在运行时动态分配文件。有两种方法可以实现这一点,一种是BPXWDYN
FD
指的是一个SELECT
,它指的是一个DD
语句,附加到调用JCL中的程序的EXEC PGM
语句。DD
语句可能涉及一个或多个GDG。这是在编译时确定的
我认为您要求的是在运行时动态分配文件。有两种方法可以实现这一点,一种是BPXWDYN
Identification Division.
Program-ID. SOMETEST.
Environment Division.
Input-Output Section.
File-Control.
Select MY-FILE Assign SYSUT1A.
Data Division.
File Section.
FD MY-FILE
Record 80
Block 0
Recording F.
01 MY-FILE-REC PIC X(080).
Working-Storage Section.
01 CONSTANTS.
05 BPXWDYN-PGM PIC X(008) VALUE 'BPXWDYN '.
05 ALCT-LIT-PROC PIC X(035)
VALUE 'ALLOC FI(SYSUT1A) SHR MSG(WTP) DSN('.
05 FREE-LIT-PROC PIC X(016)
VALUE 'FREE FI(SYSUT1A)'.
05 A-QUOTE PIC X(001) VALUE "'".
01 WORK-AREAS.
05 WS-DSN PIC X(044) VALUE 'MY.GDG.BASE'.
05 WS-GDG-NB PIC 999 VALUE ZEROS.
05 BPXWDYN-PARM.
10 PIC S9(004) COMP-5 VALUE +100.
10 BPXWDYN-PARM-TXT PIC X(100).
Procedure Division.
* Construct the allocation string for BPXWDYN.
MOVE SPACES TO BPXWDYN-PARM-TXT
STRING
ALCT-LIT-PROC
DELIMITED SIZE
WS-DSN
DELIMITED SPACE
'(-'
DELIMITED SIZE
WS-GDG-NB
DELIMITED SIZE
')'
DELIMITED SIZE
INTO
BPXWDYN-PARM-TXT
END-STRING
CALL BPXWDYN-PGM USING
BPXWDYN-PARM
END-CALL
IF RETURN-CODE = 0
CONTINUE
ELSE
[error handling]
END-IF
[file I/O with MY-FILE]
MOVE SPACES TO BPXWDYN-PARM-TXT
MOVE FREE-LIT-PROC TO BPXWDYN-PARM-TXT
CALL BPXWDYN-PGM USING
BPXWDYN-PARM
END-CALL
IF RETURN-CODE = 0
CONTINUE
ELSE
[error handling]
END-IF
GOBACK.
这只是徒手画,所以可能有语法错误,但我希望我已经把想法说清楚了
还有另一种技术,使用由IBM记录的C RTL函数setenv
。看起来可能更简单,但我从来没有这样做过。基于建议的代码示例,setenv
解决方案
笔记
最初的研究让我接触到这个,呃,我能称之为效用吗?(BPXWDYN)当我试图编译此解决方案时,收到一个链接错误
IEW2456E 9207 SYMBOL BPXWDYN未解决。无法从指定的呼叫库中包括成员
我想在给我的系统人员打电话之前,我会研究一下您建议的另一个选项,发现setenv
方法非常有效。我不确定是否允许这样做(如果我错了,请纠正我),但我会将此标记为正确,以便让我找到解决方案,并将对我有效的代码示例添加为另一个答案。@TechSparrow如果愿意,您可以接受您自己的答案而不是我的答案,这在堆栈溢出时是完全可以接受的。关于链接错误,如果动态调用BPXWDYN,则应消除IEW2456E消息。
FILE-CONTROL.
SELECT DATAIN ASSIGN TO UT-S-DATAIN.
DATA DIVISION.
FILE-SECTION.
FD DATAIN
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 133 CHARACTERS
LABEL RECORDS ARE STANDARD
DATA RECORD IS DATA-REC.
01 DATA-REC PIC X(133).
WORKING-STORAGE SECTION.
01 ENV-VARS.
02 ENV-NAME PIC X(9).
02 ENV-VALUE PIC X(100).
02 ENV-OVERWRITE PIC S9(8) COMPUTATIONAL VALUE 1.
PROCEDURE DIVISION.
MOVE Z"DATAIN" TO ENV-NAME
MOVE Z"DSN(PROGRAMMER.TEST.GDGFILE(-1)),SHR" TO ENV-VALUE
MOVE 1 TO ENV-OVERWRITE
CALL "setenv" USING ENV-NAME ENV-VALUE ENV-OVERWRITE.