Sábado, Agosto 24, 2019

A instrução WRITE libera um registro lógico para um arquivo de saída ou de entrada / saída.

Quando a instrução WRITE é executada:

  • O arquivo sequencial associado deve estar aberto no modo OUTPUT ou EXTEND.
  • O arquivo indexado ou relativo associado deve estar aberto no modo OUTPUT, IO ou EXTEND.

 

Formato 1: Declaração de gravação para arquivos sequenciais 

>>-WRITE--record-name-1--+--------------------+----------------->
                         '-FROM--identifier-1-'   

>--+-+------------------------------------------------------------+--| phrase 1 |-+-->
   | '-+-BEFORE-+--+-----------+--+-+-identifier-2-+--+-------+-+-'               |   
   |   '-AFTER--'  '-ADVANCING-'  | '-integer-1----'  +-LINE--+ |                 |   
   |                              |                   '-LINES-' |                 |   
   |                              +-mnemonic-name-1-------------+                 |   
   |                              '-PAGE------------------------'                 |   
   '-| invalid_key |--| not_invalid_key |-----------------------------------------'   

>--+-----------+-----------------------------------------------><
   '-END-WRITE-'   

phrase 1

|--+-------------------------------------------------+---------->
   '-+----+--+-END-OF-PAGE-+--imperative-statement-3-'   
     '-AT-'  '-EOP---------'                             

>--+------------------------------------------------------+-----|
   '-NOT--+----+--+-END-OF-PAGE-+--imperative-statement-4-'   
          '-AT-'  '-EOP---------'                             

invalid_key

|--+------------------------------------------+-----------------|
   '-INVALID--+-----+--imperative-statement-1-'   
              '-KEY-'                             

not_invalid_key

|--+----------------------------------------------+-------------|
   '-NOT INVALID--+-----+--imperative-statement-2-'   
                  '-KEY-'                             

 

Formato 2: Declaração de gravação para arquivos indexados e relativos

>>-WRITE--record-name-1--+--------------------+----------------->
                         '-FROM--identifier-1-'   

>--+------------------------------------------+----------------->
   '-INVALID--+-----+--imperative-statement-1-'   
              '-KEY-'                             

>--+----------------------------------------------+------------->
   '-NOT INVALID--+-----+--imperative-statement-2-'   
                  '-KEY-'                             

>--+-----------+-----------------------------------------------><
   '-END-WRITE-'   

 

Formato 3: Declaração de gravação para arquivos de linha sequencial

>>-WRITE--record-name-1--+--------------------+----------------->
                         '-FROM--identifier-1-'   

>----+-----------------------------------------------------------+---->
     '---AFTER----+-----------+--+-+-identifier-2-+--+-------+-+-'     
                  '-ADVANCING-'  | '-integer-1----'  +-LINE--+ |       
                                 |                   '-LINES-' |       
                                 '-PAGE------------------------'       

>--+-----------+-----------------------------------------------><
   '-END-WRITE-'   

 

record-name-1

Deve ser definido em uma entrada DATA DIVISION FD. record-name-1 pode ser qualificado. Não deve ser associado a um ficheiro de ordenação ou de intercalação.

Para arquivos relativos, o número de posições de caracteres no registro que está sendo gravado pode ser diferente do número de posições de caracteres no registro que está sendo substituído.

 

FROM

O resultado da execução da instrução WRITE com a FROM identifier-1 é equivalente à execução das seguintes declarações na ordem especificada:

MOVE identifier-1 TO record-name-1.
WRITE record-name-1. 

O MOVE é executado de acordo com as regras de uma instrução MOVE sem CORRESPONDING.

 

identifier-1

identifier-1 pode fazer referência a qualquer um dos seguintes itens:

  • Um item de dados definido na WORKING-STORAGE SECTION, na LOCAL-STORAGE SECTION ou na LINKAGE SECTION.
  • Uma descrição de registro para outro arquivo anteriormente aberto
  • Uma função alfanumérica
  • Uma função nacional

identifier-1 deve ser um item de envio válido para uma declaração MOVE com record-name-1 como o item de recepção.

identifier-1 e record-name-1 não deve se referir à mesma área de armazenamento.

Após a declaração WRITE é executada, a informação ainda está disponível no identifier-1.

 

identifier-2

Deve ser um item de dados inteiros.

 

ADVANCING

A frase ADVANCING controla o posicionamento do registro de saída na página.

As frases BEFORE e AFTER não são suportadas para arquivos VSAM. QSAM arquivos são organizados em seqüência. As frases ADVANCING e END-OF-PAGE controlam o posicionamento vertical de cada linha em uma página impressa.

Você pode especificar as frases ADVANCING PAGE e END-OF-PAGE em uma única instrução WRITE.

Se a página impressa é mantida em um dispositivo intermediário (um disco, por exemplo), o formato pode aparecer diferente do formato esperado quando a saída é editada ou pesquisada.

 

ADVANCING regras

  • Quando a frase ADVANCING é especificada, aplicam-se as seguintes regras:
  • Quando BEFORE ADVANCING for especificado, a linha será impressa antes que a página seja avançada.
  • Quando AFTER ADVANCING é especificado, a página é avançada antes da linha ser impressa.
  • Quando identifier-2 é especificado, a página é avançada o número de linhas igual ao valor atual no identifier-2identifier-2 deve nomear um item de dados inteiro elementar.
  • Quando inteiro é especificado, a página é avançada o número de linhas igual ao valor de inteiro.
  • Integer ou o valor no identifier-2 pode ser zero.
  • Quando PAGE é especificado, o registro é impresso na página lógica BEFORE ou AFTER (dependendo da frase usada) o dispositivo está posicionado na próxima página lógica. Se PAGE não tiver significado para o dispositivo utilizado, então BEFORE ou AFTER (dependendo da frase especificada) ADVANCING 1 LINE é fornecido.

Se a entrada FD contiver uma cláusula LINAGE, o reposicionamento é para a primeira linha imprimível da próxima página, conforme especificado nessa cláusula. Se a cláusula LINAGE for omitida, o reposicionamento é para a linha 1 da página seguinte.

  • Quando mnemonic-name for especificado, um salto de canais de 1 a 12, ou supressão de espaço, tem lugar. mnemonica-name deve ser equiparado ao environment-name-1 no parágrafo SPECIAL-NAMES.

O mnemônico-name frase também pode ser especificado para a seleção empilhador com um arquivo de cartões perfurados. Ao usar a seleção do empilhador, deve ser usado WRITE AFTER ADVANCING.

 

A frase ADVANCING da instrução WRITE ou a presença de uma cláusula LINAGE no arquivo faz com que um caractere de controle de transporte seja gerado no registro que é gravado. Se o arquivo correspondente é descrito com a cláusula EXTERNAL, todos os conectores de arquivo dentro da unidade de execução devem ser definidos de forma que os caracteres de controle de transporte sejam gerados para registros que são escritos. Ou seja, se todos os arquivos tiverem uma cláusula LINAGE, alguns dos programas podem usar a instrução WRITE com a frase ADVANCING e outros programas podem usar a instrução WRITE sem a frase ADVANCING. No entanto, se nenhum dos arquivos tiver uma cláusula LINAGE e, em seguida, se qualquer um dos programas usar a instrução WRITE com a frase ADVANCING, todos os programas na unidade de execução que têm uma instrução WRITE devem usar a instrução WRITE com a ADVANCING.

Quando ADVANCING é omitida, o avanço automático da linha é fornecido, como se após ADVANCING 1 LINE tivesse sido especificado.

 

Regras do LINAGE-COUNTER

Se a cláusula LINAGE for especificada para este arquivo, o registro especial LINAGE-COUNTER associado é modificado durante a execução da instrução WRITE, de acordo com as regras a seguir:

  • Se ADVANCING PAGE for especificado, LINAGE-COUNTER é reposto a 1.
  • Se AVANÇO identificador-2 ou inteiro é especificado, Linage-contador é aumentado pelo valor do identificador-2 ou inteiro .
  • Se a frase ADVANCING for omitida, LINAGE-COUNTER é aumentado em 1.
  • Quando o dispositivo é reposicionado para a primeira linha disponível de uma nova página, LINAGE-COUNTER é reposto a 1.

Nota: Se você usar a opção de compilador ADV, o compilador adiciona 1 byte para o comprimento de registro, a fim de permitir o caractere de controle. Se em sua definição de registro você já reserva o primeiro byte para o caractere de controle, você deve usar a opção NOADV. Para arquivos definidos com a cláusula LINAGE, a opção NOADV não tem efeito. O compilador processa esses arquivos como se a opção ADV fosse especificada.

 

END-OF-PAGE

A frase AT END-OF-PAGE não é suportada para arquivos VSAM.

Quando END-OF-PAGE é especificado e o final lógico da página impressa é atingido durante a execução da instrução WRITE, a instrução imperativa END-OF-PAGE é executada. Quando a frase END-OF-PAGE é especificada, a entrada FD para este arquivo deve conter uma cláusula LINAGE.

A extremidade lógica da página impressa é especificada na cláusula LINAGE associada.

Uma condição END-OF-PAGE é atingida quando a execução de uma declaração WRITE END-OF-PAGE causa impressão ou espaçamento dentro da área de base de um corpo de página. Isso ocorre quando a execução de uma instrução WRITE faz com que o valor no registrador especial LINAGE-COUNTER igualar ou exceder o valor especificado na frase WITH FOOTING da cláusula LINAGE. A instrução WRITE é executada e, em seguida, a instrução imperativa END-OF-PAGE é executada.

Uma condição de estouro automático de página é atingida sempre que a execução de qualquer instrução WRITE (com ou sem a frase END-OF-PAGE) não pode ser completamente executada dentro do corpo da página atual. Isso ocorre quando uma instrução WRITE, se executada, faria com que o valor no LINAGE-COUNTER exceder o número de linhas para o corpo da página especificado na cláusula LINAGE. Nesse caso, a linha é impressa ANTES ou AFTER (dependendo da opção especificada) o dispositivo é reposicionado para a primeira linha imprimível na próxima página lógica, conforme especificado na cláusula LINAGE. Se a frase END-OF-PAGE for especificada, a instrução imperativa END-OF-PAGE será então executada.

Se a frase WITH FOOTING da cláusula LINAGE não for especificada, a condição de estouro automático de página existe porque nenhuma condição de fim de página (como distinta da condição de estouro de página) pode ser detectada.

Se a frase WITH FOOTING for especificada, mas a execução de uma determinada instrução WRITE faria com que o CONTADOR-LINE exceder tanto o valor de base como o valor de corpo de página especificado na cláusula LINAGE, então tanto a condição de fim de página como a Ocorrem simultaneamente.

As palavras-chave END-OF-PAGE e EOP são equivalentes.

Você pode especificar a frase ADVANCING PAGE e a frase END-OF-PAGE em uma única instrução WRITE.

 

INVALID KEY

A frase INVALID KEY não é suportada para arquivos seqüenciais VSAM.

Uma condição de chave inválida é causada pelos seguintes casos:

  • Para arquivos seqüenciais, é feita uma tentativa de escrever além do limite definido externamente do arquivo.
  • Para arquivos indexados:
    • Uma tentativa é feita para escrever além do limite definido externamente do arquivo.
    • ACCESS SEQUENTIAL é especificado e o arquivo é aberto OUTPUT, e o valor da chave de registro principal não é maior que o do registro anterior.
    • O arquivo é aberto OUTPUT ou IO e o valor da chave primária é igual ao de um registro já existente.
  • Para arquivos relativos:
    • Uma tentativa é feita para escrever além do limite definido externamente do arquivo.
    • Quando o modo de acesso é aleatório ou dinâmico e o item de dados RELATIVE KEY especifica um registro que já existe no arquivo.
    • O número de dígitos significativos no número de registro relativo é maior que o tamanho do item de dados de chave relativo para o arquivo.

Quando ocorre uma condição de chave inválida:

  • Se a frase-chave inválido for especificado, imperative-statement-1 é executado. Para mais detalhes sobre o processamento chave inválida.
  • Caso contrário, a declaração escrita é malsucedido e o conteúdo do registro de nomes são afetados (exceto para QSAM arquivos) e o caso seguinte ocorre:
    • Para arquivos sequenciais, a chave de status do arquivo, se especificada, é atualizada e existe uma condição EXCEPTION / ERROR.

Se um procedimento EXCEPTION / ERROR explícito ou implícito for especificado para o arquivo, o procedimento será executado. Se nenhum procedimento for especificado, os resultados são imprevisíveis.

    • Para arquivos relativos e indexados, a execução do programa prossegue de acordo com as regras descritas pela condição de chave inválido em "instalações de processamento comuns".

As condições INVALID KEY que se aplicam a um arquivo relativo no modo OUTPUT ABERTO também se aplicam a uma no modo OPEN EXTEND.

  • Se a frase-chave não inválido for especificado e uma condição chave válida existe no final da execução da instrução WRITE, o controle é passado para imperative-statement-4.

Tanto a frase INVALID KEY como um procedimento EXCEPTION / ERROR aplicável podem ser omitidos.

 

END-WRITE

Este terminador de escopo explícito serve para delimitar o escopo da instrução WRITE. END-WRITE permite que uma instrução WRITE condicional seja aninhada em outra instrução condicional. END-WRITE também pode ser usado com uma instrução WRITE imperativa.

 

A instrução UNSTRING faz com que os dados contíguos em um campo de envio sejam separados e colocados em vários campos de recebimento.

>>-UNSTRING--identifier-1--------------------------------------->

>--+-------------------------------------------------------------------------------------+-->
   '-DELIMITED--+----+--+-----+--+-identifier-2-+--+-----------------------------------+-'   
                '-BY-'  '-ALL-'  '-literal-1----'  | .-------------------------------. |     
                                                   | V                               | |     
                                                   '---OR--+-----+--+-identifier-3-+-+-'     
                                                           '-ALL-'  '-literal-2----'         

>--INTO--------------------------------------------------------->

   .------------------------------------------------------------------------------------.   
   V                                                                                    |   
>----identifier-4--+---------------------------------+--+-----------------------------+-+-->
                   '-DELIMITER--+----+--identifier-5-'  '-COUNT--+----+--identifier-6-'     
                                '-IN-'                           '-IN-'                     

>--+---------------------------------+-------------------------->
   '-+------+--POINTER--identifier-7-'   
     '-WITH-'                            

>--+--------------------------------+--------------------------->
   '-TALLYING--+----+--identifier-8-'   
               '-IN-'                   

>--+------------------------------------------+----------------->
   '-+----+--OVERFLOW--imperative-statement-1-'   
     '-ON-'                                       

>--+-----------------------------------------------+------------>
   '-NOT--+----+--OVERFLOW--imperative-statement-2-'   
          '-ON-'                                       

>--+--------------+--------------------------------------------><
   '-END-UNSTRING-'   

 

identifier-1

Representa o campo de envio. Os dados são transferidos a partir deste campo com os campos de recepção de dados (identifier-4).

identifier-1 deve fazer referência a um item de dados de categoria alfabética, alfanumérico, alfanumérico-editado, DBCS, nacional ou nacional-editado.

 

identifier-2, literal-1, identifier-3, literal-2

Especifica um ou mais delimitadores.

identifier-2 e identifier-3 deve fazer referência a itens de dados da categoria alfabética, alfanumérico, alfanumérico-editado, DBCS, nacional ou nacional-editado.

literal-1 ou literal-2 deve ser de categoria alfanumérico, DBCS, ou nacional e não deve ser uma constante figurativa que começa com a palavra ALL.

 

identifier-4

Especifica um ou mais campos de recepção.

identifier-4 deve fazer referência a um item de dados de categoria alfabética, alfanumérico, numérico, DBCS ou nacional. Se o item de dados referenciado for de categoria numérica, sua cadeia de caracteres de imagem não deve conter o símbolo de imagem P e seu uso deve ser DISPLAY ou NACIONAL.

 

identifier-5

Especifica um campo para receber o delimitador associado com identifier-4.

identifier-5 deve fazer referência a um item de dados de categoria alfabética, alfanumérica, DBCS ou nacional.

 

identifier-6

Especifica um campo para manter a contagem de caracteres que são transferidos para identifier-4.

identifier-6 deve ser um item de dados inteiros definido sem o símbolo P em seu quadro caractere-string.

 

identifier-7

Especifica um campo para manter uma posição de caractere relativa durante o processamento UNSTRING.

identifier-7 deve ser um item de dados inteiros definido sem o símbolo P na cadeia de imagem.

identifier-7 deve ser descrito como um item de dados de tamanho suficiente para conter um valor igual a 1, mais o número de posições de caracteres no item de dados referenciado pelo identifier-1.

 

Identifier-8

Especifica um campo que é incrementado pelo número de campos delimitados processados.

identifier-8 deve ser um item de dados inteiros definido sem o símbolo P em seu quadro character-string.

 

Aplicam-se as seguintes regras:

  • Se identifier-4 faz referência a um item de dados de uso de DISPLAY, identifier-1identifier-2identifier-3, e identifier-5 também deve fazer referência a itens de dados de uso visor e todos os literais devem ser literais alfanuméricos. Qualquer constante figurativa pode ser especificada, exceto NULL ou uma que começa com a palavra ALL. Cada constante figurativa representa um literal alfanumérico de 1-caractere.
  • Se identifier-4 faz referência a um item de dados de uso de DISPLAY-1, identifier-1identifier-2identifier-3, e identifier-5 também deve fazer referência a itens de dados de uso DISPLAY-1 e todas as literais devem ser literais DBCS. SPACE constante figurativo é a única constante figurativa que pode ser especificada. Cada constante figurativa representa um literal DBCS de 1 caractere.
  • Se identifier-4 faz referência a um item de dados de uso NACIONAL, identifier-1, identifier-2identifier-3, e identifier-5 também deve fazer referência a itens de dados de uso nacional e todos os literais devem ser literais nacionais. Qualquer constante figurativa pode ser especificada, exceto NULL ou uma que começa com a palavra ALL. Cada constante figurativa representa um literal nacional de 1-caractere.

Contagem de campos (identifier-6) e campos de ponteiro (identifier-7) são incrementados em número de posições de caracteres (alfanumérico, DBCS ou nacional), e não pelo número de bytes.

Uma instrução UNSTRING pode substituir uma série de instruções MOVE, exceto que a avaliação ou o cálculo de determinados elementos é executado apenas uma vez, no início da execução da instrução UNSTRING.

As regras para MOVE são os mesmos que para uma declaração jogada para um item enviando elementar da categoria de identifier-1, com o apropriado identifier-4 como o item de recepção. Por exemplo, as regras para mover um item de DBCS são utilizados quando identificador-1 é um item DBCS.

 

DELIMITED BY

Esta frase especifica delimitadores dentro dos dados que controlam a transferência de dados.

Cada identifier-2identifier-3, literal-1 ou literal-2 representa um delimitador.

Se DELIMITED BY não especificado, o DELIMITED IN e COUNT IN devem não ser especificado.

 

ALL

Múltiplas ocorrências contíguas de quaisquer delimitadores são tratadas como se houvesse apenas uma ocorrência; esta uma ocorrência é movido para o delimitador de campo de recepção (identifier-5), se for especificado. Os caracteres que delimitam no campo de envio são tratados como um item elementar do mesmo uso e a categoria como identifier-1 e são movidos no campo delimitador de recebimento atual de acordo com as regras da declaração MOVE.

Quando DELIMITED BY ALL não especificado, e duas ou mais ocorrências contíguas de qualquer delimitador são encontrados, os dados atuais campo recebendo (identifier-4) é preenchido com zeros ou espaços, de acordo com a descrição dos dados de campo de recepção.

 

Delimitador com dois ou mais caracteres

Um delimitador que contém dois ou mais caracteres é reconhecido como um delimitador somente se os caracteres de delimitação estiverem em ambos os casos a seguir:

  • Contíguo
  • Na seqüência especificada no campo de envio

 

Dois ou mais delimitadores

Quando dois ou mais delimitadores são especificados, uma condição OR existe e cada ocorrência não-sobreposta de qualquer um dos delimitadores é reconhecida no campo de envio na seqüência especificada.

Por exemplo:

DELIMITED BY "AB" or "BC"

Uma ocorrência de AB ou BC no campo de envio é considerado um delimitador. Uma ocorrência de ABC é considerada uma ocorrência de AB.

 

INTO

Esta frase especifica os campos onde os dados devem ser movidos.

identifier-4 representa os dados recebendo campos.

 

DELIMITER IN

Esta frase especifica os campos onde os delimitadores devem ser movidos.

identifier-5 representa os campos delimitador de recepção.

O DELIMITER deve não ser especificado se DELIMITED BY não especificado.

 

COUNT IN

Esta frase especifica o campo onde a contagem de posições de caracteres examinadas é mantida.

identifier-6 é o campo de contagem de dados para cada transferência de dados. Cada campo contém a contagem de posições de caracteres examinadas no campo de envio, terminadas pelos delimitadores ou no fim do campo de envio, para a mudança para este campo de recebimento. Os delimitadores não estão incluídos nesta contagem.

O COUNT IN frase deve não ser especificado se DELIMITED BY não especificado.

 

POINTER

Quando POINTER é especificado, o valor do campo indicador, identifier-7, comporta-se como se fosse aumentado por um para cada posição de carácter examinados no campo de envio. Quando a execução da instrução UNSTRING é concluída, o campo de ponteiro contém um valor igual ao seu valor inicial mais o número de posições de caracteres examinadas no campo de envio.

Quando essa frase é especificada, o usuário deve inicializar o campo de ponteiro antes da execução da instrução UNSTRING começar.

 

TALLYING IN

Quando TALLYING IN for especificado, o campo de contagem de área, identifier-8, contém (no final da execução da instrução UNSTRING) um valor igual ao valor inicial mais o número de recepção de dados áreas postas em prática.

Quando essa frase é especificada, o usuário deve inicializar o campo de contagem de área antes da execução da instrução UNSTRING começar.

 

ON OVERFLOW

Uma condição de estouro ocorre quando:

  • O valor do ponteiro (explícito ou implícito) é menor que 1.
  • O valor do ponteiro (explícito ou implícito) excede um valor igual ao comprimento do campo de envio.
  • Todos os campos de recepção de dados foram agidos e o campo de envio ainda contém posições de caracteres não examinadas.

Quando ocorre uma condição de estouro

Uma condição de estouro causa as seguintes ações:

  1. Não mais dados são transferidos.
  2. A operação UNSTRING é encerrada.
  3. A frase NOT ON OVERFLOW, se especificada, é ignorada.
  4. O controlo é transferido para o fim da instrução UNSTRING ou, se ON OVERFLOW está especificado, para imperative-statement-1.

 

imperative-statement-1

Declaração ou declarações para lidar com uma condição de estouro.

Se o controle é transferido para imperative-statement-1, a execução continua de acordo com as regras de cada instrução especificada no imperative-statement-1. Se um procedimento ramificação ou declaração condicional que faz com que a transferência explícita de controle é executado, controle é transferido de acordo com as regras para essa declaração. Caso contrário, depois de concluída a execução dos imperative-statement-1, o controlo é transferido para o fim da instrução UNSTRING.

 

Quando uma condição de estouro não ocorre

Quando, durante a execução de uma instrução UNSTRING, as condições que causam uma condição de estouro não são encontradas, então:

  1. A transferência de dados está concluída.
  2. A frase ON OVERFLOW, se especificada, é ignorada.
  3. O controlo é transferido para o fim da instrução desencordoar ou, se NOT ON OVERFLOW for especificado, a imperative-statement-2.

 

imperative-statement-2

Declaração ou instruções para lidar com uma condição de estouro que não ocorre.

Se o controle é transferido para imperative-statement-2, a execução continua de acordo com as regras de cada instrução especificada no imperative-statement-2. Se um procedimento ramificação ou declaração condicional que faz com que a transferência explícita de controle é executado, controle é transferido de acordo com as regras para essa declaração. Caso contrário, depois de concluída a execução dos imperative-statement-2, o controlo é transferido para o fim da instrução UNSTRING.

 

END-UNSTRING

Este terminador de escopo explícito serve para delimitar o escopo da instrução UNSTRING. END-UNSTRING permite que uma instrução condicional UNSTRING seja aninhada em outra instrução condicional. END-UNSTRING também pode ser usado com uma instrução UNSTRING imperativa.

 

CORRESPONDING (CORR) faz com que as operações ADD, SUBTRACT e MOVE sejam executadas em itens de dados elementares do mesmo nome se o item de grupo alfanumérico ou o item de grupo nacional ao qual eles pertencem for especificado. Um grupo nacional é processado como um item de grupo quando a frase CORRESPONDING é usada.

Ambos os identificadores que seguem a palavra-chave CORRESPONDING devem nomear os itens de grupo. Nesta discussão, estes identificadores são referidos como identifier-1 e identifier-2. identifier-1 faz referência ao item do grupo de envio. identifier-2 faz referência ao item do grupo de recepção.

Dois itens de dados subordinados, um de identifier-1 e um do identifier-2, correspondem se as seguintes condições forem verdadeiras:

  • Em uma declaração ADD ou SUBTRACT, ambos os itens de dados são elementar itens de dados numéricos. Outros itens de dados são ignorados.
  • Em uma instrução MOVE, pelo menos um dos itens de dados é um item elementar, e o movimento é permitido pelas regras de movimento.
  • Os dois itens subordinados têm o mesmo nome e as mesmas eliminatórias até, mas não incluindo identifier-1 e identifier-2.
  • Os itens subordinados não são identificados pela palavra-chave FILLER.
  • Nem identifier-1 nem o identifier-2 é descrita como um nível 66, 77, 88 ou item, e também não é descrito como um elemento de dados de índice. Nem identifier-1 nem identifier-2 pode ser modificado por referência.
  • Nem identifier-1 nem identifier-2 é descrito com USAGE POINTER, USAGE FUNCTION-POINTER, USAGE PROCEDURE-POINTER, ou USAGE OBJECT REFERENCE.
  • Os itens subordinados não incluem um REDEFINES, RENAMES, OCCURS, USAGE INDEX, USAGE POINTER, USAGE PROCEDURE-POINTER, USAGE FUNCTION-POINTER, ou USAGE OBJECT REFERENCE nas suas descrições.

No entanto, identifier-1 identifier-2 em si podem conter ou estar subordinada a itens que contêm uma REDEFINES ou OCCURS cláusula em suas descrições.

  • O nome de cada item de dados subordinado que satisfaz essas condições é único após a aplicação de qualificadores implícitos.

 

identifier-1identifier-2, ou ambos pode ser subordinado a um item de enchimento.

Por exemplo, considere duas hierarquias de dados definidas da seguinte forma:

05 ITEM-1 OCCURS 6.
   10  ITEM-A PIC S9(3).
   10  ITEM-B PIC +99.9.
   10  ITEM-C PIC X(4).
   10  ITEM-D REDEFINES ITEM-C PIC 9(4).
   10  ITEM-E USAGE COMP-1.
   10  ITEM-F USAGE INDEX.
05 ITEM-2.
   10  ITEM-A PIC 99.
   10  ITEM-B PIC +9V9.
   10  ITEM-C PIC A(4).
   10  ITEM-D PIC 9(4).
   10  ITEM-E PIC 9(9) USAGE COMP.
   10  ITEM-F USAGE INDEX.

Se ADD CORR ITEM-2 TO ITEM-1(x) for especificado, ITEM-A e ITEM-A (x), ITEM-B e (x) ITEM-B, e ITEM-E e ITEM-E (x) são consideradas correspondentes e são somadas. ITEM-C e ITEM-C (x) não estão incluídos porque eles não são numéricos. ITEM-D e ITEM-D (x) não estão incluídos porque ITEM-D (x) inclui uma cláusula redefine em sua descrição de dados. ITEM-F e ITEM-F (x) não estão incluídos porque eles são itens de dados de índice. Note-se que ITEM-1 é válido tanto como identificador-1 ou identificador-2 .

Se qualquer uma das operações individuais na ADD CORRESPONDENTE declaração produz uma condição de erro de tamanho, imperative-statement-1 na ON SIZE ERROR não é executada até que todas as adições individuais estão concluídas.

 

Uma condição de erro de tamanho pode ocorrer de quatro maneiras diferentes:

  • Quando o valor absoluto do resultado de uma avaliação aritmética, após o alinhamento do ponto decimal, excede o maior valor que pode ser contido no campo de resultado.
  • Quando a divisão por zero ocorre.
  • Quando o resultado de uma instrução aritmética é armazenado em um campo de data com janelas eo ano do resultado fica fora da janela do século. Por exemplo, dado YEARWINDOW (1940) (que especifica uma janela de século de 1940-2039), a seguinte instrução SUBTRACT causa um erro de tamanho:
01  WINDOWED-YEAR  DATE FORMAT YY PICTURE 99
                   VALUE IS 50.
    ...
    SUBTRACT 20 FROM WINDOWED-YEAR
             ON SIZE ERROR imperative-statement

O erro de tamanho ocorre porque o resultado da subtração, um campo de data com janelas, tem um valor de ano efetivo de 1930, que cai fora da janela do século. Para detalhes sobre como os campos de data janelas são tratados como se fossem convertidas para formato de data expandida.

Para mais informações sobre como erros de tamanho pode ocorrer quando se utiliza campos de data.

  • Em uma expressão exponencial, conforme indicado na tabela a seguir:

 

A condição de erro de tamanho aplica-se apenas aos resultados finais, não a quaisquer resultados intermediários.

Se o identificador resultante for definido com USAGE IS BINARY, COMPUTATIONAL, COMPUTATIONAL-4 ou COMPUTATIONAL-5, o maior valor que pode conter é o valor máximo implícito pela sua decimal associada PICTURE caracteres, independentemente do compilador TRUNC Opção em vigor.

Se a frase REDONDADA for especificada, arredondamento ocorre antes da verificação de erro de tamanho.

Quando ocorre um erro de tamanho, a ação subseqüente do programa depende se a frase ON SIZE ERROR é especificada.

Se a frase ON SIZE ERROR não for especificada e ocorrer uma condição de erro de tamanho, as regras de truncamento serão aplicadas eo valor do identificador resultante resultante será computado.

Se a frase ON SIZE ERROR for especificada e ocorrer uma condição de erro de tamanho, o valor do identificador resultante afetado pelo erro de tamanho não será alterado; Ou seja, os resultados de erro não são colocados no identificador de recepção. Após a conclusão da execução da operação aritmética, a instrução imperativa na frase ON SIZE ERROR é executada, o controle é transferido para o final da instrução aritmética e a frase NOT ON SIZE ERROR, se especificada, é ignorada.

Para as instruções CORRESPONDING ADD e CORRESPONDING SUBTRACT, se uma operação aritmética individual causa uma condição de erro de tamanho, a declaração imperativa ON SIZE ERROR não é executada até que todas as adições ou subtrações individuais tenham sido concluídas.

Se a frase NOT ON SIZE ERROR tiver sido especificada e, após a execução de uma operação aritmética, uma condição de erro de tamanho não existir, a frase NOT ON SIZE ERROR será executada.

Quando as frases ON SIZE ERROR e NOT ON SIZE ERROR são especificadas e a declaração na frase que é executada não contém qualquer transferência explícita de controle, então, se necessário, uma transferência implícita de controle é feita após a execução da frase para o Fim da declaração aritmética.

A Historia do cobol

A Historia do cobol

COBOL significa Common Business Oriented Language, isto é, Linguagem Comum Orientada para o Comércio. O Cobol é um subconjunto de palavras da língua inglesa, ou seja, um número limitado de palavras inglesas sujeita a uma sintaxe própria. É uma linguagem que lida com problemas comerciais, envolvendo arquivos de dados de apreciáveis proporções (Seqüências/Vsam/Banco de dados DB2).   História: Criado por um comitê de investigadores de várias instituições civis e governamentais durante o segundo semestre de 1959. As especificações eram em grande parte inspiradas na linguagem de programação FLOW-MATIC inventada pela Grace Hopper - referida como "a mãe da língua COBOL." Em 8 de abril de...

Vagas

Em breve estaremos divulgando vagas de COBOL/CICS/DB2

Camisetas

IDENTIFICATION DIVISION

IDENTIFICATION DIVISION: Possui informações documentais, como nome do programa, quem o codificou e quando essa codificação foi realizada.    PROGRAM-ID nome do programa. (Obrigatório) AUTHOR nome do desenvolvedor. (Obrigatório) INSTALLATION nome da empresa ou local de geração do...

ENVIRONMENT DIVISION

ENVIRONMENT DIVISION: é a segunda divisão de um programa COBOL. Descreve o computador e os periféricos que serão utilizados pelo programa, fazendo ligação com o ambiente operacional onde o programa...

DATA DIVISION

DATA DIVISION: É a terceira divisão de um programa COBOL, descreve os arquivos de entrada e saída que serão usadas pelo programa. Também define as áreas de trabalho e constantes...

PROCEDURE DIVISION

PROCEDURE DIVISION: Contém o código que irá manipular os dados descritos na DATA DIVISION. É nesta divisão que o desenvolvedor descreverá a lógica do programa. Consiste em instruções executáveis ​​usando...

Comandos