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 do WRITE.

  • Se o campo de destino for um FD, use record-name — se for SD, o SORT 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 ou I-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 que record-name-1.

  • O uso de ADVANCING ou cláusula LINAGE afeta o controle de posicionamento na página.

  • INVALID KEY e NOT INVALID KEY se aplicam apenas a arquivos indexados ou relativos.

  • END-OF-PAGE exige que o arquivo tenha a cláusula LINAGE na definição FD.

🔒 Tratamento de erros

  • INVALID KEY: ocorre se já existir um registro (indexado), ou for fora dos limites (relativo).

  • END-OF-PAGE: ocorre se o LINAGE-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.