EXERCÍCIO 02: Controle de Fluxo e Loops

[NÍVEL AVANÇADO] Exercícios Complexos de REXX
Domine IF, SELECT e Loops com problemas do mundo real

🔥 DESAFIO 1: Analisador de Logs de Job

rexx
/*
OBJETIVO: Analisar múltiplas linhas de log
SIMULAÇÃO: Você recebe um array com status de jobs
CADA LINHA: "JOBNAME;STARTTIME;ENDTIME;RC"

EXEMPLO:
jobs.1 = "JOB001;08:00;08:05;00"
jobs.2 = "JOB002;08:05;08:07;04"
jobs.3 = "JOB003;08:07;08:10;00"

TAREFAS:
1. Calcular tempo de cada job
2. Identificar jobs com RC ≠ 0
3. Calcular tempo total de processamento
4. Encontrar job mais longo

DICA: Use PARSE para separar por ";"
*/

🔥 DESAFIO 2: Sistema de Menu com Validação

rexx
/*
OBJETIVO: Criar sistema de menu profissional
REQUISITOS:
1. Loop infinito com opção de sair
2. Validação de entrada
3. Submenus
4. Histórico de operações
5. Limpeza de tela entre menus

ESTRUTURA:
MENU PRINCIPAL:
1. Processamento
2. Relatórios
3. Utilitários
4. Sair

SUBMENU Processamento:
1.1 Validar dados
1.2 Importar arquivos
1.3 Voltar

DICA: Use DO FOREVER, SELECT aninhados
*/

🔥 DESAFIO 3: Gerador de Scripts JCL

rexx
/*
OBJETIVO: Gerar JCL dinamicamente
ENTRADA: Parâmetros do job
SAÍDA: Script JCL pronto para usar

PARÂMETROS:
- Nome do job (1-8 chars)
- Programa a executar
- Dataset de entrada
- Dataset de saída
- Região de memória
- Classe

EXEMPLO DE SAÍDA:
//JOB001  JOB ,'DESC',CLASS=A
//STEP1   EXEC PGM=PROGRAM1
//INPUT   DD DSN=USER.DATA.IN
//OUTPUT  DD DSN=USER.DATA.OUT

DICA: Use loops para múltiplos steps
*/

💡 SOLUÇÃO do Desafio 1 (após tentativa):

rexx
/* SOLUCAO_LOGS.rex */
/* Array simulado de jobs */
jobs.1 = "JOB001;08:00;08:05;00"
jobs.2 = "JOB002;08:05;08:07;04"
jobs.3 = "JOB003;08:07;08:10;00"
total_jobs = 3

/* Variáveis de análise */
total_tempo = 0
jobs_com_erro = 0
job_mais_longo = ""
tempo_mais_longo = 0

SAY "=== ANÁLISE DE LOGS DE JOB ==="
SAY ""

DO i = 1 TO total_jobs
  /* Parse para separar campos */
  PARSE VAR jobs.i nome ";" inicio ";" fim ";" rc
  
  /* Calcular tempo (em minutos) */
  PARSE VAR inicio hh_in ":" mm_in
  PARSE VAR fim hh_fim ":" mm_fim
  
  inicio_min = (hh_in * 60) + mm_in
  fim_min = (hh_fim * 60) + mm_fim
  duracao = fim_min - inicio_min
  
  /* Acumular totais */
  total_tempo = total_tempo + duracao
  
  /* Verificar RC */
  IF rc <> "00" THEN DO
    jobs_com_erro = jobs_com_erro + 1
    SAY "ALERTA: Job" nome "falhou com RC =" rc
  END
  
  /* Verificar job mais longo */
  IF duracao > tempo_mais_longo THEN DO
    tempo_mais_longo = duracao
    job_mais_longo = nome
  END
  
  SAY "Job:" nome "- Duração:" duracao "minutos - RC:" rc
END

/* Relatório final */
SAY ""
SAY "=== RELATÓRIO FINAL ==="
SAY "Total de jobs:" total_jobs
SAY "Jobs com erro:" jobs_com_erro
SAY "Tempo total:" total_tempo "minutos"
SAY "Job mais longo:" job_mais_longo "(" tempo_mais_longo "min)"
SAY "Tempo médio:" (total_tempo / total_jobs) "minutos por job"

IF jobs_com_erro > 0 THEN
  SAY "ATENÇÃO: Existem jobs que precisam de análise!"
ELSE
  SAY "SUCESSO: Todos os jobs executaram corretamente!"

📚 RECURSOS ADICIONAIS:

  • Playlist completa do curso: [link]

  • Códigos-fonte: [link para repositório]

  • Comunidade no Discord: [link]

  • Cheat Sheet REXX: [download]

🔔 CHAMADA FINAL:
Inscreva-se no canal para não perder as próximas aulas avançadas sobre:

  • Interação com TSO/ISPF

  • Processamento de arquivos

  • Funções personalizadas

  • Debugging profissional

  • Integração com COBOL e DB2

#REXX #Mainframe #zOS #Programação #Automação #TSO #ISPF #Exercícios #Lógica #Developer

EXERCÍCIO 01: Praticando a Base

 [DESAFIO] Exercícios REXX: Sua Hora de Brilhar!
Consolidando aulas 01-03 com problemas reais do mainframe

🎯 DESAFIO 1: Calculadora de IMC

rexx
/* 
OBJETIVO: Criar calculadora de IMC
ENTRADA: Peso (kg) e Altura (m)
SAÍDA: IMC e classificação

Classificação:
- Abaixo de 18.5: Abaixo do peso
- 18.5 a 24.9: Normal
- 25 a 29.9: Sobrepeso
- Acima de 30: Obesidade

DICA: Use SAY, PULL e IF/ELSE
*/

🎯 DESAFIO 2: Validador de Dataset Name

rexx
/*
OBJETIVO: Validar nomes de dataset
REGRAS:
1. Máximo 44 caracteres
2. Deve começar com letra
3. Partes separadas por ponto
4. Cada parte: 1-8 caracteres
5. Caracteres válidos: A-Z, 0-9, @#$ (apenas no primeiro caractere da parte)

EXEMPLOS VÁLIDOS:
- USER.DATA01
- PROJ#.TEST.COBOL

DICA: Use LENGTH, SUBSTR, DATATYPE
*/

🎯 DESAFIO 3: Formatador de Data Mainframe

rexx
/*
OBJETIVO: Converter data do mainframe
ENTRADA: "DDMMYYYY" (ex: "15032024")
SAÍDA: "15/MAR/2024"

MESES: 01=JAN, 02=FEV, ..., 12=DEZ

EXTRA: Validar se data é válida
- Dia: 01-31
- Mês: 01-12
- Ano: 1900-2100

DICA: Use SUBSTR para separar partes
*/
💡 SOLUÇÃO do Desafio 1 (após tentativa):
rexx
/* SOLUCAO_IMC.rex */
SAY '=== CALCULADORA IMC ==='
SAY 'Digite seu peso (kg):'
PULL peso
SAY 'Digite sua altura (m):'
PULL altura

imc = peso / (altura * altura)
SAY 'Seu IMC é:' FORMAT(imc, , 2)  /* 2 casas decimais */

SELECT
  WHEN imc < 18.5 THEN classificacao = 'Abaixo do peso'
  WHEN imc <= 24.9 THEN classificacao = 'Peso normal'
  WHEN imc <= 29.9 THEN classificacao = 'Sobrepeso'
  OTHERWISE classificacao = 'Obesidade'
END

SAY 'Classificação:' classificacao
SAY '========================'

CTA: 💬 Poste sua solução nos comentários e ajude outros alunos!

Aula 06 – Funções Nativas & Strings

Manipulação de Strings: O Superpoder do REXX!
Funções nativas que transformam dados brutos em informação valiosa

🔤 Funções de String ESSENCIAIS:

rexx
/* LENGTH - Tamanho da string */
nome = "Mainframe"
tamanho = LENGTH(nome)  /* = 9 */

/* SUBSTR - Extrai parte da string */
texto = "REXX é incrível"
parte = SUBSTR(texto, 6, 2)  /* = "é" */

/* INDEX - Encontra posição */
pos = INDEX("Hello World", "World")  /* = 7 */

/* WORDS e WORD - Trabalhando com palavras */
frase = "REXX no mainframe z/OS"
quantas = WORDS(frase)  /* = 4 palavras */
terceira = WORD(frase, 3)  /* = "mainframe" */

🛠️ Kit completo de funções:

rexx
/* CONVERSÕES */
num = "123"
valor = num + 1  /* REXX converte automaticamente! */

/* Maiúsculas/minúsculas */
grande = UPCASE("rexx")  /* = "REXX" */
pequena = LOWER("IBM")   /* = "ibm" */

/* Formatação */
centralizado = CENTER("Título", 20, "-")
/* = "-------Título-------" */

/* Busca e substituição */
novo = CHANGE("Olá Mundo", "Mundo", "Mainframe")
/* = "Olá Mainframe" */

💼 Exemplo REAL no mainframe:

rexx
/* ANALISA_JOB.rex - Analisa saída de job */
saida = "JOB1234 ENDED OK - 00:05:23 EXECUTION" 
/* Suponha que isso veio de um arquivo de log */

/* Extrai informações */
IF POS('ENDED OK', saida) > 0 THEN DO
  /* Encontra tempo de execução */
  pos_inicio = INDEX(saida, '00:')
  tempo = SUBSTR(saida, pos_inicio, 8)
  
  /* Extrai número do job */
  primeiro_espaco = INDEX(saida, ' ')
  job_num = SUBSTR(saida, 1, primeiro_espaco-1)
  
  SAY 'Job' job_num 'concluído com sucesso!'
  SAY 'Tempo de execução:' tempo
END ELSE DO
  SAY 'Job não concluído corretamente'
  SAY 'Status:' WORD(saida, 3)
END

📊 Processando múltiplas linhas:

rexx
/* Processa lista de datasets */
datasets = "USER.DATA.CLIENTES",
           "USER.DATA.VENDAS",
           "USER.DATA.PRODUTOS"

DO i = 1 TO WORDS(datasets)
  dsname = WORD(datasets, i)
  
  /* Extrai último componente */
  ultimo_ponto = LASTPOS('.', dsname)
  tipo = SUBSTR(dsname, ultimo_ponto + 1)
  
  SAY 'Dataset' i ':' tipo '->' dsname
END

🎁 BÔNUS: Funções úteis pouco conhecidas:

rexx
/* SPACE - Controla espaços entre palavras */
compacto = SPACE("REXX    no   mainframe", 1)

/* COPIES - Repete strings */
separador = COPIES('-', 30)  /* 30 traços */

/* DATATYPE - Verifica tipo */
SAY DATATYPE("123")   /* = NUM */
SAY DATATYPE("ABC")   /* = CHAR */
SAY DATATYPE(" ")     /* = BLANK */

CTA: 📚 Material completo com TODAS as funções nos comentários!

Aula 05 – Loops em REXX

Loops REXX: A Arte da Repetição Inteligente
DO, WHILE, FOREVER – Automatize qualquer tarefa repetitiva

➿ Tipos de loops:

  1. DO simples (contador):
rexx
/* Contar de 1 a 10 */
DO i = 1 TO 10
  SAY 'Iteração' i
END
  1. DO WHILE (enquanto verdade):

rexx
/* Loop com condição no início */
contador = 1
DO WHILE contador <= 5
  SAY 'Executando...' contador
  contador = contador + 1
END
  1. DO UNTIL (até que verdade):

rexx
/* Loop com condição no final */
contador = 0
DO UNTIL contador >= 3
  SAY 'Digite um valor (0 para sair):'
  PULL valor
  contador = contador + 1
END
  1. DO FOREVER (infinito com saída controlada):

rexx
/* Menu principal de sistema */
DO FOREVER
  SAY '=== MENU PRINCIPAL ==='
  SAY '1. Processar'
  SAY '2. Relatório'
  SAY '3. Sair'
  PULL opcao
  
  IF opcao = 3 THEN LEAVE  /* Sai do loop */
  
  /* Processa opção */
  SELECT
    WHEN opcao = 1 THEN SAY 'Processando...'
    WHEN opcao = 2 THEN SAY 'Gerando relatório...'
    OTHERWISE SAY 'Opção inválida'
  END
END
SAY 'Programa encerrado.'

🔧 Exemplo prático – Processar arquivo:

rexx
/* Simulando leitura de arquivo */
linhas = 5  /* Suponha que temos 5 linhas */

SAY 'Processando' linhas 'linhas...'
DO i = 1 TO linhas
  SAY 'Processando linha' i
  /* Aqui viria código real de processamento */
  IF i = 3 THEN ITERATE  /* Pula a linha 3 */
  SAY 'Linha' i 'processada com sucesso.'
END
SAY 'Processamento completo!'

⚡ Dicas profissionais:

  • Use LEAVE para sair antecipadamente de um loop

  • Use ITERATE para pular para próxima iteração

  • Evite loops infinitos acidentais

  • Sempre teste condições de saída

CTA: 👉 Agora falta aprender a manipular textos como um expert!

Aula 04 – Controle de Fluxo

IF, SELECT e o Poder das Decisões no REXX
Faça seus scripts “pensarem” e adaptarem-se a qualquer situação

🔄 IF/THEN/ELSE – Decisões simples:

/* Formato básico */
IF condição THEN
instrução
ELSE
outra_instrução

/* Exemplo prático */
SAY 'Qual sua idade?'
PULL idade

IF idade < 0 THEN
SAY 'Idade inválida!'
ELSE IF idade < 18 THEN
SAY 'Você é menor de idade'
ELSE
SAY 'Você é maior de idade'

🎯 SELECT/WHEN – Múltiplas condições:

/* Estrutura SELECT - perfeita para menus */
SAY 'Escolha uma opção:'
SAY '1. Relatório de clientes'
SAY '2. Backup diário'
SAY '3. Limpeza de logs'
PULL opcao

SELECT
WHEN opcao = 1 THEN DO
SAY 'Gerando relatório...'
/* código do relatório */
END
WHEN opcao = 2 THEN
SAY 'Iniciando backup...'
WHEN opcao = 3 THEN
SAY 'Limpando logs...'
OTHERWISE
SAY 'Opção inválida!'
END

💼 Exemplo real – Validação de dados:

/* VALIDA.rex - Validação de entrada */
SAY 'Digite o código do produto (3 letras):'
PULL codigo

SELECT
WHEN LENGTH(codigo) <> 3 THEN
SAY 'ERRO: Código deve ter 3 caracteres'
WHEN DATATYPE(codigo) <> 'CHAR' THEN
SAY 'ERRO: Use apenas letras'
WHEN codigo = 'ABC' THEN
SAY 'Produto: Componente A'
WHEN codigo = 'XYZ' THEN
SAY 'Produto: Componente B'
OTHERWISE
SAY 'Produto desconhecido'
END

CTA: 👉 Na próxima: Aprenda a repetir tarefas com loops poderosos!

Aula 03 – Variáveis, Operadores e SAY/PULL

Variáveis REXX: A Flexibilidade que Você Sempre Quis!
SAY, PULL e operadores – sua base para scripts interativos

🧮 VARIÁVEIS no REXX:

  • Tipagem dinâmica: mesma variável pode ter número ou texto

  • Declaração implícita: basta usar!

  • Nomes: até 250 caracteres, case-sensitive

  • Valores: strings (até 65.535 caracteres)

📊 OPERADORES:

/* Aritméticos: + - * / % // */ resultado = 10 + 5 * 2 /* = 20 */ /* Comparação: = > < >= <= <> */ IF valor > 100 THEN SAY 'Alto' /* Lógicos: & | \ (AND, OR, NOT) */ IF (idade >= 18) & (status = 'A') THEN...

🗣️ INTERAÇÃO com SAY e PULL:

/* SAY - Mostra na tela */ SAY 'Qual seu nome?' PULL nome /* Aguarda entrada */ SAY 'Olá,' nome '! Bem-vindo ao mainframe.' /* PULL múltiplas variáveis */ SAY 'Digite nome e idade:' PULL nome idade SAY nome 'tem' idade 'anos'

Exemplo prático – Calculadora simples:

/* CALC.rex - Calculadora interativa */
SAY '--- Calculadora REXX ---'
SAY 'Digite primeiro número:'
PULL num1
SAY 'Digite segundo número:'
PULL num2
SAY 'Soma:' num1 + num2
SAY 'Subtração:' num1 - num2
SAY 'Multiplicação:' num1 * num2
IF num2 <> 0 THEN SAY 'Divisão:' num1 / num2

CTA: 👉 Agora sim! Prontos para programas que tomam decisões?

 Aula 02 – Ambiente e Estrutura Básica

Hello Mainframe! Seu Primeiro Programa REXX no z/OS
Do TSO à execução: veja onde e como rodar seus scripts REXX

🔧 ONDE rodar REXX:

  • TSO/E (Time Sharing Option) – linha de comando

  • ISPF Editor – criar e executar diretamente

  • Batch (JCL) – para processamentos pesados

  • Ferramentas como REXX Compiler e Debugger

📝 ESTRUTURA BÁSICA de um programa REXX:

  • Comentários: /* */ (primeira linha especial)

  • Case-insensitive: SAY = say = Say

  • Não precisa declarar variáveis!

  • Execução sequencial, linha a linha

🖥️ HANDS-ON: Hello World no Mainframe

/* MEUPRIM.rex - Primeiro programa REXX */
SAY '================================='
SAY ' HELLO MAINFRAME WORLD! '
SAY ' Programa executado em:' DATE()
SAY '================================='
EXIT 0

Passo a passo:

Acesse o TSO

Entre no ISPF (=3.4 para editor)

Digite o programa

Salve como MEUPRIM.REX

Execute com EX ‘MEUPRIM.REX’

CTA: 👉 Na próxima: Vamos aprender a fazer programas que interagem com você!

Aula 01 – Introdução ao REXX

REXX no Mainframe: Sua Ponte para a Automação Inteligente!
Descubra por que esta linguagem amigável é um superpoder no mundo z/OS.

📌 O QUE é REXX?

  • REXX (Restructured Extended Executor): linguagem de scripting poderosa e legível

  • Criada pela IBM nos anos 1970, mas incrivelmente moderna

  • Linguagem interpretada, perfeita para automação rápida

🎯 POR QUE REXX no Mainframe?

  • Nativa do ambiente z/OS (vem “de fábrica”)

  • Sintaxe simples e intuitiva – parecida com inglês do dia a dia

  • Acesso direto a comandos do TSO, ISPF e até do sistema operacional

  • Processamento de strings excepcionalmente poderoso

🚀 PRINCIPAIS USOS no z/OS:

  • Automação de tarefas administrativas

  • Processamento de arquivos (seqüenciais, PDS, VSAM)

  • Geração de relatórios customizados

  • Interface com outras linguagens (COBOL, PL/I)

  • Desenvolvimento de CLISTs mais sofisticados

Exemplo motivador:

/* Exemplo simples - já dá para sentir a simplicidade */
SAY "Olá, Mainframe! Vamos automatizar tudo?"

CTA: 👉 Próxima aula: Vamos colocar a mão na massa e escrever nosso primeiro programa!