4. Environment Division

4. Environment Division

A ENVIRONMENT é a divisão do COBOL que reúne informações sobre o ambiente onde o programa será executado. Normalmente são parâmetros de execução, opções de compatibilidade e declarações de arquivos de entrada e saída.  Ela é composta por duas seções: CONFIGURATION SECTION e INPUT-OUTPUT SECTION. Se nenhuma informação da ENVIRONMENT for necessária para o programa toda a divisão pode ser omitida.

Substituição do ponto decimal

A CONFIGURATION SECTION é a seção que fornece dados sobre a plataforma que será usada para compilar e executar o programa, além de permitir que o programador estabeleça alguns parâmetros para execução e compatibilidade.

Nesta seção é possível, por exemplo, escolher o alfabeto que será usado pelo programa (ASCII ou EBCDIC), alterar o símbolo de valor monetário ($), definir o posicionamento de sinais em campos numéricos e uma série de outras opções.

No entanto, na imensa maioria dos casos, você utilizará esta seção apenas para substituir o ponto decimal (padrão americano) pela vírgula decimal (padrão brasileiro). Essa cláusula faz com que, por exemplo, o valor 1,359.85 seja exibido como 1.359,85.

Para isso, codificamos a CONFIGURATION SECTION e um de seus parágrafos, SPECIAL-NAMES, com a sentença DECIMAL-POINT IS COMMA, como no exemplo abaixo:

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    DECIMAL-POINT IS COMMA.

Declaração de arquivos

Arquivos convencionais são todos os arquivos sequenciais, indexados e/ou relativos que não fazem parte de um banco de dados. Esse recurso é muito utilizado em COBOL, principalmente em sistemas que precisam processar milhões de registros diariamente. Processar informações em modo batch usando arquivos convencionais apresenta uma performance muito superior à que seria obtida se o sistema usasse apenas banco de dados.

Todos os arquivos convencionais que serão lidos, gravados ou modificados pelo programa precisam ser declarados no parágrafo FILE-CONTROL da seção INPUT-OUTPUT SECTION, da ENVIRONMENT DIVISION.

O trecho abaixo mostra a declaração de dois arquivos:

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.
FILE-CONTROL.

    SELECT CRA0205 ASSIGN TO “../dat/cra0205.dat”
    ORGANIZATION IS LINE SEQUENTIAL
    FILE STATUS IS WT-ST-CRA0205.

    SELECT CRA0206 ASSIGN TO “../dat/cra0206.dat”
    ORGANIZATION IS LINE SEQUENTIAL
    FILE STATUS IS WT-ST-CRA0206.

Haverá uma cláusula SELECT para cada arquivo acessado pelo programa. Existem diversos parâmetros que podem ser usados nesta cláusula. É possível, por exemplo, definir o tipo de proteção (lock) que será usado para modificar registros, o modo como o arquivo será compartilhado, o método de acesso (sequencial ou randômico), e assim por diante. Veremos muitas outras opções da cláusula SELECT ao longo desse livro.

Os dois arquivos declarados no exemplo anterior se chamam CRA0205 e CRA0206. Esses nomes serão utilizados internamente pelo programa, e não precisam ter nenhuma semelhança com o nome real do arquivo (o nome externo usado pelo sistema operacional), que aparece entre aspas depois da cláusula ASSIGN[1].

O tipo de arquivo é definido pela cláusula ORGANIZATION. Nesse exemplo, os dois arquivos são do tipo linear sequencial. Arquivos sequenciais lineares são semelhantes a arquivos texto, num ambiente Windows ou Linux. Nesse tipo de organização, os registros são separados por caracteres delimitadores. No Windows os registros são delimitados por dois caracteres: carriage return (CR, que equivale ao hexadecimal x’0D’ da tabela ASCII) e line feed (LF, que equivale ao hexadecimal x’0A’). No Unix ou no Linux, os registros são delimitados apenas pelo caracter LF.

Cobol: Arquivos sequenciais e arquivos sequenciais lineares

Declarando o File Status

A cláusula FILE STATUS informa em que variável de trabalho o COBOL deverá colocar o código de retorno das operações de I/O que serão realizadas com cada arquivo. Ela identifica uma variável que será definida mais adiante no programa, e o ideal é que você crie uma variável de file status para cada arquivo:

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.
FILE-CONTROL.

    SELECT CRA0205 ASSIGN TO “../dat/cra0205.dat”
    ORGANIZATION IS LINE SEQUENTIAL
    FILE STATUS IS WT-ST-CRA0205.

    SELECT CRA0206 ASSIGN TO “../dat/cra0206.dat”
    ORGANIZATION IS LINE SEQUENTIAL
    FILE STATUS IS WT-ST-CRA0206.

No nosso exemplo, dissemos que os códigos de retorno do arquivo CRA0205 ficarão na variável WT-ST-CRA0205, e que para o arquivo CRA0206 esses códigos ficarão em WT-ST-CRA0206. Essas duas variáveis terão que ser declaradas no programa, e veremos como fazer isso no próximo capítulo. Poderíamos ter dado qualquer nome válido para essas variáveis. Os nomes que usamos aqui (WT-ST-…) segue um dos muitos padrões de nomenclatura usados pelas empresas.

Toda operação de I/O realizada sobre os arquivos fará com que o COBOL atualize essas variáveis com um código de retorno de dois dígitos:

Cobol: Principais códigos de retorno para file status
Figura 5. Principais códigos de retorno para file statuis

Observe na figura anterior que alguns códigos de retorno são esperados pelo programa. Um file status igual a 10, por exemplo, significa que todos os registros do arquivo já foram lidos e essa é uma situação normal. Outros códigos sugerem que houve um erro de programa, como o file status 41. Outros ainda sinalizam problemas operacionais, como o file status 35.

Normalmente os sistemas adotam algum procedimento padronizado para encerramento anormal quando acontece um file status inesperado, como o 41 ou o 35.

Exemplo completo

Como mencionamos anteriormente, todas as empresas definem padrões de codificação que buscam facilitar a construção do programa e suas manutenções futuras. Isso envolve não só o uso de comentários nos lugares certos mas também a própria formatação do código fonte e as regras de nomenclatura para programas, arquivos e variáveis.

O trecho abaixo mostra como ficaria nossa ENVIRONMENT DIVISION seguindo um desses padrões:

*================================================================*
 ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
 CONFIGURATION SECTION.
 SPECIAL-NAMES.
     DECIMAL-POINT IS COMMA.

 INPUT-OUTPUT SECTION.
 FILE-CONTROL.
*----------------------------------------------------------------*
* UNLOAD DA TABELA DE DUPLICATAS
*----------------------------------------------------------------*
    SELECT CRA0205 ASSIGN TO “../dat/cra0205.dat”
    ORGANIZATION IS LINE SEQUENTIAL
    FILE STATUS IS WT-ST-CRA0205.

*----------------------------------------------------------------*
* DUPLICATAS ATIVAS EMITIDAS NO PERIODO
*----------------------------------------------------------------*
    SELECT CRA0206 ASSIGN TO “../dat/cra0206.dat”
    ORGANIZATION IS LINE SEQUENTIAL
    FILE STATUS IS WT-ST-CRA0206.

Repare que aqui também usamos linhas de comentários tracejados para destacar o início da ENVIRONMENT DIVISION. Além disso, colocamos comentários para descrever o conteúdo de cada um dos arquivos usados pelo programa.

Repare que a INPUT-OUTPUT SECTION não informa se os arquivos serão acessados para leitura ou gravação. Isso será estabelecido mais adiante, na PROCEDURE DIVISION. Também não sabemos nada ainda sobre o conteúdo de cada arquivo. Isso também será definido mais adiante, na DATA DIVISION, sobre o qual falaremos no próximo capítulo.

[1] A cláusula ASSIGN varia ligeiramente de plataforma para plataforma. Este livro adota as convenções do Linux. O exemplo mostra que os arquivos estarão num subdiretório chamado “../dat” e que os arquivos (reais) terão uma extensão .dat.


Anterior Conteúdo Próxima