/ / Створіть таблицю в Коболі з копії? - кобол, мейнфрейм

Створити таблицю в Коболі з копії? - кобол, мейнфрейм

Як створити таблицю з копіювальної книги в Cobol?

У ньому є декілька груп, і тільки один з них має бути в таблиці.

Чи потрібно багаторазово використовувати копіювальний аркуш, замінюючи початок змінних так, щоб компілятор розглядав їх як різні речі?

Я можу редагувати копіювальний аркуш до тих пір, поки інші програми, які використовують його, скомпілюватимуться.

Він знаходиться на IBM Mainframe.

Див. Мою відповідь нижче для мого остаточного рішення. Завдяки @Bruce Martin

Відповіді:

1 для відповіді № 1

IBM мейнфрейми підтримує вкладений книжки, так що ви можете змінити свій копіювальний аркуш на вкладені копії

Також подивіться

так

01  record-layout-1.
...
01  record-layout-2.
...
01  record-layout-3.
...

можна змінити на

01  record-layout-1.
...
01  record-layout-2.
...
01  record-layout-3.
copy newCopy.
...

і у вашій програмі можна використовувати newCopy або що ви його називаєте. Ви, ймовірно, захочете перенумерувати рівні копіювання, поки ви знаходитесь на ньому.

Отже, якщо оригінальний зошит є

01  record-layout-3.
05 field-1          pic x(4).
05 field-2 ...

Ви б створили новий копіювальний аркуш, як

    25 field-1          pic x(4).
25 field-2 ...

Фактичні номери рівнів не є важливими, вони просто повинні бути> 01 для копіювання. Використання 25 дозволить легко вставляти в робочу пам'ять.


Кілька компаній роблять його стандартом-зошити не повинні містити 01 рівнів, так що зошит також може бути вбудований в робочу пам'ять. Це рідко


2 для відповіді № 2

Ви скажете, що ви не можете міняти копіювальний примірник.

Це приклад з довідки щодо мови Enterprise COBOL:

Example 3
If the following conventions are followed in library text, then parts of names (for
example the prefix portion of data names) can be changed with the REPLACING
phrase.
In this example, the library text PAYLIB consists of the following data division
entries:
01 :TAG:.
02 :TAG:-WEEK     PIC S99.
02 :TAG:-GROSS-PAY     PIC S9(5)V99.
02 :TAG:-HOURS     PIC S999 OCCURS 1 TO 52 TIMES
DEPENDING ON :TAG:-WEEK OF :TAG:.
The programmer can use the COPY statement in the data division of a program as
follows:
COPY PAYLIB REPLACING ==:TAG:== BY ==Payroll==.
Usage Note: It is important to notice in this example the required use of colons or
parentheses as delimiters in the library text. Colons are recommended for clarity
because parentheses can be used for a subscript, for instance in referencing a table
element.
In this program, the library text is copied; the resulting text is treated as if it had
been written as follows:
01 PAYROLL.
02 PAYROLL-WEEK PIC S99.
02 PAYROLL-GROSS-PAY     PIC S9(5)V99.
02 PAYROLL-HOURS     PIC S999 OCCURS 1 TO 52 TIMES
DEPENDING ON PAYROLL-WEEK OF PAYROLL.
The changes shown are made only for this program. The text, as it appears in the
library, remains unchanged.

Отже, для цього 01 в межах існуючого зошита, виможе замінити визначення даних після 01 з КОПІЮ ... ЗМІНЕННЯ ... щоб надати той же префікс (якщо імена даних мають префікси ....), а потім створити новий копіювальний пристрій з налагодженими номерами рівня, якщо необхідно ( наприклад, в прикладі показані цифри рівня 02, що завжди нерозумно, але це, мабуть, не єдиний приклад цього у світі). Різні номери рівнів не впливатимуть на існуючий код (так як компілятор все одно нормалізує всі номери рівнів, тому компілятор завжди буде обробляти найнижчий номер рівня після 01 як 02, другий - найменший як 03, і ​​т.д.).

Потім ви можете скористатися своїм новим копіювальником у вашій таблиці.

Майте на увазі, що для посилання на будь-які поля таблиці слід використовувати індексування.

Якщо ви дійсно не можете змінити тему копіювання (деякіНезвичайний диктат, буває іноді), то, мабуть, найкраще робити новий збірок, який є таким же, але з різними префіксами і без 01-рівня, для гнучкості.

Тепер нам потрібна мета зберігання записів.


Здається, у вас є щось подібне:

copy reclyout.

01  record-layout-1.
...
01  record-layout-2.
...
01  record-layout-3.
...

І з цим, ви хочете зберегти запис-макет-2 записи, тільки в таблиці.

Як запитав Брюс Мартін, знання про якікомпілятор і ОС, які ви використовуєте, були б корисні. Деякі, не всі, компілятори COBOL підтримують вкладені оператори копіювання. Ви можете замінити макет вашого запису в оригінальній зошиті copy заяву про нову книжку, яка містила макет.

Ви мали б незначну проблему, яка б вам була потрібна назовні і вам потрібно дозволити достатній розрив у рівнях номерів, щоб дозволити визначенню таблиці включити нову книжку.

01  The-Table.
05  some-name OCCURS 100 TIMES.
copy newlyout.

Визначення даних найвищого рівня вкопіювальний примірник мав би починатися з чисел, що перевищують 05. Цього не можна досягти. Компілятори COBOL так чи інакше "нормалізують" номери рівнів, і шанс того, що ви зробите щось менш гнучке, зробить це майже на нуль. Це найкраще рішення, якщо ваш компілятор підтримує вкладені оператори копіювання.

Так, використання COPY з REPLACING було б дуже корисним. Це завжди потворно, щоб використовувати кваліфікацію імен даних (або міток).

Якщо ні, розглянути можливість зробити те ж саме, алеусунення цього конкретного макета з існуючого копіювального примірника і просто включення нового копіювального аркуша після оригінального копії (-ів) копії. Чи зможете ви це зробити, залежатиме від того, наскільки багато копіювального матеріалу використовується в іншому місці. Візьміть його до свого аналітика / боса.

Якщо це неможливо, зробіть нову тему длятаблицю, а також використовувати коментарі та іншу доступну для вас документацію для встановлення взаємозв'язку між двома визначеннями даних. Не ідеальний, але загальний спосіб, що це зроблено.

Інша можливість полягає в тому, щоб просто визначити області в таблиці, і використовувати компонування запису через a MOVE до запису-макета. Це ще один поширений спосіб, який потребує документації та перевірки довжини в таблиці / запису-макеті і є незручним / неефективним способом зробити це. Знову ж таки, ви зустрінете цей шлях, напевно.

Якщо ви кашляєте на компіляторі / ОС, то є й інші способи.


1 для відповіді № 3

Моє остаточне рішення.

Насправді я закінчив, не маючи створювати таблицювід збірок, але все ще потрібен перемінний 01 груп, щоб бути їх власними зошитами для створення декількох екземплярів змінних з тією ж структурою тільки з різними іменами 01 груп і іменами змінних.

Я в кінцевому підсумку створив індивідуальні книги книжки для перемінних 01 груп, а потім за допомогою блоку Замінити, щоб вкладений копіювач виглядав як оригінал. Нижче наведено остаточний результат.

 REPLACE ==(TAGEIGHT)== BY ==N==.

01  STD-NACHA-FILE-HEADER.
COPY ABRYNAFH.

01  STD-NACHA-BATCH-HEADER.
COPY ABRYNABH.

01  STD-NACHA-DETAIL-TRANS.
COPY ABRYNADT.

01  STD-NACHA-DETAIL-ADDENDA-REC.
COPY ABRYNADA.

01  STD-NACHA-BATCH-TOTAL-REC.
COPY ABRYNABT.

01  STD-NACHA-FILE-TOTAL-REC.
COPY ABRYNAFT.

01  STD-NACHA-FILE-PAD-REC.
COPY ABRYNAFP.

01  STD-NACHA-RETURN-REC.
COPY ABRYNARR.

REPLACE OFF.

Я пішов сюди для того, як використовувати Replace у теці.