Translate

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.


sexta-feira, 9 de março de 2007

O que é RETURN-CODE em COBOL?

 

Bellacosa Mainframe e o return-code no Cobol

O que é RETURN-CODE em COBOL?

O RETURN-CODE é uma variável especial utilizada para informar ao sistema operacional, ao JCL e aos schedulers o resultado da execução de um programa.

Em outras palavras:

é o código de retorno que o programa devolve ao z/OS quando termina.


Para que serve?

O RETURN-CODE informa se o programa:

  • executou com sucesso;

  • terminou com avisos;

  • encontrou erros;

  • deve interromper o fluxo do JOB.


Fluxo simplificado

PROGRAMA COBOL
       ↓
RETURN-CODE
       ↓
STEP JCL
       ↓
JES2
       ↓
Scheduler (IWS, Control-M, OPC)

Exemplo mais simples

MOVE 0 TO RETURN-CODE

Significa:

Execução OK

Valores mais comuns

Return CodeSignificado
0Sucesso
4Aviso
8Erro
12Erro grave
16Erro crítico

Exemplo

IF WS-ARQUIVO-VAZIO
   MOVE 4 TO RETURN-CODE
END-IF

Resultado:

Job terminou com Warning

Exemplo de erro

IF WS-ERRO-LEITURA
   MOVE 8 TO RETURN-CODE
END-IF

Onde o RETURN-CODE fica?

O compilador COBOL fornece automaticamente a variável especial:

RETURN-CODE

Não precisa ser declarada.


Exemplo completo

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.

PROCEDURE DIVISION.

    DISPLAY 'PROCESSAMENTO OK'

    MOVE 0 TO RETURN-CODE

    GOBACK.

Como aparece no JCL?

Após o STEP terminar:

COND CODE 0000

ou

CC 0000

Exemplo com erro

MOVE 8 TO RETURN-CODE

No spool:

COND CODE 0008

Uso em Scheduler

Ferramentas como:

  • IBM IWS (Tivoli Workload Scheduler)

  • OPC

  • Control-M

  • CA-7

  • ESP

avaliam o Return Code.


Exemplo

RC = 0000

Próximo JOB é liberado.


RC = 0008

Fluxo interrompido.


Uso com COND no JCL

//STEP2 EXEC PGM=RELATORIO,
// COND=(8,LT)

Significa:

Se RC anterior < 8
execute o STEP

Uso com IF no JCL

Mais moderno.

// IF (STEP1.RC = 0) THEN
//STEP2 EXEC PGM=PROG2
// ENDIF

Exemplo prático

Processamento de clientes.

IF QTDE-CLIENTES = ZERO
   MOVE 4 TO RETURN-CODE
END-IF

Resultado:

Nenhum cliente processado

Mas sem ABEND.


Return Code não é ABEND

Muitos iniciantes confundem.


RETURN-CODE

Programa terminou normalmente.

RC=8

ABEND

Programa terminou anormalmente.

S0C7
S0C4
U4038

Comparação

SituaçãoResultado
MOVE 8 TO RETURN-CODETérmino normal
S0C7ABEND
S0C4ABEND
U0001ABEND usuário

RETURN-CODE em Subprogramas

Pode ser utilizado antes do:

GOBACK

Exemplo

IF ERRO
   MOVE 12 TO RETURN-CODE
END-IF

GOBACK

RETURN-CODE x GOBACK

MOVE 8 TO RETURN-CODE
GOBACK

O sistema recebe:

RC=8

RETURN-CODE x STOP RUN

Também funciona.

MOVE 0 TO RETURN-CODE
STOP RUN

Convenções corporativas

Muitas empresas adotam padrões:

RCSignificado
0OK
4Warning
8Erro funcional
12Erro grave
16Erro fatal

Exemplo bancário

EVALUATE TRUE

   WHEN ARQUIVO-VAZIO
      MOVE 4 TO RETURN-CODE

   WHEN REGISTRO-INVALIDO
      MOVE 8 TO RETURN-CODE

   WHEN ERRO-BANCO-DADOS
      MOVE 12 TO RETURN-CODE

END-EVALUATE

Como visualizar?

No SDSF:

ST

ou

H

Exemplo:

JOB12345 ENDED RC=0000

ou

JOB12345 ENDED RC=0008

Curiosidades

1. RETURN-CODE existe há décadas no COBOL


2. É fundamental para automação batch


3. Schedulers dependem fortemente dele


4. Grandes bancos possuem tabelas corporativas de RCs padronizados


Erros comuns de iniciantes

Esquecer de definir RETURN-CODE


Retornar sempre zero


Confundir RC com ABEND


Não documentar significado dos RCs


Resumo rápido

ComandoFunção
RETURN-CODECódigo de retorno
RC=0Sucesso
RC=4Aviso
RC=8Erro
RC=12Erro grave
RC=16Erro crítico
GOBACKRetorna ao chamador
STOP RUNFinaliza programa

Conclusão

O RETURN-CODE é o mecanismo utilizado pelos programas COBOL para informar ao z/OS, ao JES2, ao JCL e aos schedulers o resultado da execução. Ele é essencial para o controle de fluxos batch, automação corporativa e monitoramento de processos em ambientes Mainframe IBM Z.


quinta-feira, 8 de março de 2007

O que é um Dataset VSAM no Mainframe e Como Ele é Usado em COBOL?

 


O que é um Dataset VSAM no Mainframe e Como Ele é Usado em COBOL?

Quando falamos de armazenamento de dados no ambiente z/OS, existem dois grandes mundos:

  • Arquivos Sequenciais (QSAM)

  • Arquivos VSAM

O VSAM é um dos métodos de armazenamento mais importantes do Mainframe IBM Z e é amplamente utilizado por aplicações COBOL bancárias, financeiras e governamentais.


O que significa VSAM?

VSAM significa:

Virtual Storage Access Method

Foi introduzido pela IBM em 1973 para substituir métodos mais antigos de acesso a dados.


O que é um Dataset VSAM?

Um Dataset VSAM é um arquivo especial que permite:

  • acesso direto aos registros;

  • pesquisa rápida;

  • atualização online;

  • inclusão e exclusão de registros;

  • uso de chaves de acesso.

Diferente de um arquivo sequencial, não é necessário ler tudo desde o início para encontrar um registro.


Analogia simples

Imagine uma lista telefônica.

Arquivo Sequencial

Você procura página por página.

CLIENTE 0001
CLIENTE 0002
CLIENTE 0003
...

VSAM

Você vai diretamente ao nome desejado usando um índice.

ÍNDICE
 ↓
CLIENTE 12345

Muito mais rápido.


Principais tipos de VSAM

Existem quatro tipos principais.


KSDS

Key Sequenced Data Set

O mais utilizado.

Possui:

  • chave;

  • índice;

  • acesso direto.


Exemplo:

CPF
CONTA
AGÊNCIA

Muito usado em:

  • bancos;

  • cadastro clientes;

  • contas correntes.


ESDS

Entry Sequenced Data Set

Registros gravados em sequência.

Não possui chave primária.


Acesso por:

  • posição física;

  • RBA (Relative Byte Address).


Usado para:

  • logs;

  • trilhas auditoria;

  • históricos.


RRDS

Relative Record Data Set

Acesso por número relativo.


Exemplo

Registro 1
Registro 2
Registro 3

Semelhante a um vetor gigante.


LDS

Linear Data Set

Não possui estrutura de registros.


Muito usado por:

  • DB2

  • sistemas internos IBM


Estrutura do KSDS

O tipo mais famoso.

ÍNDICE
   ↓
DADOS

Exemplo

000001 João
000002 Maria
000003 Carlos

Como o COBOL acessa VSAM?

Utilizando:

ORGANIZATION IS INDEXED

Exemplo ENVIRONMENT DIVISION

SELECT ARQCLI
       ASSIGN TO CLIENTE
       ORGANIZATION IS INDEXED
       ACCESS MODE IS DYNAMIC
       RECORD KEY IS CLI-CPF.

FILE SECTION

FD ARQCLI.

01 REG-CLIENTE.
   05 CLI-CPF     PIC 9(11).
   05 CLI-NOME    PIC X(30).
   05 CLI-SALDO   PIC 9(9)V99.

Operações básicas VSAM


OPEN

Abre arquivo.

OPEN I-O ARQCLI

READ

Lê registro.

READ ARQCLI

WRITE

Inclui registro.

WRITE REG-CLIENTE

REWRITE

Atualiza registro.

REWRITE REG-CLIENTE

DELETE

Exclui registro.

DELETE ARQCLI

START

Posiciona pela chave.

START ARQCLI
   KEY >= CLI-CPF

Exemplo de inclusão

MOVE 12345678901 TO CLI-CPF
MOVE 'BELLACOSA' TO CLI-NOME

WRITE REG-CLIENTE

Exemplo de consulta

MOVE 12345678901 TO CLI-CPF

READ ARQCLI
    INVALID KEY
       DISPLAY 'NAO ENCONTRADO'
END-READ

Exemplo de atualização

READ ARQCLI

MOVE 5000 TO CLI-SALDO

REWRITE REG-CLIENTE

Exemplo de exclusão

READ ARQCLI

DELETE ARQCLI

O que é RECORD KEY?

Campo que identifica unicamente o registro.


Exemplo

RECORD KEY IS CLI-CPF

O que é ALTERNATE INDEX?

Índice secundário.

Permite pesquisar por outro campo.


Exemplo

CPF
NOME
EMAIL

Pesquisar por:

  • CPF

  • NOME


Acesso Sequencial

ACCESS MODE IS SEQUENTIAL

Lê um após outro.


Acesso Aleatório

ACCESS MODE IS RANDOM

Lê diretamente pela chave.


Acesso Dinâmico

ACCESS MODE IS DYNAMIC

Combina os dois.


VSAM Online

Muito utilizado em:

  • CICS;

  • contas bancárias;

  • cartões;

  • PIX;

  • consulta saldo.


VSAM Batch

Usado em:

  • processamento noturno;

  • fechamento diário;

  • faturamento;

  • folha salarial.


Vantagens do VSAM

Acesso rápido


Atualização online


Pesquisa por chave


Índices automáticos


Excelente desempenho


Desvantagens

Administração mais complexa


Reorganizações periódicas


Mais complexo que QSAM


VSAM vs Arquivo Sequencial

CaracterísticaSequencialVSAM
ChaveNãoSim
ÍndiceNãoSim
Pesquisa rápidaNãoSim
Atualização diretaLimitadaSim
OnlinePouco comumMuito comum

Onde você encontra VSAM?

Praticamente em todos os grandes ambientes:

  • bancos;

  • seguradoras;

  • telecom;

  • governo;

  • cartões;

  • sistemas financeiros.


Curiosidades

1. VSAM existe desde os anos 70


2. Milhões de aplicações COBOL usam VSAM diariamente


3. Muitos caixas eletrônicos consultam VSAM em tempo real


4. Antes do DB2 dominar aplicações online, VSAM era a principal base de dados corporativa


Resumo rápido

ComandoFunção
OPENAbre VSAM
READConsulta
WRITEInclui
REWRITEAtualiza
DELETERemove
STARTPosiciona
KSDSChave indexada
ESDSSequencial
RRDSRelativo
LDSLinear

Conclusão

O VSAM é o principal método de armazenamento indexado do ambiente z/OS. Ele permite acesso rápido por chave, inclusão, atualização e exclusão de registros, sendo amplamente utilizado por programas COBOL em sistemas bancários, financeiros e governamentais executados em mainframes IBM Z.


quarta-feira, 7 de março de 2007

O que é o Comando DISPLAY em COBOL?

 

Bellacosa Mainframe e o comando display em cobol

O que é o Comando DISPLAY em COBOL?

O comando DISPLAY é uma das instruções mais simples e mais utilizadas do COBOL.

Sua função é:

exibir informações na tela, terminal, log ou SYSOUT.

Ele é equivalente a comandos como:

  • PRINT (BASIC)

  • printf() (C)

  • System.out.println() (Java)

  • print() (Python)


Para que serve o DISPLAY?

O DISPLAY é utilizado para:

  • mostrar mensagens;

  • exibir variáveis;

  • acompanhar processamento;

  • depurar programas;

  • registrar informações no SYSOUT.


Sintaxe básica

DISPLAY item

Exemplo simples

DISPLAY 'OLA MUNDO'

Saída:

OLA MUNDO

Exibindo uma variável

01 WS-NOME PIC X(20).

MOVE 'VAGNER' TO WS-NOME

DISPLAY WS-NOME

Resultado:

VAGNER

Exibindo texto e variável

DISPLAY 'CLIENTE: ' WS-NOME

Saída:

CLIENTE: VAGNER

Analogia simples

Imagine um operador olhando o console.

O DISPLAY envia informações para ele:

PROGRAMA
    ↓
DISPLAY
    ↓
TELA / SYSOUT

DISPLAY em Batch

No ambiente z/OS batch, normalmente o DISPLAY não aparece diretamente na tela.

Ele é gravado no:

  • SYSOUT

  • JES2

  • Spool

  • SDSF


Exemplo

DISPLAY 'PROCESSAMENTO INICIADO'

No SDSF aparecerá algo semelhante:

PROCESSAMENTO INICIADO

DISPLAY para Debug

Uma das utilizações mais comuns.

DISPLAY 'SALDO = ' WS-SALDO

Ajuda a verificar:

  • valores;

  • fluxo;

  • erros;

  • cálculos.


Exemplo de depuração

MOVE 1000 TO WS-SALDO

DISPLAY 'ANTES CALCULO: '
        WS-SALDO

Resultado:

ANTES CALCULO: 1000

DISPLAY de números

01 WS-VALOR PIC 9(5).

MOVE 12345 TO WS-VALOR

DISPLAY WS-VALOR

Saída:

12345

DISPLAY de COMP-3

Nem sempre gera saída legível.

Exemplo:

01 WS-SALDO PIC S9(7)V99 COMP-3.

Antes de exibir, normalmente usa-se:

MOVE WS-SALDO TO WS-EDITADO
DISPLAY WS-EDITADO

DISPLAY de datas

DISPLAY FUNCTION CURRENT-DATE

Exemplo:

2026060215304599

DISPLAY com Funções Intrínsecas

DISPLAY FUNCTION UPPER-CASE(WS-NOME)

Resultado:

VAGNER

DISPLAY em Programas Interativos

Muito comum em:

  • TSO;

  • Micro Focus;

  • GnuCOBOL;

  • ambientes educacionais.


Exemplo

DISPLAY 'DIGITE O NOME:'
ACCEPT WS-NOME

DISPLAY e ACCEPT

São comandos complementares.


DISPLAY:

DISPLAY 'INFORME O CPF'

Mostra informação.


ACCEPT:

ACCEPT WS-CPF

Recebe informação.


Fluxo típico

DISPLAY
     ↓
USUÁRIO VISUALIZA
     ↓
ACCEPT
     ↓
USUÁRIO DIGITA

DISPLAY UPON

Permite direcionar saída para dispositivos específicos.


Exemplo:

DISPLAY WS-MENSAGEM
        UPON CONSOLE

DISPLAY UPON CONSOLE

Muito usado por operadores e Sysprogs.

DISPLAY 'JOB FINALIZADO'
        UPON CONSOLE

Mensagem enviada ao console do sistema.


DISPLAY em CICS

Em aplicações CICS normalmente utiliza-se:

EXEC CICS SEND

mas DISPLAY ainda pode ser usado para debug.


DISPLAY no SYSOUT

Exemplo de saída:

INICIO PROCESSAMENTO

CLIENTE = 12345

SALDO = 5000.00

FIM PROCESSAMENTO

Exemplo completo

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 WS-NOME PIC X(20).

PROCEDURE DIVISION.

    MOVE 'BELLACOSA'
         TO WS-NOME

    DISPLAY 'NOME: '
            WS-NOME

    STOP RUN.

Resultado:

NOME: BELLACOSA

Onde o DISPLAY é mais usado?

Batch

Mensagens no SYSOUT.


Debug

Análise de variáveis.


Testes

Validação de resultados.


Ensino COBOL

Primeiros programas.


Operação

Mensagens para operadores.


Curiosidades

1. DISPLAY é normalmente o primeiro comando aprendido em COBOL


2. Grande parte dos testes iniciais utiliza DISPLAY


3. Em batch, o DISPLAY geralmente vai para o spool JES2


4. Muitos programadores usam DISPLAY para investigar ABENDs


DISPLAY vs ACCEPT

ComandoFunção
DISPLAYExibe dados
ACCEPTRecebe dados

DISPLAY vs WRITE

ComandoDestino
DISPLAYTela/SYSOUT
WRITEArquivo

Resumo rápido

ComandoFinalidade
DISPLAYExibir dados
DISPLAY variávelMostrar conteúdo
DISPLAY textoMostrar mensagem
DISPLAY FUNCTIONMostrar função
DISPLAY UPON CONSOLEConsole operador
DISPLAY + ACCEPTEntrada e saída

Conclusão

O comando DISPLAY é a principal instrução de saída do COBOL. Ele permite exibir mensagens, variáveis, resultados de cálculos e informações de processamento, sendo amplamente utilizado para debug, monitoramento e geração de mensagens no SYSOUT de aplicações executadas em mainframes IBM Z.


terça-feira, 6 de março de 2007

O que é o Comando ACCEPT em COBOL?

 

Bellacosa Mainframe e o comando accept no cobol

O que é o Comando ACCEPT em COBOL?

O comando ACCEPT é utilizado para:

receber dados de uma fonte externa e armazená-los em uma variável COBOL.

Na prática, ele funciona como uma operação de:

ENTRADA DE DADOS

É o oposto do comando:

DISPLAY

Enquanto o DISPLAY mostra informações, o ACCEPT recebe informações.


Analogia simples

Imagine um terminal 3270.

O usuário digita:

VAGNER

O COBOL precisa capturar esse valor.

Quem faz isso é o:

ACCEPT


Sintaxe básica

ACCEPT nome-do-campo

Exemplo simples

WORKING-STORAGE SECTION.

01 WS-NOME PIC X(30).

PROCEDURE DIVISION.

    DISPLAY 'DIGITE O NOME:'

    ACCEPT WS-NOME

    DISPLAY WS-NOME

    STOP RUN.

Resultado

DIGITE O NOME:
VAGNER

VAGNER

ACCEPT em programas interativos

Muito comum em:

  • TSO

  • Micro Focus COBOL

  • GnuCOBOL

  • ambientes de treinamento


Fluxo

DISPLAY
   ↓
USUÁRIO DIGITA
   ↓
ACCEPT
   ↓
PROCESSAMENTO

ACCEPT Numérico

01 WS-IDADE PIC 9(3).

ACCEPT WS-IDADE

Entrada:

25

Resultado:

WS-IDADE = 25

ACCEPT e Datas do Sistema

O ACCEPT também pode obter informações do sistema operacional.


Data atual

01 WS-DATA PIC 9(8).

ACCEPT WS-DATA FROM DATE

Resultado:

20260802

Formato:

AAAAMMDD

(depende do compilador)


Data Juliana

ACCEPT WS-DATA
       FROM DAY

Exemplo:

2026153

Ano + dia juliano.


Hora atual

01 WS-HORA PIC 9(8).

ACCEPT WS-HORA
       FROM TIME

Resultado:

14302599

Data e Hora

Alguns compiladores suportam:

ACCEPT WS-DATETIME
       FROM DATE YYYYMMDD

ACCEPT FROM DATE

Muito comum em batch.

ACCEPT WS-DATA-SISTEMA
       FROM DATE

ACCEPT FROM DAY

Retorna:

AAAA + DIA JULIANO

Exemplo

2 de junho de 2026:

2026153

ACCEPT FROM TIME

Retorna:

HHMMSSCC

Horas, minutos, segundos e centésimos.


Exemplo

15451035

ACCEPT em Mainframe Batch

No z/OS tradicional, ACCEPT de teclado é pouco utilizado.

Normalmente os dados vêm de:

  • arquivos;

  • parâmetros JCL;

  • SYSIN;

  • DB2;

  • VSAM.


Exemplo SYSIN

JCL:

//SYSIN DD *
VAGNER
/*

COBOL:

ACCEPT WS-NOME

ACCEPT e PARM do JCL

Muitas instalações utilizam:

//STEP1 EXEC PGM=PROG1,
 // PARM='PRODUCAO'

COBOL:

ACCEPT WS-PARM

ou

LINKAGE SECTION

dependendo do padrão adotado.


ACCEPT vs DISPLAY

DISPLAY:

DISPLAY 'OLA'

Mostra informação.


ACCEPT:

ACCEPT WS-NOME

Recebe informação.


Exemplo combinado

DISPLAY 'DIGITE O SALDO:'

ACCEPT WS-SALDO

DISPLAY WS-SALDO

Exemplo completo

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 WS-NOME PIC X(30).

PROCEDURE DIVISION.

    DISPLAY 'NOME: '

    ACCEPT WS-NOME

    DISPLAY 'VOCE DIGITOU: '
    DISPLAY WS-NOME

    STOP RUN.

Onde o ACCEPT é mais usado?

Ambientes educacionais


Micro Focus COBOL


GnuCOBOL


Aplicações de terminal


Captura de data/hora do sistema


Curiosidades

1. ACCEPT existe desde as primeiras versões do COBOL


2. Em z/OS batch seu uso é mais restrito


3. ACCEPT FROM DATE era muito usado antes das funções intrínsecas


4. Hoje muitos programadores preferem:

FUNCTION CURRENT-DATE

em vez de:

ACCEPT FROM DATE

ACCEPT vs FUNCTION CURRENT-DATE

Forma antiga:

ACCEPT WS-DATA
       FROM DATE

Forma moderna:

MOVE FUNCTION CURRENT-DATE
     TO WS-DATA

Resumo rápido

ComandoFunção
ACCEPTRecebe dados
ACCEPT FROM DATEData atual
ACCEPT FROM DAYData Juliana
ACCEPT FROM TIMEHora atual
DISPLAYExibe dados
CURRENT-DATEAlternativa moderna

Conclusão

O comando ACCEPT é a principal instrução de entrada de dados do COBOL. Ele permite receber informações digitadas pelo usuário ou obter dados do sistema, como data e hora, sendo um recurso clássico presente desde os primórdios da linguagem e ainda encontrado em aplicações COBOL executadas em ambientes IBM Z, Micro Focus e GnuCOBOL.

segunda-feira, 5 de março de 2007

O que é o Comando EVALUATE em COBOL?

 

Bellacosa Mainframe e o comando evaluate em cobol

O que é o Comando EVALUATE em COBOL?

O comando EVALUATE é uma das estruturas de decisão mais poderosas do COBOL.

Ele é equivalente ao:

  • CASE (C, Java, C#)

  • SWITCH (Java, JavaScript)

  • MATCH (algumas linguagens modernas)

Seu objetivo é:

executar diferentes ações dependendo do valor de uma variável ou condição.


Por que o EVALUATE existe?

Imagine um programa com vários IFs:

IF WS-OPCAO = 1
   PERFORM CONSULTA
ELSE
   IF WS-OPCAO = 2
      PERFORM INCLUSAO
   ELSE
      IF WS-OPCAO = 3
         PERFORM ALTERACAO
      END-IF
   END-IF
END-IF

Funciona, mas fica difícil de ler.

Com EVALUATE:

EVALUATE WS-OPCAO

   WHEN 1
      PERFORM CONSULTA

   WHEN 2
      PERFORM INCLUSAO

   WHEN 3
      PERFORM ALTERACAO

END-EVALUATE

Muito mais limpo.


Sintaxe básica

EVALUATE variável

   WHEN valor-1
      ação

   WHEN valor-2
      ação

   WHEN valor-3
      ação

END-EVALUATE

Exemplo simples

EVALUATE WS-NOTA

   WHEN 10
      DISPLAY 'EXCELENTE'

   WHEN 8
      DISPLAY 'MUITO BOM'

   WHEN 6
      DISPLAY 'APROVADO'

END-EVALUATE

WHEN OTHER

Funciona como:

DEFAULT
ELSE

Exemplo

EVALUATE WS-OPCAO

   WHEN 1
      DISPLAY 'CONSULTA'

   WHEN 2
      DISPLAY 'ALTERACAO'

   WHEN OTHER
      DISPLAY 'OPCAO INVALIDA'

END-EVALUATE

EVALUATE TRUE

Muito utilizado em sistemas corporativos.

Permite avaliar condições.


Exemplo

EVALUATE TRUE

   WHEN WS-SALDO > 10000
      DISPLAY 'CLIENTE VIP'

   WHEN WS-SALDO > 5000
      DISPLAY 'CLIENTE GOLD'

   WHEN OTHER
      DISPLAY 'CLIENTE NORMAL'

END-EVALUATE

Comparação com IF

IF:

IF WS-IDADE >= 18
   DISPLAY 'MAIOR'
ELSE
   DISPLAY 'MENOR'
END-IF

EVALUATE:

EVALUATE TRUE

   WHEN WS-IDADE >= 18
      DISPLAY 'MAIOR'

   WHEN OTHER
      DISPLAY 'MENOR'

END-EVALUATE

Avaliando faixas

EVALUATE TRUE

   WHEN WS-NOTA >= 9
      DISPLAY 'A'

   WHEN WS-NOTA >= 7
      DISPLAY 'B'

   WHEN WS-NOTA >= 5
      DISPLAY 'C'

   WHEN OTHER
      DISPLAY 'D'

END-EVALUATE

Avaliando múltiplos valores

EVALUATE WS-MES

   WHEN 1 2 3
      DISPLAY 'TRIMESTRE 1'

   WHEN 4 5 6
      DISPLAY 'TRIMESTRE 2'

   WHEN 7 8 9
      DISPLAY 'TRIMESTRE 3'

   WHEN 10 11 12
      DISPLAY 'TRIMESTRE 4'

END-EVALUATE

Avaliando múltiplas variáveis

Uma das características mais poderosas.

EVALUATE WS-TIPO ALSO WS-STATUS

   WHEN 'PF' ALSO 'A'
      DISPLAY 'PESSOA FISICA ATIVA'

   WHEN 'PJ' ALSO 'A'
      DISPLAY 'EMPRESA ATIVA'

   WHEN OTHER
      DISPLAY 'OUTRA SITUACAO'

END-EVALUATE

ALSO

Permite comparar vários campos simultaneamente.


Exemplo bancário

EVALUATE WS-CANAL ALSO WS-PRODUTO

   WHEN 'APP' ALSO 'PIX'
      PERFORM PROCESSA-PIX

   WHEN 'ATM' ALSO 'SAQUE'
      PERFORM PROCESSA-SAQUE

   WHEN OTHER
      PERFORM TRATA-ERRO

END-EVALUATE

Intervalos com THRU

EVALUATE WS-NOTA

   WHEN 0 THRU 4
      DISPLAY 'REPROVADO'

   WHEN 5 THRU 6
      DISPLAY 'RECUPERACAO'

   WHEN 7 THRU 10
      DISPLAY 'APROVADO'

END-EVALUATE

EVALUATE com LEVEL 88

Combinação muito elegante.

01 WS-STATUS PIC X.

   88 STATUS-OK VALUE 'S'.
   88 STATUS-ERRO VALUE 'N'.
EVALUATE TRUE

   WHEN STATUS-OK
      DISPLAY 'SUCESSO'

   WHEN STATUS-ERRO
      DISPLAY 'FALHA'

END-EVALUATE

Vantagens do EVALUATE

Mais legível

Menos IF aninhado

Fácil manutenção

Excelente para regras de negócio

Melhor organização do código


Cuidados

  • A ordem dos WHEN é importante.

  • WHEN OTHER deve ficar por último.

  • Em EVALUATE TRUE, a primeira condição verdadeira é executada.


Onde é mais utilizado?

Praticamente em todos os sistemas COBOL modernos:

  • Bancos

  • Seguradoras

  • Cartões

  • PIX

  • Folha salarial

  • Processamento batch

  • CICS


Exemplo completo

WORKING-STORAGE SECTION.

01 WS-OPERACAO PIC 9.

PROCEDURE DIVISION.

    MOVE 2 TO WS-OPERACAO

    EVALUATE WS-OPERACAO

       WHEN 1
          DISPLAY 'CONSULTA'

       WHEN 2
          DISPLAY 'INCLUSAO'

       WHEN 3
          DISPLAY 'ALTERACAO'

       WHEN OTHER
          DISPLAY 'INVALIDO'

    END-EVALUATE

    STOP RUN.

Saída:

INCLUSAO

EVALUATE vs IF

IFEVALUATE
Bom para poucas condiçõesIdeal para muitas condições
Pode gerar IFs aninhadosCódigo mais limpo
Menos legível em regras complexasExcelente legibilidade
SimplesMais poderoso

Resumo rápido

ElementoFunção
EVALUATEEstrutura de decisão
WHENCondição
WHEN OTHERCaso padrão
ALSOMúltiplas variáveis
THRUIntervalo
EVALUATE TRUEAvaliação de expressões

Conclusão

O comando EVALUATE é a principal estrutura de decisão múltipla do COBOL. Ele substitui grandes blocos de IF aninhados, melhora a legibilidade do código e é amplamente utilizado em sistemas corporativos executados em mainframes IBM Z para implementar regras de negócio complexas de forma organizada e eficiente.