COBOL - Comando OPEN - www.cadcobol.com.br


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

COBOL - Comando OPEN
Enterprise COBOL for z/OS, V4.2, Language Reference

Esta instrução acessa os arquivos em um programa e indica quais são os de entrada e saída.
Permitir o processamento de arquivos.
Realiza também verificações e ou gravação de labels e outras operações de entrada/saída.

  • INPUT: somente para leitura
  • OUTPUT: somente para criação+gravação (se já existir o arquivo no disco, irá destruir os dados do mesmo, recriando-o)
  • I-O (Input-Output): permite leitura e gravação
  • EXTEND: permite estender um arquivo, ou seja, acrescentar registros em um arquivo já existente (apenas em arquivos do tipo SEQUENTIAL E LINE SEQUENTIAL)

Os seus formatos são:



As frases INPUT, OUTPUT, I-O e EXTEND especificam o modo a ser usado para abrir o arquivo.
Pelo menos uma das frases INPUT, OUTPUT, I-O ou EXTEND deve ser especificada com a palavra-chave OPEN.
As frases INPUT, OUTPUT, I-O e EXTEND podem aparecer em qualquer ordem.

INPUT
Permite operações de entrada.

OUTPUT
Permite operações de saída.
Esta frase pode ser especificada quando o arquivo está sendo criado.

Não especifique OUTPUT para arquivos que:

  • Contenha registros.
    O arquivo será substituído por novos dados.

    Se a frase OUTPUT for especificada para um arquivo que já contém registros, o conjunto de dados deverá ser definido como reutilizável e não poderá ter um índice alternativo.
    Os registros no arquivo serão substituídos pelos novos dados e qualquer cláusula ALTERNATE RECORD KEY na instrução SELECT será ignorada.

  • São definidos com um cartão fictício DD.
    Resultados imprevisíveis podem ocorrer.
I-O
Permite operações de entrada e saída.
A frase I-O pode ser especificada apenas para arquivos atribuídos a dispositivos de acesso direto.
A frase I-O não é válida para arquivos seqüenciais de linha.

EXTEND
Permite operações de saída que anexam ou criam um arquivo.

A frase EXTEND é permitida para arquivos de acesso seqüencial somente se os novos dados forem gravados em seqüência crescente.
A frase EXTEND é permitida para arquivos que especificam a cláusula LINAGE.

Para arquivos QSAM, não especifique a frase EXTEND para um rolo de arquivos múltiplos.

Se você deseja anexar a um arquivo, mas não tem certeza se o arquivo existe, use a cláusula SELECT OPTIONAL antes de abrir o arquivo no modo EXTEND.
O arquivo será criado ou anexado, dependendo da existência do arquivo.

file-name-1, file-name-2, file-name-3, file-name-4
Designe um arquivo no qual a instrução OPEN deve operar.
Se mais de um arquivo for especificado, os arquivos não precisarão ter a mesma organização ou modo de acesso.
Cada nome de arquivo deve ser definido em uma entrada FD na divisão de dados e não deve nomear um arquivo de classificação ou mesclagem.
A entrada FD deve ser equivalente às informações fornecidas quando o arquivo foi definido.

REVERSED
Válido apenas para arquivos seqüenciais de bobina única.
REVERSED não é válido para arquivos VSAM.

Se o conceito de bobinas não tiver significado para o meio de armazenamento (por exemplo, um dispositivo de acesso direto), as frases REVERSED e NO REWIND não se aplicarão.

NO REWIND
Válido apenas para arquivos seqüenciais de bobina única.
Não é válido para arquivos VSAM.

Para obter informações sobre tamanhos de arquivo, consulte Compiler limits

General rules

  • Se um arquivo aberto com a frase INPUT for um arquivo opcional que não está disponível, a instrução OPEN configurará o indicador de posição do arquivo para indicar que um arquivo de entrada opcional não está disponível.
  • A execução de uma instrução OPEN INPUT ou OPEN I-O define o indicador de posição do arquivo:
    • Para arquivos indexados, para os caracteres com a posição ordinal mais baixa na sequência de intercalação associada ao arquivo.
    • Para arquivos seqüenciais e relativos, para 1.
  • Quando a frase EXTEND é especificada, a instrução OPEN posiciona o arquivo imediatamente após o último registro gravado no arquivo.
    (O registro com o valor mais alto da chave de registro principal para arquivos indexados ou valor da chave relativa para arquivos relativos é considerado o último registro.)
    As instruções WRITE subsequentes adicionam registros como se o arquivo tivesse sido aberto OUTPUT.
    A frase EXTEND pode ser especificada quando um arquivo está sendo criado; também pode ser especificado para um arquivo que contém registros ou que continha registros que foram excluídos.
  • Para arquivos VSAM, se nenhum registro existir no arquivo, o indicador de posição do arquivo é configurado para que a primeira instrução READ do formato 1 executada resulte em uma condição AT END.
  • Quando NO REWIND é especificado, a execução da instrução OPEN não reposiciona o arquivo; antes da execução da instrução OPEN, o arquivo deve ser posicionado no início.
  • Quando REVERSED é especificado, a execução da instrução OPEN posiciona o arquivo QSAM no final.
    Instruções READ subsequentes disponibilizam os registros de dados em ordem reversa, começando com o último registro.

    Quando OPEN REVERSED é especificado, o formato do registro deve ser corrigido.

  • Quando as frases REVERSED, NO REWIND ou EXTEND não são especificadas, a execução da instrução OPEN posiciona o arquivo no início.

Se a cláusula PASSWORD for especificada na entrada de controle de arquivo, o item de dados da senha deverá conter uma senha válida antes da execução da instrução OPEN.
Se uma senha válida não estiver presente, a execução da instrução OPEN não terá êxito.

Label records

Se os label records forem especificados para o arquivo quando a instrução OPEN for executada, os labels serão processadas de acordo com as convenções padrão, da seguinte maneira:

INPUT files
Os labels iniciais são verificados.

OUTPUT files
Os labels iniciais são gravados.

I-O files
Os labels são checados; novos labels são gravados.

EXTEND files
Os seguintes procedimentos são executados:
  • Os rótulos (labels) de arquivo inicial são processados apenas se este for um arquivo de volume único.
  • Os rótulos de volume inicial do último volume existente são processados ??como se o arquivo estivesse sendo aberto com a frase INPUT.
  • Os rótulos de arquivo final existentes são processados como se o arquivo estivesse sendo aberto com a frase INPUT; eles são excluídos.
  • O processamento continua como se o arquivo tivesse sido aberto como um arquivo OUTPUT.

Quando os registros de etiqueta (label records) são especificados, mas não estão presentes, ou estão presentes, mas não são especificados, a execução da instrução OPEN é imprevisível.

Notas da instrução OPEN

  1. A execução bem-sucedida de uma instrução OPEN determina a disponibilidade do arquivo e resulta no arquivo em modo aberto.
    Um arquivo QSAM estará disponível se ele tiver uma alocação de DD e estiver fisicamente presente. Para obter mais informações sobre disponibilidade de arquivos, consulte Opening a file (EDS, KSDS, or RRDS) no Enterprise COBOL Programming Guide.

    A tabela a seguir mostra os resultados da abertura de arquivos disponíveis e indisponíveis.

    Tabela 1. Disponibilidade de um arquivo

    Aberto como O arquivo está disponível O arquivo está indisponível
    INPUT Abertura normal Aberto não tem êxito. (status do arquivo 35)
    INPUT (optional file) Abertura normal Abertura normal; a primeira leitura causa a condição final ou a condição de chave inválida. (status do arquivo 05)
    I-O Abertura normal Aberto não tem êxito. (status do arquivo 35)
    I-O (optional file) Abertura normal OPEN faz com que o arquivo seja criado. (status do arquivo 05)
    OUTPUT Abertura normal; o arquivo não contém registros OPEN faz com que o arquivo seja criado.
    EXTEND Abertura normal Open não tem êxito. (status do arquivo 35)
    EXTEND (optional file) Abertura normal Open faz com que o arquivo seja criado. (status do arquivo 05)

  2. A execução bem-sucedida da instrução OPEN coloca o arquivo no status aberto e disponibiliza a área de registro associada ao programa.
  3. A instrução OPEN não obtém ou libera o primeiro registro de dados.
  4. Você pode mover dados para ou da área de registro apenas quando o arquivo estiver no status aberto.
  5. Uma instrução OPEN deve ser executada com êxito antes da execução de qualquer uma das instruções de entrada e saída permitidas, exceto uma instrução SORT ou MERGE com a frase USING ou GIVING.
    Na tabela a seguir, um 'X' indica que a instrução especificada pode ser usada com o modo aberto fornecido na parte superior da coluna.

Tabela 2. Instruções Permitidas para Arquivos Sequenciais

Declaração OPEN INPUT OPEN OUTPUT OPEN I-O OPEN EXTEND
READ X X
WRITE X X
REWRITE X

Na tabela a seguir, um 'X' indica que a instrução especificada, usada no modo de acesso fornecido para essa linha, pode ser usada com o modo aberto fornecido na parte superior da coluna.

Tabela 3. Instruções permitidas para arquivos indexados e relativos

Modo de acesso a arquivos Declaração OPEN INPUT OPEN OUTPUT OPEN I-O OPEN EXTEND
Sequential READ X X
WRITE X X
REWRITE X
START X X
DELETE X
Random READ X X
WRITE X X
REWRITE X
START
DELETE X
Dynamic READ X X
WRITE X X
REWRITE X
START X X
DELETE X

Na tabela a seguir, um 'X' indica que a instrução especificada pode ser usada com o modo aberto fornecido na parte superior da coluna.

Tabela 4. Instruções Permitidas para Arquivos Sequenciais de Linha

Declaração OPEN Input OPEN Output OPEN I-O OPEN Extend
READ X
WRITE X X
REWRITE
  1. Um arquivo pode ser aberto para INPUT, OUTPUT, I-O ou EXTEND (somente arquivos seqüenciais e seqüenciais de linha) no mesmo programa.
    Após a primeira execução da instrução OPEN para um determinado arquivo, cada execução subsequente da instrução OPEN deve ser precedida por uma execução bem-sucedida da instrução do arquivo CLOSE sem a frase REEL ou UNIT (apenas para arquivos QSAM) ou a frase LOCK.
  2. Se a cláusula FILE STATUS for especificada na entrada de controle de arquivo, a chave de status do arquivo associada será atualizada quando a instrução OPEN for executada.
  3. Se uma instrução OPEN for emitida para um arquivo já no status aberto, o procedimento EXCEPTION / ERROR (se especificado) para esse arquivo será executado.


Exemplo

      *-----------------------------------------------------------------
       INPUT-OUTPUT SECTION.
      *-----------------------------------------------------------------
       FILE-CONTROL.

           SELECT ARQENT ASSIGN TO ARQENT
                  FILE STATUS IS WS-FS-ARQENT.

           SELECT ARQSAI ASSIGN TO ARQSAI
                  FILE STATUS IS WS-FS-ARQSAI.
		
      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.
      *-----------------------------------------------------------------

       01  WS-AREA-AUXILIAR.
           05  WS-FS-ARQENT              PIC X(002)  VALUE SPACES.
           05  WS-FS-ARQSAI              PIC X(002)  VALUE SPACES.
           05  WS-PROCESSO               PIC X(070)  VALUE SPACES.
           05  WS-MENSAGEM               PIC X(070)  VALUE SPACES. 
		
      *-----------------------------------------------------------------
       PROCEDURE DIVISION.
      *-----------------------------------------------------------------

           PERFORM P100-ROTINA-INICIAL   THRU P100-FIM.
           PERFORM P200-ROTINA-PRINCIPAL THRU P200-FIM.
           PERFORM P950-ROTINA-FINAL     THRU P950-FIM.
           GOBACK.

      *-----------------------------------------------------------------
       P100-ROTINA-INICIAL.
      *-----------------------------------------------------------------

           MOVE 'P100-ROTINA-INICIAL' TO  WS-PROCESSO.

           OPEN INPUT ARQENT.
           IF  WS-FS-ARQENT NOT EQUAL '00'
               MOVE SPACES TO WS-MENSAGEM
               MOVE 'Erro abertura arquivo de entrada' TO WS-MENSAGEM
               PERFORM P900-ROTINA-ERRO THRU P900-FIM
           END-IF.
           
      * Também poderia ser codificado assim:

           IF  WS-FS-ARQENT NOT EQUAL '00'
               MOVE SPACES                 TO WS-MENSAGEM
               STRING 'Erro abertura arquivo ARQENT FILE STATUS: '
                      WS-FS-ARQENT
                      DELIMITED BY SIZE  INTO WS-MENSAGEM
               END-STRING
               PERFORM P950-ROTINA-ERRO THRU P950-FIM
           END-IF. 

           OPEN OUTPUT ARQSAI.
           IF  WS-FS-ARQSAI NOT EQUAL '00'
               MOVE SPACES TO WS-MENSAGEM
               MOVE 'Erro abertura arquivo de saida  ' TO WS-MENSAGEM
               PERFORM P900-ROTINA-ERRO THRU P900-FIM
           END-IF.
		
      * Também poderia ser codificado assim:

           IF  WS-FS-ARQSAI NOT EQUAL '00'
               MOVE SPACES                 TO WS-MENSAGEM
               STRING 'Erro abertura arquivo ARQSAI FILE STATUS: '
                      WS-FS-ARQSAI
                      DELIMITED BY SIZE  INTO WS-MENSAGEM
               END-STRING
               PERFORM P950-ROTINA-ERRO THRU P950-FIM
           END-IF.

        P100-FIM.
            EXIT.	
		
      *-----------------------------------------------------------------
       P900-ROTINA-ERRO.
      *-----------------------------------------------------------------

           DISPLAY 'PROGRAMA XXXXXXXX'
           DISPLAY 'PARAGRAFO .......  - ' WS-PROCESSO
           DISPLAY 'MENSAGEM .......   - ' WS-MENSAGEM
           DISPLAY 'FILE STATUS ARQENT - ' WS-FS-ARQENT
           DISPLAY 'FILE STATUS ARQSAI - ' WS-FS-ARQSAI
           MOVE 99 TO RETURN-CODE
           GOBACK.

       P900-FIM.
           EXIT. 
		
      *-------------------------------------------------------------
       P950-ROTINA-ERRO.
      *-------------------------------------------------------------

           DISPLAY '*-----------------------------------------------'
           DISPLAY '* ERRO FILE STATUS FIM DE PROCESSAMENTO XXXXXXXX'
           DISPLAY '*-----------------------------------------------'
           DISPLAY '*                                               '
           DISPLAY 'WS-MENSAGEM '
           DISPLAY '*-----------------------------------------------'
           MOVE 99 TO RETURN-CODE
           GOBACK.

       P950-FIM.
           EXIT.