A instrução WRITE
em COBOL grava um registro lógico em um arquivo de saída. Essa ação pode ser feita diretamente ou com controle de posicionamento na página, manipulação de overflow e verificação de chaves em arquivos indexados ou relativos.
📌 Para que serve
-
Gravar registros em arquivos sequenciais, relativos ou indexados.
-
Controlar o posicionamento vertical da saída (ex: impressão em páginas).
-
Verificar se o registro já existe (em arquivos indexados e relativos).
-
Detectar e tratar eventos como fim de página ou chave inválida.
🧾 Sintaxe básica
WRITE nome-do-registro
[FROM identificador-fonte]
[BEFORE | AFTER ADVANCING <n> LINES | LINE | PAGE]
[END-OF-PAGE declaracao]
[INVALID KEY declaracao]
[NOT INVALID KEY declaracao]
END-WRITE.
✅ Exemplo prático
01 SAIDA-RELATORIO.
05 LINHA PIC X(80).
WRITE LINHA
AFTER ADVANCING 1 LINE
END-WRITE.
WRITE REGISTRO-INDEXADO
INVALID KEY DISPLAY "Erro: Registro já existe."
NOT INVALID KEY DISPLAY "Registro gravado com sucesso."
END-WRITE.
⚙️ Como funciona
-
O
WRITE
envia os dados para um arquivo já aberto no modo apropriado (OUTPUT
,EXTEND
,I-O
). -
Com
FROM
, o conteúdo de um identificador-fonte é movido para o registro antes da gravação. -
O comando pode incluir controle de página com
ADVANCING
, útil em relatórios. -
Pode tratar eventos de fim de página com
END-OF-PAGE
. -
Em arquivos indexados ou relativos, pode tratar erros com
INVALID KEY
.
🔁 Formatos disponíveis
🔹 Formato 1 — Arquivos sequenciais
WRITE registro
[FROM origem]
[AFTER ADVANCING 1 LINE]
[END-OF-PAGE ...]
END-WRITE.
🔹 Formato 2 — Arquivos indexados/relativos
WRITE registro
[FROM origem]
[INVALID KEY ...]
[NOT INVALID KEY ...]
END-WRITE.
🔹 Formato 3 — Arquivos linha a linha
WRITE registro
AFTER ADVANCING PAGE
END-WRITE.
🧠 Dicas práticas
-
Relatórios: use
ADVANCING PAGE
para pular páginas. -
Arquivos indexados: sempre trate
INVALID KEY
para evitar registros duplicados. -
Arquivos relativos: o campo
RELATIVE KEY
deve estar corretamente posicionado antes doWRITE
. -
Se o campo de destino for um
FD
, userecord-name
— se forSD
, oSORT
lida com a gravação automaticamente. -
Use
END-WRITE
sempre que quiser escopo claro (ex: em IF...WRITE...END-WRITE).
⚠️ Regras importantes
-
O arquivo deve estar aberto no modo correto:
OUTPUT
,EXTEND
ouI-O
. -
record-name-1
deve estar definido na DATA DIVISION, dentro de uma entrada FD. -
identifier-1
(FROM) não pode ocupar a mesma área de memória querecord-name-1
. -
O uso de
ADVANCING
ou cláusulaLINAGE
afeta o controle de posicionamento na página. -
INVALID KEY
eNOT INVALID KEY
se aplicam apenas a arquivos indexados ou relativos. -
END-OF-PAGE
exige que o arquivo tenha a cláusulaLINAGE
na definiçãoFD
.
🔒 Tratamento de erros
-
INVALID KEY
: ocorre se já existir um registro (indexado), ou for fora dos limites (relativo). -
END-OF-PAGE
: ocorre se oLINAGE-COUNTER
atingir o limite de rodapé da página. -
Se não tratar
INVALID KEY
nem usar procedimento de exceção (USE
), os resultados são imprevisíveis.
✅ Conclusão
A instrução WRITE
é essencial para a gravação de dados em arquivos em COBOL. Ela oferece poderosos recursos de formatação, tratamento de exceções e controle de layout, especialmente útil em programas de geração de relatórios ou em sistemas com controle de registros indexados.