3.1. FILE SECTION

FILE SECTION.
{FD|SD} arquivo1 [IS {EXTERNAL|GLOBAL}]
[BLOCK CONTAINS [inteiro1 TO] inteiro2 {CHARACTERS|RECORDS}]
[CODE-SET IS alfabeto1]
[DATA {RECORD IS|RECORDS ARE} identificador1*]
[LABEL {RECORD IS|RECORDS ARE} {OMITTED|STANDARD}]
[LINAGE IS {inteiro3|identificador2} LINES
[LINES AT BOTTOM {inteiro4|identificador3}]
[LINES AT TOP {inteiro5|identificador4}]
[WITH FOOTING AT {inteiro6|identificador5}]
[RECORD [CONTAINS [inteiro7 TO] inteiro8 CHARACTERS] [DEPENDING ON identificador6]
[RECORDING MODE IS modo1]
[{REPORT IS|REPORTS ARE} relatorio1]
[VALUE OF nome1 IS {literal1|identificador7}]

Todo arquivo que possui um SELECT na INPUT-OUTPUT SECTION deve ser detalhado na FILE SECTION. Esse detalhamento inclui parâmetros sobre a formatação do arquivo e um ou mais layouts de registro.

O detalhamento de arquivos de trabalho para operações de SORT são declarados com a cláusula SD, de sort description. Todos os demais arquivos são detalhados com a cláusula FD, de file description.

Se nenhum arquivo for acessado pelo programa, a FILE SECTION pode ser omitida.

File Description (FD)

A cláusula FD é usada para informar parâmetros de formatação de determinado arquivo . O nome do arquivo indicado em arquivo1 deve ser igual ao nome utilizado na cláusula SELECT.

A opção IS EXTERNAL faz com que o arquivo possa ser compartilhado com qualquer programa que esteja sendo executado pela mesma thread.

A opção IS GLOBAL faz com que o arquivo possa ser compartilhado com qualquer programa aninhado (ou nested program).

As cláusulas BLOCK CONTAINS, DATA RECORD, LABEL RECORD e RECORDING MODE são reconhecidas sintáticamente pelo GnuCOBOL apenas para garantir compatibilidade com compiladores de outras plataformas mas não têm efeito funcional no programa.

A cláusula CODE-SET só pode ser usada em arquivos sequenciais ou lineares. Essa cláusula associa o arquivo a um alfabeto diferente do adotado na plataforma em que o programa está sendo executado. Esse alfabeto deve ter sido declarado previamente no parágrafo SPECIAL-NAMES da CONFIGURATION SECTION.

Da mesma forma, a cláusula LINAGE e suas subopções TOP, BOTTOM e FOOTING só pode ser usada para arquivos sequenciais ou lineares. Ela é usada para definir alguns parâmetros gerais para a página de relatórios. LINAGE IS (…) LINES informa quantas linhas podem ser ocupadas na página. LINES AT TOP e LINES AT BOTTOM estabelecem a quantidade de linhas que serão deixadas em branco, respectivamente, no topo ou no fim da página. A soma das quantidades informadas nesses três parâmetros deve ser igual ao total de linhas disponíveis na página de impressão.

O uso da declaração LINAGE também faz com que o programa crie automaticamente um campo chamado LINAGE-COUNTER que terá sempre o próximo número relativo da linha dentro da página onde será impresso o conteúdo enviado pelo comando WRITE.

RECORD CONTAINS não pode ser usado em arquivos lineares. Para outros tipos de organização, essa cláusula define o tamanho dos registros do arquivo.

Para um arquivo com registros de tamanho fixo de 80 caracteres, por exemplo, podemos codificar…

RECORD CONTAINS 80 CHARACTERS

Se o arquivo tiver registros de tamanhos variáveis é preciso indicar qual campo do registro irá contar o tamanho do registro. Por exemplo, para um arquivo cujos registros podem ter entre 40 e 132 caracteres, dependendo do valor informado num campo chamado UDA0101-RECL, poderíamos escrever…

RECORD CONTAINS 40 TO 132 CHARACTERS DEPENDING ON UDA0101-RECL

Existe uma variação aceita pelo GnuCOBOL para garantir compatibilidade com outros compiladores:

RECORD IS VARYING IN SIZE FROM 40 TO 132 CHARACTERS DEPENDING ON UDA0101-RECL

A cláusula REPORT IS (ou REPORTS ARE) informa ao compilador que o arquivo será reservado para o Report Writer Control System (RWCS), um módulo disponível no GnuCOBOL que permite a geração de relatórios definidos na REPORT SECTION da DATA DIVISION.

A geração de relatórios pelo método convencional, através de OPENs, WRITEs e itens de grupo definidos na WORKING-STORAGE, naturalmente, também funcionam no GnuCOBOL.

Se a cláusula REPORT for declarada na FD, algumas regras adicionais devem ser observadas:

  1. O arquivo deve ser sequencial ou linear;
  2. Após a FD não pode haver definição de registros, como acontece normalmente com outros tipos de arquivo.
  3. Qualquer parâmetro LINAGE será ignorado.

Sort Description (SD)

Se for um arquivo de trabalho para operações de SORT ou MERGE deve-se substituir a cláusula FD por SD.

Arquivos definidos para operações de SORT ou MERGE, identifidados pela cláusula SD, devem ter sido associados obrigatoriamente a dispositivos de disco pela cláusula ASSIGN da sentença SELECT correspondente.

Apesar de associados a dispositivos de disco, SORTs e MERGEs serão executados em memória, se houver memória disponível. Se a memória não for suficiente, o programa criará o arquivo em disco com um nome cob*.tmp no diretório indicado pelas variáveis de ambiente TMPDIR, TMP ou TEMP (nessa ordem). Esses arquivos serão eliminados pelo próprio programa no final da execução do comando SORT ou MERGE. Eles também serão eliminados se o programa for cancelado durante a execução desses comandos.

Layout de registro

nível (identificador1|FILLER) [IS (GLOBAL|EXTERNAL)]
   [BLANK WHEN ZEROS]
   [JUSTIFIED RIGHT]
   [OCCURS [inteiro1 TO] inteiro2 TIMES]
      [DEPENDING ON identificador2]
      [(ASCENDING|DESCENDING) KEY IS identificador3]
      [INDEXED BY identificador4]
   [PICTURE IS picture1]
   [REDEFINES identificador5]
   [SIGN IS (LEADING|TRAILING) [SEPARATE [CHARACTER]]]
   [(SYNCHRONIZED|SYNCHRONISED) (LEFT|RIGHT)]
   [USAGE IS uso1]
   .

Toda descrição de arquivo (FD ou SD) deve ser seguida pela definição de pelo menos um registro, exceto aqueles declarados com a opção REPORT IS.

Esse registro, na prática, é um item de grupo de nível 01, como no exemplo abaixo. O nome do registro, uda0102-registro, será usado na PROCEDURE DIVISION em comandos como WRITE e REWRITE.

fd uda0102.
01 uda0102-registro pic x(80).

O registro pode ser dividido em itens de grupo subordinados e itens elementares, aumentando o detalhamento do layout desse registro:

fd uda0102.
01 uda0102-registro.
    03 uda0102-cd-livro        pic 9(006).
    03 uda0102-nr-isbn-13.
        05 uda0102-id-gs1      pic 9(003).
        05 uda0102-id-grupo    pic 9(002).
        05 uda0102-cd-editora  pic 9(004).
        05 uda0102-nr-item     pic 9(003).
        05 uda0102-nr-dv       pic 9(001).
    03 uda0102-nm-titulo       pic x(060).
    03 uda0102-cd-autor        pic 9(006).
    03 uda0102-cd-editora      pic 9(006).
    03 uda0102-cd-idioma       pic 9(002).

Também é possível que um arquivo possua registros com diferentes layouts. Nesse caso, cada layout será representado por um item de grupo diferente:

fd uda0103.
01 uda0103-header.
    03 uda0103-tp-registro      pic  9(001).
    03 uda0103-dt-geracao.      pic  9(008).
01 uda0103-detail.
    03 filler                   pic  9(001).
    03 uda0103-mt-funcionario   pic  9(006).
    03 uda0103-dt-referencia    pic  9(006).
    03 uda0103-vr-movimento     pic s9(013)v9(002) comp-3.
01 uda0103-trailler.
    03 filler                   pic  9(001).
    03 uda0103-tt-movimento     pic s9(013)v9(002) comp-3.

Se for definido mais de um layout de registro para o arquivo o registro de maior tamanho definirá o tamanho do buffer usado em operações de leitura e gravação. Esse buffer será único, qualquer que seja o registro lido. Em outras palavras, no exemplo acima se o programa acabou de ler o registro header e fizer referência ao campo uda0103-mt-funcionario, o conteúdo desse campo não será uma matrícula de funcionário, e sim as seis primeiras posições do campo uda0103-dt-geracao.

Todos os registros de um arquivo são inicializados com zero binário quando o programa é carregado em memória para execução.

As cláusulas e opções disponíveis para criar estruturas de registros são praticamente iguais às cláusulas e opções disponíveis para criar variáveis de trabalho na WORKING-STORAGE, LOCAL-STORAGE e LINKAGE SECTION. As opções variam um pouco para declaração de itens da SCREENN ou da REPORT SECTION.

O uso de cada uma dessas opções será apresentado mais adiante neste guia.

Exemplo

*>------------------------------------------------------------*
data division.
*>------------------------------------------------------------*
file section.
fd  sca0801
    label record is standard.
01  a0801-registro.
    03  a0801-cd-banco      pic x(003).
    03  a0801-cd-agencia    pic x(006).
    03  a0801-nr-conta      pic x(011).
    03  a0801-nr-seq-ban    pic x(002).
    03  a0801-cd-patr       pic x(002).
    03  a0801-mt-part       pic x(007).
    03  a0801-mt-func       pic x(009).
    03  a0801-nm-part       pic x(030).
    03  a0801-tp-canc       pic x(001).
    03  a0801-dt-canc       pic x(010).
    03  a0801-dt-soc        pic x(010).
    03  a0801-dt-demis      pic x(010).
    03  a0801-dt-inscr      pic x(010).
    03  a0801-tp-plano      pic x(002).
    03  a0801-dt-transf     pic x(010).
    03  a0801-qtd-dep.
        05  a0801-qt-dep    pic 9(002).
    03  a0801-nr-proc       pic x(006).
    03  a0801-tp-liberac    pic x(001).
    03  a0801-sd-atual      pic 9(013)v9(002).
    03  a0801-sd-origem     pic 9(013)v9(002).
    03  a0801-sd-empr       pic 9(013)v9(002).
    03  a0801-sd-dif        pic 9(013)v9(002).
    03  a0801-nr-ct-partic  pic 9(006)v9(006).
    03  a0801-vr-cota       pic s9(006)v9(006).
    03  a0801-vr-base-ir    pic 9(013)v9(002).
    03  a0801-vr-ir         pic 9(013)v9(002).
    03  a0801-vr-desc-rct   pic s9(013)v9(002).