что такое "копия соответствующая" в коболе и как она работает? - PullRequest
4 голосов
/ 17 сентября 2009

В тех редких случаях, когда люди говорят хорошие слова о коболе, они часто упоминают "копировать соответствующие" (и "перемещать соответствующие") .

Мне бы очень хотелось узнать больше об этом - какова их семантика? Это так же, как:

(Perl)

for my $key (keys %foo) {
    $bar{key} = $foo{key} if exists $bar{key};
}

Или есть что-то более глубокое, чем это? Записи Кобола строго типизированы, верно? Как это работает?

Ответы [ 2 ]

4 голосов
/ 19 сентября 2009

На самом деле, имена элементов должны быть точно такими же, чтобы 'MOVE CORRESPONDING' работал. Компьютер, на котором я работаю, использует ярлык «MOVE CORR». Я действительно видел «ДОБАВИТЬ КОРР», когда искал примеры.

DATA DIVISION.
FILE SECTION.
FD  PRODUCT-INFO-FILE.
01  PRODUCT-INFO-RECORD.
    03 PI-HOLD-PROD                 PIC  x(12).
    03 PI-HOLD-DESC                 PIC  x(30).
    03 PI-HOLD-DISC                 PIC  9(01).
    03 PI-HOLD-TOTAL                PIC  9(08)V99.

WORKING-STORAGE SECTION.
01  HOLD-FIELDS-DEST.
    03 PI-HOLD-PROD                 PIC  x(12).
    03 PI-HOLD-DESC                 PIC  x(30).
    03 PI-HOLD-DISC                 PIC  9(01).
    03 PI-HOLD-TOTAL                PIC  9(08)V99.

Может быть несколько переменных с одним и тем же именем, поскольку они квалифицированы по уровню '01'. Чтобы сослаться на одно из двух полей, нужно сказать PI-HOLD-PROD OF HOLD-FIELDS-DEST.

Чтобы переместить все значения, можно использовать

MOVE CORRESPONDING PRODUCT-INFO-RECORD TO HOLD-FIELDS-DEST.

Это очень полезно при перемещении полей в новой записи или переменной.

01 WS-DATE-YMD.
   03  YY             PIC 99.
   03  MM             PIC 99.
   03  DD             PIC 99.

01 WS-DATE-MDY.
   03  MM             PIC 99.
   03  FILLER         PIC X VALUE "/".
   03  DD             PIC 99.
   03  FILLER         PIC X VALUE "/".
   03  YY             PIC 99.


MOVE CORR WS-DATE-YMD TO WS-DATE-MDY.
4 голосов
/ 17 сентября 2009

Согласно документам AcuCOBOL (которые я использую):

Когда используется соответствующая фраза, выбранные элементарные предметы в исходная группа перемещена в соответствующие предметы в dest-group. Это рассматривается как серия Формат 1 MOVE заявления, по одному для каждого соответствующая пара элементов данных.

Движение формата 1 выглядит следующим образом:

ПЕРЕМЕСТИТЬ исходный элемент ДО {dest-item}

С учетом следующего файла и определения рабочего хранилища

DATA DIVISION.
FILE SECTION.
FD  PRODUCT-INFO-FILE.
01  PRODUCT-INFO-RECORD.
    03 PI-HOLD-PROD                 PIC  x(12).
    03 PI-HOLD-DESC                 PIC  x(30).
    03 PI-HOLD-DISC                 PIC  9(01).
    03 PI-HOLD-TOTAL                PIC  9(08)V99.

WORKING-STORAGE SECTION.
01  HOLD-FIELDS-DEST.
    03 WS-HOLD-PROD                 PIC  x(12).
    03 WS-HOLD-DESC                 PIC  x(30).
    03 WS-HOLD-DISC                 PIC  9(01).
    03 WS-HOLD-TOTAL                PIC  9(08)V99.

Делаем это:

MOVE CORRESPONDING PRODUCT-INFO-RECORD TO HOLD-FIELDS-DEST.

будет таким же, как это:

MOVE PI-HOLD-PROD  TO WS-HOLD-PROD.
MOVE PI-HOLD-DESC  TO WS-HOLD-DESC.
MOVE PI-HOLD-DISC  TO WS-HOLD-DISC.
MOVE PI-HOLD-TOTAL TO WS-HOLD-TOTAL.

Это спасло 3 строки кода. Многие файлы шире.

EDIT: Это также из того же набора документов ...

В следующей таблице приведены комбинации источника-элемента и Dest-Item, которые разрешены MOVE заявление. Числа в таблице номера "Общих правил" в этот раздел, где каждая комбинация описано:

Sending Category:   Receiving Item Category:
                    Alphabetic  Alphanumeric/Alphanumeric Edited    Numeric /Numeric Edited
Alphabetic          Yes (12)    Yes (13)                            No (15)
Alphanumeric        Yes (12)    Yes (13)                            Yes (14)
Alphanumeric Edited Yes (12)    Yes (13)                            No (15)
Numeric Integer     No (15)     Yes (13)                            Yes (14)
Numeric
Non-integer         No (15)     No (15)                             Yes (14)
Numeric Edited      No (15)     Yes (13)                            Yes (14)

'12. Когда dest-item буквенный, происходит выравнивание и заполнение пробела в соответствии со стандартным выравниванием правила.

'13. Когда dest-item редактируется буквенно-цифровым или буквенно-цифровым способом, обоснование и заполнение пространства происходит в соответствии с Стандартные правила выравнивания. Если исходный элемент подписан числовым Операционный знак не перемещен. Если знак занимает отдельный символ положение, что знак не перемещен, а размер исходного элемента равен рассматривается как на единицу меньше.

'14. Когда dest-элемент является числовым или числовым редактором, десятичная точка происходит выравнивание и заполнение нулями в соответствии со стандартным выравниванием правила. Если исходный элемент не подписан, он считается положительным. Если dest-item не подписан, абсолют значение source-item перемещено. Если Dest-элемент подписан, его знак установлен на знак источника-элемента. Если исходный элемент отредактирован в числовом виде, это "отредактированный" первый такой, что dest-item получает то же числовое значение.

'15. Следующие шаги недопустимы: алфавитный или буквенно-цифровой отредактированный элемент данных не может быть перемещен в числовой или числовой отредактированный элемент данных. Числовой или числовой отредактированный элемент данных не может быть перемещен в алфавитный вещь. Нецелочисленный числовой элемент данных нельзя перевести на буквенно-цифровой или буквенно-цифровой отредактированный элемент данных.

...