То, что вы пытаетесь определить, представляет собой структуру «Сложность возникает в зависимости от» (сложный ODO).
Вы можете определить сложный ODO, где таблица представляет собой прямоугольник следующим образом:
01 TABLE-REC.<br>
05 M PIC S9(4) BINARY.
05 N PIC S9(4) BINARY.
05 ROWS OCCURS 10 TIMES DEPENDING ON M.
10 COLUMNS OCCURS 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
Хитрость заключается в том, что объявление N не может происходить в переменной части таблицы.Например, следующее объявление:
01 TABLE-REC.
05 M PIC S9(4) BINARY.
05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
10 N PIC S9(4) BINARY
10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
приведет к ошибке, поскольку объявление подразумевает, что каждая строка может содержать различное количество столбцов (т. Е. Не прямоугольная таблица).
В общем, существует много недоразумений относительно того, что структура ODO в COBOL действительно «покупает» вас.Существует распространенное, но ошибочное мнение, что его можно использовать для экономии памяти, поскольку размер структуры данных может быть динамически изменен.Это абсолютно неверно, когда ODO объявлен в ЛОКАЛЬНОМ или РАБОЧЕМ ХРАНИЛИЩЕ.Компилятор COBOL выделит достаточно памяти для размещения наибольшего значения M и N.
То, что он «покупает», - это механизм для физической организации данных в памяти.Посмотрите на следующую программу и то, что она отображает:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXODO.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 I PIC S9(4) BINARY.
77 J PIC S9(4) BINARY.
01 DIMENSIONS.
05 M PIC S9(4) BINARY VALUE 6.
05 N PIC S9(4) BINARY VALUE 7.
01 TABLE-REC-1.
05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
01 TABLE-REC-2.
05 ROWS OCCURS 10 TIMES.
10 COLUMNS OCCURS 10 TIMES.
20 CELL PIC X(1).
PROCEDURE DIVISION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > M
PERFORM VARYING J FROM 1 BY 1 UNTIL J > N
MOVE 'X' TO CELL OF TABLE-REC-1 (I J)
MOVE 'X' TO CELL OF TABLE-REC-2 (I J)
END-PERFORM
END-PERFORM
DISPLAY TABLE-REC-1
DISPLAY TABLE-REC-2
GOBACK
.
Отображение:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX
Обратите внимание, что в версии ODO все данные красиво скомпонованы в 6Матрица X 7, в то время как версия с фиксированным столом сохраняет матрицу 10 X 10 с кучей «дырок» в ней, чтобы заполнить каждую строку до максимального числа OCCURS
.Есть моменты, когда это различие важно (но чаще всего это не так).
Я вижу, что вы используете Net Express, с которым я не знаком, поэтому вам, возможно, придется возиться, чтобы получить следующую частьработать.С IBM Enterprise COBOL для Z / OS вы можете делать следующее:
Определить ODO в программе LINKAGE SECTION
, чтобы не было выделено никакой памяти, это просто макет записи.Затем вы можете динамически выделить достаточно памяти для фактического размера таблицы, необходимой (т.е. M раз N элементов).Соедините их, используя что-то вроде: SET ADDRESS OF ODO-DATA-STRUCTURE TO mem-address
(в CICS используйте GETMAIN, а в пакетном режиме используйте CEEGTST для получения памяти).Теперь у вас есть динамическая структура данных, которая использует минимальный объем пространства и все равно будет правильно индексировать из-за свойств макета, показанных выше.
Существуют другие способы использования (или не использования) ODO в COBOL, но онисамые распространенные из известных мне.