Translate

Mostrar mensagens com a etiqueta funções intrínsecas. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta funções intrínsecas. Mostrar todas as mensagens

domingo, 18 de setembro de 2022

Funções Intrínsecas no Enterprise COBOL : O Superpoder Escondido da Linguagem que Todo Programador COBOL Padawan Deveria Conhecer

 

Bellacosa Mainframe e as funcoes intrinsecas no cobol

☕ Um Café no Bellacosa Mainframe

Funções Intrínsecas no Enterprise COBOL

O Superpoder Escondido da Linguagem que Todo Programador COBOL Padawan Deveria Conhecer

"Existe um momento na vida de todo Programador COBOL em que ele percebe que passou anos escrevendo dezenas de linhas de código para resolver problemas que poderiam ser solucionados com apenas uma única função. Esse momento normalmente vem quando ele descobre as Funções Intrínsecas do Enterprise COBOL."


Introdução

Todo Programador COBOL começa aprendendo praticamente o mesmo conjunto de comandos:

  • MOVE

  • ADD

  • SUBTRACT

  • MULTIPLY

  • DIVIDE

  • IF

  • EVALUATE

  • PERFORM

Com eles já é possível desenvolver sistemas inteiros.

Durante muitos anos isso foi suficiente.

Entretanto, conforme os sistemas ficaram mais sofisticados, surgiu um problema.

Como calcular uma data futura?

Como descobrir o tamanho de um texto?

Como converter letras para maiúsculas?

Como obter o ano atual?

Como calcular valor absoluto?

Como descobrir o maior número entre vários?

Como manipular datas sem escrever centenas de linhas de código?

Foi justamente para resolver essas necessidades que surgiram as Funções Intrínsecas (Intrinsic Functions).

Elas representam uma das maiores evoluções da linguagem COBOL moderna.


O que são Funções Intrínsecas?

Podemos imaginar as Funções Intrínsecas como pequenas ferramentas prontas, fornecidas pelo próprio compilador.

Ao invés de escrevermos toda a lógica...

Apenas chamamos uma função.

Exemplo.

Ao invés de fazer:

Receba a data

↓

Separe dia

↓

Separe mês

↓

Separe ano

↓

Valide

↓

Calcule

Podemos simplesmente escrever:

FUNCTION CURRENT-DATE

O compilador faz todo o trabalho.


Por que elas existem?

Imagine que cem empresas precisem calcular o valor absoluto de um número.

Sem funções.

Cada equipe escreveria um algoritmo diferente.

Com funções.

Todos utilizam exatamente a mesma implementação.

Mais simples.

Mais segura.

Mais rápida.

Mais padronizada.


Como reconhecer uma Função Intrínseca?

Todas começam com a palavra:

FUNCTION

Por exemplo.

MOVE FUNCTION UPPER-CASE(WS-NOME)
    TO WS-NOME

Ou.

COMPUTE WS-IDADE =
        FUNCTION INTEGER(WS-VALOR)

Sempre que enxergar FUNCTION, provavelmente estará utilizando uma Função Intrínseca.


Os grandes grupos de funções

Embora existam dezenas de funções disponíveis no Enterprise COBOL, podemos agrupá-las em algumas categorias principais.

  • Funções Matemáticas

  • Funções Estatísticas

  • Funções de Texto

  • Funções de Datas

  • Funções Financeiras

  • Funções de Conversão

  • Funções Numéricas

  • Funções de Internacionalização

  • Funções de Manipulação de Caracteres

Organizar mentalmente essas categorias facilita muito a escolha da função adequada.


1. Funções Matemáticas

São utilizadas para cálculos.

Algumas das mais conhecidas:

  • ABS

  • SQRT

  • INTEGER

  • INTEGER-PART

  • FRACTION-PART

  • REM

  • MOD

  • EXP

  • LOG

  • LOG10


ABS

Valor absoluto.

-50

↓

50

Exemplo.

COMPUTE WS-VALOR =
        FUNCTION ABS(WS-NUMERO)

Muito útil quando não importa o sinal.


SQRT

Raiz quadrada.

81

↓

9

Sem precisar implementar Newton-Raphson ou outro algoritmo matemático.


INTEGER

Remove a parte decimal.

123.98

↓

123

Muito usado em cálculos financeiros.


2. Funções de Texto

Uma das categorias mais utilizadas.

Inclui funções como:

  • UPPER-CASE

  • LOWER-CASE

  • REVERSE

  • LENGTH

  • TRIM


UPPER-CASE

Imagine.

Bellacosa Mainframe

Resultado.

BELLACOSA MAINFRAME

Código.

MOVE FUNCTION UPPER-CASE(WS-NOME)
    TO WS-NOME

Excelente para padronização.


LOWER-CASE

O inverso.

IBM MAINFRAME

↓

ibm mainframe

LENGTH

Retorna o tamanho do dado.

COBOL

↓

5

Sem precisar contar caracteres manualmente.


TRIM

Remove espaços desnecessários.

Muito útil antes de comparar textos ou montar mensagens.


3. Funções de Datas

Provavelmente as mais importantes no ambiente corporativo.

Imagine calcular datas manualmente.

Teríamos que considerar:

  • anos bissextos;

  • meses com 28, 29, 30 ou 31 dias;

  • calendário gregoriano;

  • mudança de século.

As funções fazem isso automaticamente.


CURRENT-DATE

Obtém data e hora do sistema.

MOVE FUNCTION CURRENT-DATE
    TO WS-DATA

Retorna informações como:

  • ano;

  • mês;

  • dia;

  • hora;

  • minuto;

  • segundo;

  • frações de segundo.

É muito utilizada para auditoria, logs, trilhas de execução e identificação de transações.


INTEGER-OF-DATE

Transforma uma data em um número inteiro.

Isso facilita cálculos de diferença entre datas.


DATE-OF-INTEGER

Faz exatamente o contrário.


4. Funções Estatísticas

Pouca gente lembra delas.

Mas existem.

Exemplos.

  • MAX

  • MIN

  • MEAN

  • MEDIAN

Imagine.

12

40

9

18

Maior valor.

FUNCTION MAX(...)

Menor valor.

FUNCTION MIN(...)

Muito útil em processamento analítico.


5. Funções Financeiras

O Enterprise COBOL também oferece funções voltadas para cálculos financeiros.

Dependendo da versão do compilador e do ambiente, é possível utilizar funções relacionadas a juros, amortização e cálculos financeiros padronizados.

Embora nem todas sejam amplamente utilizadas em aplicações corporativas modernas, é importante conhecer sua existência, principalmente em projetos legados ou ambientes específicos.


6. Conversões

Outra categoria extremamente útil.

Imagine receber um número com casas decimais.

1234.987

Desejamos apenas.

1234

Basta.

FUNCTION INTEGER(...)

Sem escrever dezenas de IFs.


Um exemplo passo a passo

Imagine um cadastro.

Nome

João da Silva

Precisamos:

  • remover espaços;

  • converter para maiúsculas;

  • descobrir tamanho.

Passo 1.

FUNCTION TRIM(...)

Resultado.

João da Silva

Sem espaços extras.


Passo 2.

FUNCTION UPPER-CASE(...)

Resultado.

JOÃO DA SILVA

Passo 3.

FUNCTION LENGTH(...)

Resultado.

14

Perceba.

Cada função resolve um problema específico.

Elas podem inclusive ser combinadas para formar soluções elegantes e fáceis de manter.


Podemos combinar funções?

Sim.

Exemplo.

MOVE FUNCTION UPPER-CASE(
         FUNCTION TRIM(WS-NOME))
    TO WS-NOME

Primeiro remove espaços.

Depois converte para maiúsculas.

O resultado é obtido em uma única instrução.


Performance

Uma dúvida muito comum.

"As funções são mais lentas?"

Na enorme maioria dos casos.

Não.

Pelo contrário.

Elas fazem parte do próprio compilador.

São altamente otimizadas.

Na maioria das situações são mais rápidas e muito mais confiáveis do que algoritmos desenvolvidos manualmente.


Vantagens das Funções Intrínsecas

Entre os principais benefícios estão:

  • Menor quantidade de código.

  • Maior legibilidade.

  • Melhor manutenção.

  • Menor chance de erros.

  • Código mais padronizado.

  • Aproveitamento das otimizações do compilador.

  • Maior produtividade.

É um excelente exemplo do princípio de reutilização: em vez de reinventar uma solução, utilizamos uma implementação consolidada e amplamente testada.


Quando NÃO utilizar?

Existe apenas um cuidado.

Não utilizar funções apenas porque elas existem.

Por exemplo.

MOVE A TO B

Não precisa virar uma função.

Outro exemplo.

Somar dois números.

ADD A TO B

Continua sendo mais simples.

Funções devem resolver problemas específicos.

Não substituir comandos básicos da linguagem.


O que um Programador COBOL Padawan deve decorar?

Não é necessário memorizar todas as dezenas de funções disponíveis.

Mas vale conhecer as mais utilizadas:

✔ CURRENT-DATE

✔ LENGTH

✔ UPPER-CASE

✔ LOWER-CASE

✔ TRIM

✔ ABS

✔ INTEGER

✔ MAX

✔ MIN

✔ DATE-OF-INTEGER

✔ INTEGER-OF-DATE

Essas aparecem frequentemente em aplicações corporativas.

À medida que surgirem novas necessidades, outras funções poderão ser incorporadas naturalmente ao seu repertório.


Easter Egg Bellacosa ☕

Existe uma curiosidade interessante.

Quando um Programador COBOL Júnior escreve um algoritmo enorme para descobrir o maior valor de uma lista.

Um Programador Pleno costuma lembrar da função MAX.

Quando o Júnior implementa uma rotina inteira para converter textos para maiúsculas.

O Pleno utiliza UPPER-CASE.

Quando o Júnior cria dezenas de linhas para manipular datas.

O Sênior pergunta primeiro:

"Será que já existe uma Função Intrínseca para isso?"

Essa mudança de pensamento representa uma das maiores evoluções na carreira de um desenvolvedor.

A experiência não consiste apenas em conhecer mais comandos.

Consiste em saber que o compilador já oferece ferramentas prontas, seguras e altamente otimizadas para resolver muitos problemas comuns.


Conclusão

As Funções Intrínsecas representam um verdadeiro kit de ferramentas embutido no Enterprise COBOL. Elas simplificam cálculos, manipulação de textos, tratamento de datas, conversões e diversas outras tarefas recorrentes, permitindo que o desenvolvedor concentre seus esforços na regra de negócio em vez de reescrever algoritmos básicos.

Para um Programador COBOL Padawan, dominar esse recurso significa dar um passo importante rumo a um código mais limpo, legível e profissional. Em vez de decorar todas as funções existentes, o mais importante é compreender seus grupos, saber quando utilizá-las e criar o hábito de consultar a documentação do compilador sempre que surgir um novo desafio.

Lembre-se: um bom Programador COBOL não é aquele que escreve mais código. É aquele que conhece melhor a linguagem e utiliza seus recursos para construir soluções simples, robustas, eficientes e fáceis de manter. Afinal, no universo do IBM Mainframe, elegância e confiabilidade caminham sempre lado a lado.

quarta-feira, 20 de julho de 2022

Criando Sua Própria Função Intrínseca no COBOL

 

Bellacosa Mainframe crie sua propria função intrinseca no Cobol Mainframe

☕ Um Café no Bellacosa Mainframe

Criando Sua Própria Função Intrínseca no COBOL

O Guia do Programador COBOL Padawan para Expandir os Poderes da Linguagem com a Ajuda do Capitão Kirk

"O universo não se expande porque alguém pediu permissão. Ele se expande porque alguém teve coragem de explorar o desconhecido."

— Capitão James T. Kirk (adaptado para Bellacosa Mainframe)


Introdução — "Mas... eu posso criar uma nova FUNCTION no COBOL?"

Essa é uma das perguntas que quase nenhum curso responde.

Durante décadas, programadores COBOL aprenderam algo parecido com isto:

  • FUNCTION CURRENT-DATE

  • FUNCTION UPPER-CASE

  • FUNCTION LOWER-CASE

  • FUNCTION LENGTH

  • FUNCTION RANDOM

E a conclusão natural era:

"Essas funções fazem parte da linguagem. Não posso criar outras."

Durante muitos anos isso realmente era verdade.

Mas a IBM resolveu mudar isso.

Hoje, no Enterprise COBOL moderno, você pode criar suas próprias funções, reutilizáveis exatamente como uma FUNCTION nativa da linguagem.

É quase como ensinar novos truques ao compilador.

Se você já trabalhou com:

  • Java (methods)

  • C (functions)

  • Python (def)

  • C# (methods)

vai perceber que finalmente o COBOL ganhou algo semelhante.

E a melhor parte?

Isso continua extremamente eficiente para ambientes bancários.

Hoje vamos descobrir como.

E, como sempre, o Capitão Kirk nos acompanhará nessa missão.


A ponte da Enterprise

Imagine a USS Enterprise.

Cada oficial possui uma especialidade.

Spock calcula.

Scotty cuida do motor.

McCoy resolve problemas médicos.

Kirk apenas chama quem precisa.

Ele não faz tudo.

Ele reutiliza especialistas.

Uma User-Defined Function faz exatamente isso.

Você cria um especialista.

Depois qualquer programa COBOL pode chamá-lo.


Antes disso...

Durante mais de 50 anos havia apenas dois caminhos.

Opção 1

Escrever código repetido.

CALCULA-JUROS.

CALCULA-DESCONTO.

CALCULA-IDADE.

Copiado dezenas de vezes.


Opção 2

Criar um subprograma

CALL "JUROS"

Funciona.

Mas possui custo.

Existe:

  • parameter list

  • linkage

  • transferência de controle

  • convenções de chamada

Embora eficiente, ainda existe overhead.


As User Defined Functions diminuem bastante esse problema.


O que é uma User-Defined Function?

É uma função escrita pelo próprio programador.

Ela recebe parâmetros.

Executa lógica.

Retorna um único valor.

Exemplo imaginário:

FUNCTION CALCULA-CPF()

ou

FUNCTION REMOVE-ESPACOS()

ou

FUNCTION SOMA-IMPOSTOS()

Ela parece uma função da linguagem.

Mas foi você quem escreveu.


Desde quando isso existe?

No mundo IBM Mainframe, o suporte chegou com o IBM Enterprise COBOL 5 (introduzido em 2013), quando a linguagem passou a incorporar recursos modernos alinhados aos padrões mais recentes do COBOL. As capacidades foram ampliadas e refinadas nas versões 6.1, 6.2, 6.3, 6.4 e 6.5, que hoje são as mais encontradas em ambientes z/OS corporativos.

Na prática, é nas versões Enterprise COBOL 5.x e, principalmente, 6.x que esse recurso se tornou realmente utilizável em projetos modernos.


Precisa instalar alguma coisa?

Boa notícia.

Não.

Nada.

Se o compilador suporta User-Defined Functions, elas já fazem parte do compilador.

Você apenas compila normalmente.

Não existe:

  • DLL

  • Plugin

  • Biblioteca externa


Como funciona?

A arquitetura é simples.

Programa A

↓

FUNCTION MINHA-FUNCTION()

↓

User Defined Function

↓

Retorna resultado

Muito parecido com isto:

resultado =
FUNCTION JUROS(valor)


Estrutura geral

Ela lembra um programa COBOL.

IDENTIFICATION DIVISION

FUNCTION-ID.

ENVIRONMENT DIVISION.

DATA DIVISION.

PROCEDURE DIVISION.

END FUNCTION.

Observe algo curioso.

Não usamos

PROGRAM-ID

Usamos

FUNCTION-ID

Esse é o detalhe que transforma um programa em uma função.


Exemplo 1

Dobrando um número

IDENTIFICATION DIVISION.
FUNCTION-ID. DOBRO.

DATA DIVISION.

LINKAGE SECTION.

01 L-VALOR PIC S9(9) COMP-5.

01 L-RETORNO PIC S9(9) COMP-5.

PROCEDURE DIVISION USING L-VALOR
                   RETURNING L-RETORNO.

    COMPUTE L-RETORNO = L-VALOR * 2

    GOBACK.

END FUNCTION DOBRO.

Bonito.

Limpo.

Pequeno.


Agora o programa principal.

DISPLAY FUNCTION DOBRO(15)

Saída

30

Muito elegante.


Exemplo 2

Maior entre dois números

FUNCTION MAIOR(A,B)

Dentro:

IF A > B
   MOVE A TO RETORNO
ELSE
   MOVE B TO RETORNO
END-IF

Depois:

DISPLAY FUNCTION MAIOR(25 19)

Resultado

25


Exemplo 3

Calcular idade

FUNCTION IDADE(DATA-NASCIMENTO)

Internamente:

CURRENT-DATE

Subtrai

Retorna idade.

Depois:

DISPLAY FUNCTION IDADE(19980412)

Muito mais legível.


Onde declarar parâmetros?

Na

LINKAGE SECTION

Exemplo

01 PARAM1.

01 PARAM2.

Depois

PROCEDURE DIVISION USING
PARAM1
PARAM2
RETURNING RESULTADO

Muito parecido com um subprograma.


Como chamar?

COMPUTE WS-TOTAL =
FUNCTION JUROS(1000 15)

Ou

MOVE FUNCTION DOBRO(5)
TO WS-VALOR

Ou

DISPLAY FUNCTION TEXTO()


Posso chamar outras FUNCTIONS?

Sim.

Inclusive funções intrínsecas.

FUNCTION UPPER-CASE()

Dentro da sua função.

Exemplo

FUNCTION UPPER-CASE(cliente)

Retorna

JOÃO


Posso chamar um CALL?

Também.

CALL "ROTINA"

Nada impede.

Mas cuidado.

Funções devem ser pequenas.


O Capitão Kirk explica

Imagine que Kirk pede um café.

Ele não desmonta o replicador.

Ele apenas diz:

CAFÉ()

O replicador faz todo o trabalho.

Isso é encapsulamento.


Performance

Excelente.

Muito melhor do que copiar código.

Muito melhor para manutenção.

Além disso:

✔ reutilização

✔ cache de instruções

✔ otimização do compilador

✔ menor duplicação


Um detalhe importante

Funções devem retornar UM único valor.

Não dez.

Se precisa retornar muitas estruturas:

Use

CALL

Não FUNCTION.


Posso acessar arquivos VSAM?

Tecnicamente pode.

Mas...

Não deveria.

Funções devem ser previsíveis.


Boa função:

CALCULA

Ruim:

ABRE VSAM

FAZ I/O

ATUALIZA DB2

ENVIA MQ


O perigo dos efeitos colaterais

Imagine:

FUNCTION SALDO()

Você espera apenas consultar.

Mas internamente:

UPDATE DB2

Isso é perigoso.

Uma função deve produzir sempre o mesmo resultado para a mesma entrada, sempre que possível.


Erros comuns

1 Repetir lógica

Ao invés de:

FUNCTION IMPOSTO()

o programador copia:

COMPUTE...

100 vezes.


2 Fazer função enorme

Ruim

900 linhas

Boa

20

40

60 linhas


3 Muitos parâmetros

FUNCTION CALCULA(
A
B
C
D
E
F
G
H)

Já virou um monstro.


4 Fazer I/O

Evite.


5 Alterar estado global

Funções devem ser independentes.


Truques interessantes

Criar biblioteca matemática

FUNCTION MEDIA()

FUNCTION DESVIO()

FUNCTION MEDIANA()


Biblioteca financeira

JUROS

IOF

IR

TAXA


Biblioteca bancária

VALIDA-CPF

VALIDA-CNPJ

MOD11

DIGITO


Biblioteca texto

REMOVE-ESPACOS

NORMALIZA

CAPITALIZA


Organização recomendada

COPYBOOKS

FUNCTIONS

SUBPROGRAMAS

PROGRAMAS

Cada função em seu próprio membro.

Muito semelhante à organização de uma biblioteca reutilizável.


Boas práticas

✔ Nomeie funções de forma descritiva (CALCULA-JUROS, VALIDA-CPF, NORMALIZA-NOME).

✔ Mantenha apenas uma responsabilidade por função.

✔ Evite acessar arquivos, filas MQ ou banco de dados dentro de funções de cálculo.

✔ Prefira funções determinísticas: mesma entrada, mesma saída.

✔ Documente parâmetros e tipo de retorno.

✔ Teste cada função de forma isolada antes de utilizá-la em produção.

✔ Centralize funções reutilizáveis em bibliotecas compartilhadas pela equipe.

✔ Utilize compilação otimizada nas versões atuais do Enterprise COBOL para aproveitar as melhorias do compilador.


Quando usar FUNCTION e quando usar CALL?

SituaçãoFUNCTIONCALL
Cálculos rápidos✅ Excelente✔ Possível
Manipulação de texto✅ Excelente✔ Possível
Validação de CPF/CNPJ✅ Ideal✔ Possível
Retornar um único valor✅ Melhor escolha✔ Possível
Atualizar Db2❌ Evite✅ Recomendado
Processar VSAM❌ Evite✅ Recomendado
Enviar mensagens MQ❌ Evite✅ Recomendado
Processamento complexo com vários retornos❌ Não indicado✅ Ideal

Um exemplo prático: função para calcular desconto

Imagine uma empresa que aplica um desconto de 10% sobre qualquer valor informado. Em vez de repetir o cálculo em dezenas de programas, criamos uma função reutilizável.

Função

IDENTIFICATION DIVISION.
FUNCTION-ID. CALC-DESCONTO.

DATA DIVISION.

LINKAGE SECTION.
01 LK-VALOR     PIC S9(7)V99 COMP-3.
01 LK-RETORNO   PIC S9(7)V99 COMP-3.

PROCEDURE DIVISION
    USING LK-VALOR
    RETURNING LK-RETORNO.

    COMPUTE LK-RETORNO =
        LK-VALOR * 0.90

    GOBACK.

END FUNCTION CALC-DESCONTO.

Programa chamador

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 WS-VALOR     PIC S9(7)V99 VALUE 1000.
01 WS-FINAL     PIC S9(7)V99.

PROCEDURE DIVISION.

    MOVE FUNCTION CALC-DESCONTO(WS-VALOR)
        TO WS-FINAL

    DISPLAY "Valor original : " WS-VALOR
    DISPLAY "Valor final    : " WS-FINAL

    STOP RUN.

Saída esperada:

Valor original : 1000.00
Valor final    :  900.00

Perceba como o programa principal permanece limpo. Toda a regra de negócio fica encapsulada em um único lugar. Se amanhã o desconto passar para 12%, basta recompilar a função.


A visão do Capitão Kirk

No final da missão, Kirk reúne sua tripulação na ponte da Enterprise.

Spock observa:

"Capitão, seria lógico repetir o mesmo algoritmo em 147 programas?"

Kirk sorri.

"Claro que não, Spock. Criamos uma função, compartilhamos conhecimento e seguimos explorando."

Scotty complementa:

"Quanto menos motores improvisados, menos explosões na sala de máquinas."

McCoy, olhando para um enorme programa COBOL cheio de código duplicado, comenta:

"Ele está vivo... mas não por muito tempo."

Essa é a verdadeira filosofia das User-Defined Functions: transformar conhecimento reutilizável em componentes pequenos, claros e confiáveis.

Cuidados e atenção 

Como compilar e ajustar sua função intrinseca no Cobol 6.4

https://eljefemidnightlunch.blogspot.com/2022/07/alerta-vermelho-na-enterprise.html

O que são Funções Intrincsecas no Cobol

https://eljefemidnightlunch.blogspot.com/2022/09/funcoes-intrinsecas-no-enterprise-cobol.html



Conclusão — Seu próximo passo como Padawan COBOL

As User-Defined Functions representam uma das evoluções mais elegantes do COBOL moderno. Elas aproximam a linguagem das práticas de engenharia de software utilizadas em linguagens contemporâneas, sem abrir mão da robustez que tornou o COBOL o alicerce de bancos, seguradoras e grandes empresas por décadas.

Para um Padawan COBOL, dominar esse recurso significa deixar de escrever programas monolíticos e começar a construir bibliotecas reutilizáveis de regras de negócio. Isso reduz duplicação de código, facilita testes, melhora a manutenção e torna o desenvolvimento muito mais organizado.

No universo Bellacosa Mainframe, criar uma nova função é como adicionar um novo oficial especializado à tripulação da USS Enterprise. Cada função tem uma missão específica, executa seu trabalho com excelência e permite que o programa principal permaneça simples, elegante e focado em coordenar a missão.

Porque, no fim das contas, os melhores sistemas corporativos não são aqueles que possuem mais linhas de código, mas aqueles em que cada componente conhece exatamente seu papel — assim como cada oficial da Frota Estelar conhece sua estação na ponte de comando.


sexta-feira, 2 de março de 2007

O que é o Comando COMPUTE em COBOL?

 

Bellacosa Mainframe e o comando compute no cobol

O que é o Comando COMPUTE em COBOL?

O comando COMPUTE é uma das instruções mais importantes do COBOL para realizar:

  • cálculos matemáticos;

  • fórmulas financeiras;

  • operações aritméticas;

  • expressões complexas.

Ele foi criado para simplificar operações que antes exigiam vários comandos separados.


O que faz o COMPUTE?

O COMPUTE permite:

calcular uma expressão matemática completa em uma única instrução.


Sintaxe básica

COMPUTE resultado = expressão

Exemplo:

COMPUTE WS-TOTAL = WS-VALOR1 + WS-VALOR2

Exemplo simples

Sem COMPUTE:

ADD WS-VALOR1 TO WS-VALOR2 GIVING WS-TOTAL

Com COMPUTE:

COMPUTE WS-TOTAL =
        WS-VALOR1 + WS-VALOR2

Operações suportadas

Soma

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

Subtração

COMPUTE WS-SALDO =
        WS-CREDITO - WS-DEBITO

Multiplicação

COMPUTE WS-TOTAL =
        WS-QUANTIDADE * WS-PRECO

Divisão

COMPUTE WS-MEDIA =
        WS-SOMA / WS-QTD

Potência

COMPUTE WS-RESULTADO =
        WS-VALOR ** 2

Operadores matemáticos

OperadorSignificado
+Soma
-Subtração
*Multiplicação
/Divisão
**Potência

Exemplo de expressão complexa

COMPUTE WS-RESULTADO =
       (WS-A + WS-B)
       * WS-C
       / WS-D

Ordem de precedência

O COBOL segue regras matemáticas normais:

()
**
* /
+ -

Exemplo

COMPUTE WS-TOTAL =
        10 + 20 * 3

Resultado:

70

Porque:

20 * 3 = 60
60 + 10 = 70

Usando parênteses

COMPUTE WS-TOTAL =
       (10 + 20) * 3

Resultado:

90

COMPUTE com valores monetários

Muito comum em sistemas bancários.

COMPUTE WS-JUROS =
        WS-SALDO * WS-TAXA

Exemplo financeiro

COMPUTE WS-VALOR-FINAL =
        WS-VALOR +
        (WS-VALOR * WS-PERCENTUAL / 100)

COMPUTE com COMP-3

Extremamente comum.

01 WS-SALDO      PIC S9(7)V99 COMP-3.
01 WS-JUROS      PIC S9(5)V99 COMP-3.
01 WS-TOTAL      PIC S9(9)V99 COMP-3.

COMPUTE WS-TOTAL =
        WS-SALDO + WS-JUROS

COMPUTE e Funções Intrínsecas

Podem ser usados juntos.

Exemplo:

COMPUTE WS-RAIZ =
        FUNCTION SQRT(625)

Resultado:

25

Exemplo com ABS

COMPUTE WS-VALOR =
        FUNCTION ABS(-500)

Resultado:

500

COMPUTE com CURRENT-DATE

MOVE FUNCTION CURRENT-DATE
     TO WS-DATA

Embora CURRENT-DATE normalmente seja usado com MOVE, ele também pode participar de expressões.


ON SIZE ERROR

Muito importante.

Detecta estouro de campo.

Exemplo:

COMPUTE WS-TOTAL =
        WS-A * WS-B

   ON SIZE ERROR
      DISPLAY 'ERRO DE TAMANHO'
END-COMPUTE

O que é Size Error?

Quando o resultado não cabe no campo.

Exemplo:

Campo:

PIC 9(3)

Máximo:

999

Resultado calculado:

1500

Ocorre:

SIZE ERROR


Exemplo completo

WORKING-STORAGE SECTION.

01 WS-SALARIO      PIC 9(7)V99.
01 WS-BONUS        PIC 9(5)V99.
01 WS-TOTAL        PIC 9(7)V99.

PROCEDURE DIVISION.

    MOVE 5000 TO WS-SALARIO
    MOVE 1000 TO WS-BONUS

    COMPUTE WS-TOTAL =
            WS-SALARIO + WS-BONUS

    DISPLAY WS-TOTAL

    STOP RUN.

Saída:

6000.00

COMPUTE vs ADD

ADD:

ADD A TO B GIVING C

COMPUTE:

COMPUTE C = A + B

COMPUTE vs MULTIPLY

MULTIPLY:

MULTIPLY A BY B GIVING C

COMPUTE:

COMPUTE C = A * B

Vantagens do COMPUTE

Código mais legível

Menos instruções

Expressões complexas

Fácil manutenção

Mais próximo da matemática tradicional


Cuidados

  • Verificar tamanho dos campos.

  • Usar ON SIZE ERROR quando necessário.

  • Atenção com casas decimais.

  • Validar divisões por zero.


Onde o COMPUTE é mais usado?

Praticamente em todos os sistemas COBOL:

  • bancos;

  • cartões;

  • seguros;

  • folha salarial;

  • faturamento;

  • cálculo de juros;

  • cálculo de impostos.


Curiosidade

Antes do COMPUTE, muitos cálculos exigiam combinações de:

ADD
SUBTRACT
MULTIPLY
DIVIDE

O COMPUTE trouxe uma sintaxe muito mais próxima das fórmulas matemáticas tradicionais.


Resumo rápido

ComandoFunção
COMPUTEExecuta cálculos
+Soma
-Subtração
*Multiplicação
/Divisão
**Potência
ON SIZE ERRORTrata estouro
FUNCTIONUsa funções intrínsecas

Conclusão

O comando COMPUTE é a principal instrução de cálculo do COBOL. Ele permite executar operações matemáticas simples ou complexas de forma clara, legível e eficiente, sendo amplamente utilizado em aplicações financeiras e sistemas corporativos executados em mainframes IBM Z.