Translate

Mostrar mensagens com a etiqueta END-EXEC. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta END-EXEC. Mostrar todas as mensagens

domingo, 11 de março de 2007

O que é Terminador de Escopo em COBOL?

 

Bellacosa Mainframe e o terminador de escopo em cobol

O que é Terminador de Escopo em COBOL?

Os Terminadores de Escopo (Scope Terminators) são palavras-chave usadas para indicar explicitamente onde termina uma instrução COBOL.

Eles foram introduzidos para resolver um problema clássico dos programas antigos:

saber exatamente onde um comando termina.


Antes dos Terminadores de Escopo

Nas versões antigas do COBOL era comum encontrar:

IF WS-SALDO > 0
   DISPLAY 'CLIENTE ATIVO'
ELSE
   DISPLAY 'CLIENTE INATIVO'.

Quando a lógica crescia, surgiam dúvidas:

Qual IF pertence a qual ELSE?

Problema dos IFs Aninhados

Exemplo:

IF A = 1
   IF B = 2
      DISPLAY 'OK'
ELSE
   DISPLAY 'ERRO'

Pergunta:

O ELSE pertence ao IF A ou ao IF B?

Nem sempre fica claro.


Solução

A IBM e os fabricantes de compiladores introduziram:

Terminadores de Escopo


Principais Terminadores

ComandoTerminador
IFEND-IF
EVALUATEEND-EVALUATE
PERFORMEND-PERFORM
READEND-READ
WRITEEND-WRITE
REWRITEEND-REWRITE
SEARCHEND-SEARCH
STRINGEND-STRING
UNSTRINGEND-UNSTRING
COMPUTEEND-COMPUTE
EXECEND-EXEC

END-IF

O mais conhecido.


Exemplo

IF WS-SALDO > 0

   DISPLAY 'ATIVO'

ELSE

   DISPLAY 'INATIVO'

END-IF

Agora não existe dúvida.


END-EVALUATE

Fecha um EVALUATE.

EVALUATE WS-OPCAO

   WHEN 1
      DISPLAY 'CONSULTA'

   WHEN 2
      DISPLAY 'ALTERACAO'

END-EVALUATE

END-PERFORM

Fecha um PERFORM INLINE.

PERFORM UNTIL EOF = 'S'

   READ ARQCLI

END-PERFORM

END-READ

Fecha um READ.

READ ARQCLI

   AT END
      MOVE 'S' TO EOF

END-READ

END-WRITE

Fecha um WRITE.

WRITE REG-SAIDA

   INVALID KEY
      DISPLAY 'ERRO'

END-WRITE

END-REWRITE

Muito usado com VSAM.

REWRITE REG-CLIENTE

   INVALID KEY
      DISPLAY 'ERRO'

END-REWRITE

END-SEARCH

Usado em tabelas.

SEARCH WS-TABELA

   WHEN WS-CODIGO = WS-CHAVE
      DISPLAY 'ACHOU'

END-SEARCH

END-STRING

Usado em concatenação.

STRING

   WS-NOME
   WS-SOBRENOME

   INTO WS-NOME-COMP

END-STRING

END-UNSTRING

Usado para separar campos.

UNSTRING WS-LINHA

   DELIMITED BY ';'

   INTO WS-CAMPO1
        WS-CAMPO2

END-UNSTRING

END-COMPUTE

Fecha um COMPUTE.

COMPUTE WS-TOTAL =
        WS-A + WS-B

   ON SIZE ERROR
      DISPLAY 'ERRO'

END-COMPUTE

END-EXEC

Muito usado com:

  • DB2;

  • CICS;

  • IMS;

  • MQ.


Exemplo:

EXEC SQL

   SELECT NOME
     INTO :WS-NOME
     FROM CLIENTES

END-EXEC

Como funciona?

Visualmente:

COMANDO
   ↓
BLOCO
   ↓
END-COMANDO

Exemplo Completo

Sem terminadores:

IF A = 1
   IF B = 2
      DISPLAY 'OK'
ELSE
   DISPLAY 'ERRO'

Difícil de entender.


Com terminadores:

IF A = 1

   IF B = 2
      DISPLAY 'OK'
   ELSE
      DISPLAY 'ERRO'
   END-IF

END-IF

Muito mais claro.


Vantagens

Melhor legibilidade


Menos erros


Mais fácil manutenção


Menos ambiguidades


Facilita revisões de código


Programação Estruturada

Os terminadores de escopo foram um marco na evolução do COBOL estruturado.

Eles ajudaram a substituir o uso excessivo de:

GO TO

COBOL Moderno

Hoje praticamente todos os compiladores modernos recomendam:

END-IF
END-EVALUATE
END-PERFORM

em vez de depender apenas de pontos finais.


Curiosidades

1. Os primeiros programas COBOL não possuíam terminadores de escopo


2. Muitos sistemas antigos ainda utilizam apenas pontos finais


3. END-IF foi uma das maiores melhorias de legibilidade do COBOL


4. Grandes bancos exigem terminadores de escopo em seus padrões de desenvolvimento


Erros comuns de iniciantes

Esquecer END-IF


Esquecer END-EVALUATE


Misturar pontos finais com terminadores


Fechar blocos na ordem errada


Resumo rápido

ComandoTerminador
IFEND-IF
EVALUATEEND-EVALUATE
PERFORMEND-PERFORM
READEND-READ
WRITEEND-WRITE
REWRITEEND-REWRITE
SEARCHEND-SEARCH
STRINGEND-STRING
UNSTRINGEND-UNSTRING
COMPUTEEND-COMPUTE
EXECEND-EXEC

Conclusão

Os Terminadores de Escopo são palavras-chave que indicam explicitamente o final de comandos estruturados em COBOL. Eles aumentam a legibilidade, reduzem ambiguidades e são fundamentais para o desenvolvimento moderno de aplicações COBOL em ambientes Mainframe IBM Z, especialmente em sistemas que utilizam CICS, DB2, VSAM e processamento batch.


sábado, 10 de março de 2007

O que são os Comandos EXEC e END-EXEC no COBOL?

 

Bellacosa Mainframe e os comandos EXEC e END-EXEC no cobol

O que são os Comandos EXEC e END-EXEC no COBOL?

Os comandos EXEC e END-EXEC são utilizados para delimitar instruções que não pertencem ao COBOL puro, mas sim a outros subsistemas integrados ao programa.

Eles funcionam como uma espécie de:

"porta de comunicação" entre o COBOL e outros ambientes.

Os mais comuns são:

  • CICS

  • DB2

  • SQL

  • IMS

  • MQ Series (IBM MQ)


Sintaxe básica

EXEC comando
END-EXEC

Ou:

EXEC subsistema
     instruções
END-EXEC

Por que existem?

O compilador COBOL não entende diretamente comandos SQL, CICS ou MQ.

Por isso, um pré-compilador analisa tudo que estiver entre:

EXEC

e

END-EXEC

e converte para chamadas que o COBOL consegue executar.


Fluxo simplificado

Programa COBOL
       ↓
Pré-compilador
       ↓
CICS / DB2 / MQ
       ↓
Programa objeto

EXEC CICS

Uma das utilizações mais famosas.

Permite acessar o ambiente CICS.


Exemplo

EXEC CICS
     SEND
     TEXT('OLA CLIENTE')
END-EXEC

O que acontece?

O CICS envia uma mensagem para a tela do usuário.


Outro exemplo CICS

EXEC CICS
     RETURN
END-EXEC

Retorna o controle ao CICS.


EXEC SQL

Utilizado para acessar bancos de dados DB2.


Exemplo

EXEC SQL

    SELECT NOME
      INTO :WS-NOME
      FROM CLIENTES
     WHERE CPF = :WS-CPF

END-EXEC

O que acontece?

O DB2 executa o SELECT e retorna os dados para a variável COBOL.


Exemplo INSERT

EXEC SQL

    INSERT INTO CLIENTES
           (CPF,NOME)
    VALUES
           (:WS-CPF,
            :WS-NOME)

END-EXEC

Exemplo UPDATE

EXEC SQL

   UPDATE CLIENTES
      SET SALDO = :WS-SALDO
    WHERE CPF   = :WS-CPF

END-EXEC

Exemplo DELETE

EXEC SQL

   DELETE
     FROM CLIENTES
    WHERE CPF = :WS-CPF

END-EXEC

Host Variables

Observe os dois pontos:

:WS-NOME

Essas são:

Host Variables

Variáveis COBOL usadas pelo DB2.


EXEC SQL INCLUDE

Muito comum.

EXEC SQL
    INCLUDE SQLCA
END-EXEC

O que é SQLCA?

Área de comunicação entre:

COBOL
   ↔
DB2

Exemplo SQLCODE

IF SQLCODE = 0

Consulta realizada com sucesso.


EXEC IMS

Usado em aplicações IMS.


Exemplo:

EXEC DLI
     GU
END-EXEC

EXEC MQ

Utilizado para IBM MQ.


Exemplo

EXEC MQPUT
END-EXEC

ou

EXEC MQGET
END-EXEC

END-EXEC

Marca o fim do comando especial.


Exemplo

EXEC SQL
    COMMIT
END-EXEC

Sem END-EXEC o compilador não sabe onde termina a instrução.


Antigamente

Versões antigas utilizavam:

EXEC SQL
   SELECT ...

com ponto final.

Hoje o padrão é:

END-EXEC

Exemplo completo DB2

WORKING-STORAGE SECTION.

01 WS-NOME PIC X(30).

EXEC SQL
   INCLUDE SQLCA
END-EXEC.

PROCEDURE DIVISION.

EXEC SQL

   SELECT NOME
      INTO :WS-NOME
      FROM CLIENTES
     WHERE CPF = '12345678901'

END-EXEC

DISPLAY WS-NOME

Exemplo completo CICS

EXEC CICS
     RECEIVE MAP('TELA1')
END-EXEC

Recebe dados digitados pelo usuário.


EXEC CICS
     SEND MAP('TELA2')
END-EXEC

Envia dados para tela.


O que o compilador faz?

Durante a compilação:

EXEC SQL

não é executado diretamente.

Primeiro ocorre:

Pré-compilação DB2

Depois:

Compilação COBOL

Fluxo DB2

Fonte COBOL
     ↓
Pré-compilador SQL
     ↓
Fonte COBOL expandido
     ↓
Compilador COBOL
     ↓
Link Edit

Onde mais aparece?

CICS

EXEC CICS

DB2

EXEC SQL

IMS

EXEC DLI

MQ

EXEC MQ

Curiosidades

1. EXEC SQL é provavelmente a forma mais usada de EXEC no mundo Mainframe


2. Todo programa COBOL/DB2 passa por pré-compilação


3. EXEC CICS é a base das aplicações online bancárias


4. Milhões de transações por segundo utilizam EXEC CICS e EXEC SQL


Erros comuns de iniciantes

Esquecer END-EXEC


Não incluir SQLCA


Não declarar host variables


Confundir SQLCODE com RETURN-CODE


Resumo rápido

ComandoFunção
EXEC SQLAcesso DB2
EXEC CICSAcesso CICS
EXEC DLIAcesso IMS
EXEC MQAcesso IBM MQ
END-EXECFinaliza instrução
SQLCAComunicação DB2
SQLCODERetorno SQL

Conclusão

Os comandos EXEC e END-EXEC são delimitadores utilizados para integrar programas COBOL com subsistemas do Mainframe, como CICS, DB2, IMS e IBM MQ. Eles permitem que o COBOL execute comandos externos especializados, tornando possível criar aplicações online, acessar bancos de dados e integrar sistemas corporativos executados no ambiente IBM Z.