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-2. identifier-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.