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 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!