cos'è & # 8220; copia corrispondente & # 8221; in cobol, e come funziona?

StackOverflow https://stackoverflow.com/questions/1440120

  •  10-07-2019
  •  | 
  •  

Domanda

Nella rara occasione in cui le persone dicono cose carine su cobol, loro spesso menziona " copia corrispondente " (e "sposta corrispondente") .

Mi piacerebbe davvero saperne di più su questi: quali sono le loro semantiche? È lo stesso di:

(Perl)

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

O c'è qualcosa di più profondo di quello? I record Cobol sono fortemente tipizzati, giusto? Come funziona?

È stato utile?

Soluzione

Secondo i documenti AcuCOBOL (che io uso):

  

Quando viene utilizzata la frase CORRISPONDENTE,   elementi elementari selezionati in   il gruppo di origine viene spostato in   articoli corrispondenti nel gruppo dest.   Questo viene trattato come una serie di formati   1 istruzioni MOVE, una per ciascuna   coppia corrispondente di elementi di dati.

Una mossa di Formato 1 è simile alla seguente:

  

SPOSTA oggetto-sorgente SU {oggetto-dest}

Dato il seguente file e la definizione di memoria funzionante

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.

In questo modo:

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

equivale a fare questo:

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.

Che ha salvato 3 righe di codice. Molti file sono più ampi di così.

EDIT: Anche questo proviene dalla stessa serie di documenti ...

  

La tabella seguente descrive il   combinazioni di sorgente-oggetto e   dest-item che sono consentiti dal MOVE   dichiarazione. I numeri nella tabella   sono le "Regole generali" numeri in   questa sezione in cui si trova ogni combinazione   descritti:

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. Quando dest-item è alfabetico, si verificano giustificazione e riempimento dello spazio   secondo l'allineamento standard   regole.

     

'13. Quando dest-item è alfanumerico o alfanumerico modificato, giustificazione e   il riempimento dello spazio avviene secondo la norma   regole di allineamento standard. Se   l'elemento di origine ha un segno numerico, il   il segno operativo non viene spostato. Se la   il segno occupa un carattere separato   posizione, quel segno non lo è   spostato e la dimensione dell'elemento di origine è   trattato come uno in meno.

     

'14. Quando l'elemento dest è modificato in modo numerico o numerico, punto decimale   si verificano allineamento e riempimento zero   secondo l'allineamento standard   regole. Se l'elemento di origine non è firmato, esso   è trattato come positivo. Se   dest-item non è firmato, l'assoluto   il valore dell'elemento di origine viene spostato. Se   dest-item è firmato, il suo segno è impostato   al segno dell'oggetto sorgente. Se   l'elemento di origine è modificato numericamente, lo è   & Quot; de-modifica " prima tale oggetto dest   riceve lo stesso valore numerico.

     

'15. Le seguenti mosse sono illegali: una modifica alfabetica o alfanumerica   l'elemento dati non può essere spostato in a   elemento dati numerico o numerico modificato.     Un elemento dati modificato numerico o numerico   non può essere spostato in ordine alfabetico   articolo. Un elemento dati numerico non intero   non può essere spostato in un alfanumerico o   elemento dati alfanumerico modificato.

Altri suggerimenti

In realtà, i nomi degli elementi devono essere esattamente gli stessi perché "MOVE CORRESPONDING" funzioni. Il computer su cui lavoro utilizza la scorciatoia di "MOVE CORR". In realtà ho visto "ADD CORR" mentre cercavo degli esempi.

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.

Possono esserci più di una variabile con lo stesso nome perché sono qualificate dal livello '01'. Per fare riferimento a uno dei due campi, si deve dire PI-HOLD-PROD OF HOLD-FIELDS-DEST.

Per spostare tutti i valori, si usa

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

Questo è molto utile quando si spostano i campi in un nuovo record o variabile.

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top