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

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!