Это либо расширение языка COBOL в Micro Focus Visual COBOL 2.3, либо ошибка.
Действительно, поиск некоторой документации Micro Focus показывает:
OSVS MF Описание данных для data-name-2 может содержать предложение OCCURS.
OSVS и MF указывают, к чему относится расширение языка. MF — это Micro Focus, OSVS, как я полагаю, предназначена для OS/VS COBOL на мейнфрейме IBM. Я часто использовал это, но, поскольку я не пишу код таким образом, я не могу сказать, работало ли это так. OS/VS COBOL соответствовал стандарту 1974 года.
Находя старое (1975 г.) руководство по OS/VS COBOL, вот определение REDEFINES:
номер уровня имя-данных-l ПЕРЕОПРЕДЕЛЯЕТ имя-данных-2
Это также служит для цитаты Micro Focus.
Вот соответствующая часть из этого руководства OS/VS COBOL:
Запись описания данных far data-name-2 не может содержать предложение OCCURS.
Поэтому я не уверен, что OSVS в документе Micro Focus — это OS/VS COBOL. Я знаю, что значки где-то перечислены...
Из проекта Стандарта 2015 г. (получить настоящий Стандарт дорого):
Запись описания данных для data-name-2 не должна содержать предложение OCCURS. Однако имя-данных-2 может быть подчинено элементу, запись описания данных которого содержит предложение OCCURS. В этом случае ссылка на имя-данных-2 в предложении REDEFINES не должна индексироваться. Ни исходное определение, ни переопределение не должны включать таблицу, зависящую от вхождения.
Стандарт 1985 года в том, что касается ПЕРЕОПРЕДЕЛЕНИЯ СОБЫТИЙ, остается таким же.
Это должно сделать для вас:
01 COUNTER.
03 DIGITS1 OCCURS 40 TIMES PIC 9.
Просто используйте COUNTER вместо STRING1 (надеюсь, эти имена только для этого примера, а не настоящие).
СЧЕТЧИК — это элемент группы, который обрабатывается как буквенно-цифровой элемент с общей длиной, равной сумме длин всех его подчиненных элементов.
Вы хотите, чтобы STRING1 было 40-байтовым полем PIC X, если оно у вас уже есть: COUNTER.
Я всегда кодирую свои таблицы так:
01 FILLER.
05 FILLER PIC something.
05 FILLER.
10 FILLER OCCURS 40 TIMES.
15 FILLER PIC something.
05 FILLER PIC something.
Хорошо, концептуально я делаю это. Затем для каждого уровня OCCURS, который мне действительно нужен, я даю ему имя. Если за пределами структуры OCCURS есть элементы, которые мне не нужны, я их удаляю.
При этом, если вам нужно ПЕРЕОПРЕДЕЛИТЬ группу, содержащую OCCURS, нет проблем. Если вам нужно ПЕРЕОПРЕДЕЛИТЬ ПРОИСХОДЯЩИЙ элемент, нет проблем. Вы не можете ПЕРЕОПРЕДЕЛИТЬ (или сделать много полезного) с элементом, фактически содержащим OCCURS, поэтому он остается FILLER.
Это для "ремонтопригодности". Следующему человеку никогда не придется изменять структуру OCCURS, поэтому никогда не нужно беспокоиться при внесении изменений. При сокращенной структуре будущее изменение может потребовать реорганизации, которую затем необходимо учитывать на предмет влияния.
Если бы ваша таблица была закодирована таким образом, то в любом случае не было бы проблемы.
Обратитесь к документации Micro Focus для ПЕРЕОПРЕДЕЛЕНИЙ, они обычно прямо указывают языковые расширения. Если нет языкового расширения, которое вы можете найти, обратитесь в Micro Focus. Они укажут вам на документацию по расширению или сделают с ним что-то еще конструктивное.
Компания Micro Focus использовала несколько коммерческих компиляторов для «малых систем» и предоставляет большую поддержку, позволяющую перейти от этих компиляторов к прямым компиляторам Micro Focus. Я предполагаю, что вы найдете языковое расширение, связанное с этим.
Между прочим, также нестандартно иметь возможность ПЕРЕОПРЕДЕЛЯТЬ меньший элемент как более крупный. DIGITS1 имеет длину один. Ваш элемент REDEFINES имеет длину 40. Однако Micro Focus REDEFINES позволяет вам переопределить всю длину OCCURS.
person
Bill Woodger
schedule
08.11.2015