Sistema de gestão de academia (alunos, exercícios, modelos de treino e ficha de treino) escrito em ABAP, no padrão de um desenvolvimento Z de projeto SAP: dicionário de dados próprio, classes de negócio orientadas a objeto, classe de mensagens, relatórios ALV, CDS views, transações e testes unitários.
O projeto nasceu como um sistema de terminal em Python e foi reescrito para o ecossistema SAP. Está no formato abapGit, então pode ser importado direto em um sistema SAP.
| Transação | Programa | O que faz |
|---|---|---|
ZACAD01 |
ZACAD_MANUT_ALUNO |
Criar, modificar, exibir e inativar alunos |
ZACAD02 |
ZACAD_MANUT_EXERCICIO |
Cadastro mestre de exercícios + lista ALV |
ZACAD03 |
ZACAD_MANUT_TREINO |
Modelos de treino: cabeçalho e itens (exercícios, séries, repetições) |
ZACAD04 |
ZACAD_ATRIBUIR_TREINO |
Atribui um treino ao aluno com data de início de vigência |
ZACAD05 |
ZACAD_REL_ALUNOS |
Relatório ALV com idade, IMC colorido e treino vigente; duplo clique abre a ficha |
ZACAD06 |
ZACAD_FICHA_TREINO |
Ficha de treino do aluno em uma data (ALV com cabeçalho) |
| SE38 | ZACAD_CARGA_DEMO |
Carrega dados de exemplo: 20 exercícios, 3 treinos, 5 alunos |
erDiagram
ZACAD_ALUNO ||--o{ ZACAD_ALUNO_TR : "tem vigências"
ZACAD_TREINO_H ||--o{ ZACAD_ALUNO_TR : "é atribuído em"
ZACAD_TREINO_H ||--|{ ZACAD_TREINO_I : "possui itens"
ZACAD_EXERC ||--o{ ZACAD_TREINO_I : "é usado em"
ZACAD_ALUNO {
NUMC8 MATRICULA PK
CHAR60 NOME
DATS DATA_NASC
CHAR1 SEXO "M/F (domínio)"
DEC5_2 PESO
DEC3_2 ALTURA
CHAR1 OBJETIVO "F/H/E/C (domínio)"
CHAR1 STATUS "A/I (domínio)"
}
ZACAD_EXERC {
NUMC6 EXERC_ID PK
CHAR60 NOME
CHAR10 GRUPO_MUSC "domínio"
}
ZACAD_TREINO_H {
NUMC6 TREINO_ID PK
CHAR60 NOME
CHAR1 OBJETIVO
}
ZACAD_TREINO_I {
NUMC6 TREINO_ID PK
NUMC3 POSNR PK "10, 20, 30..."
NUMC6 EXERC_ID FK
NUMC2 SERIES
CHAR10 REPETICOES
NUMC3 DESCANSO
}
ZACAD_ALUNO_TR {
NUMC8 MATRICULA PK
DATS BEGDA PK
DATS ENDDA
NUMC6 TREINO_ID FK
}
Todas as tabelas são dependentes de mandante (MANDT) e têm campos de auditoria (CRIADO_EM, CRIADO_POR, MODIF_EM, MODIF_POR). A atribuição de treino usa vigência por data (BEGDA/ENDDA, com fim aberto em 99991231), o mesmo conceito dos infotipos de HCM. Uma nova atribuição encerra a anterior, sem sobreposição de períodos.
Programas (ZACAD_*) tela de seleção, eventos, ALV, COMMIT/ROLLBACK
│ chamam
▼
Classes de negócio ZCL_ACAD_ALUNO · ZCL_ACAD_EXERCICIO · ZCL_ACAD_TREINO
│ validações, numeração, integridade, sem COMMIT
│ usam
├── ZCL_ACAD_DOMINIO valida valores fixos de domínio via RTTI
├── ZCL_ACAD_ALV fábrica de CL_SALV_TABLE padronizado
├── ZCL_ACAD_F4 ajudas de pesquisa (F4IF_INT_TABLE_VALUE_REQUEST)
└── ZCX_ACAD_ERROR exceção baseada na classe de mensagens ZACADEMIA
▼
Tabelas Z + CDS views ZACAD_I_TREINOVIGENTE → ZACAD_I_ALUNOTREINO
- Regra de negócio fora da tela: os programas só cuidam de interface. Toda validação está nas classes, o que permite testá-las com ABAP Unit.
- Controle de LUW pelo chamador: as classes nunca fazem
COMMIT WORK. O programa confirma ou desfaz a transação inteira. - Mensagens SAP: todo erro é uma mensagem da classe
ZACADEMIA(SE91), lançada comRAISE EXCEPTION ... MESSAGEe exibida comMESSAGE lx_erro.
- Dicionário ABAP (SE11): tabelas transparentes, elementos de dados, domínios com valores fixos e com minúsculas
- Classe de mensagens (SE91) e exceção com
IF_T100_DYN_MSG - ABAP OO: classes globais, classes locais nos programas, eventos (
FOR EVENT double_click) - ABAP moderno (7.40+):
VALUE,COND,FOR ... IN,LET,NEW,CONV, declarações inline, string templates, Open SQL com@ - Tela de seleção: radio buttons com
USER-COMMAND,MODIF ID,LOOP AT SCREEN, listbox,SELECT-OPTIONS, F4 próprio - ALV com
CL_SALV_TABLE: cores por célula, títulos de coluna, layout salvo, cabeçalho (CL_SALV_FORM_LAYOUT_GRID), duplo clique comSUBMIT ... AND RETURN - CDS view entities com variável de sessão (
$session.system_date) eLEFT OUTER JOIN - Lista clássica (
WRITE,FORMAT COLOR) na exibição do aluno -
POPUP_TO_CONFIRMantes de ações destrutivas - ABAP Unit com OSQL Test Double Framework (
CL_OSQL_TEST_ENVIRONMENT): os testes não tocam o banco real - Itens numerados de 10 em 10 (
POSNR), como em documentos SD/MM - Integridade referencial em código: não exclui exercício em uso nem treino vigente
- Transações (SE93) e pacote versionados com abapGit
- CI com abaplint no GitHub Actions
| Versão Python | Versão SAP ABAP |
|---|---|
Menus no terminal com input() |
Transações ZACAD01…ZACAD06 com tela de seleção |
Arquivos alunos.json, exercicios.json, modelos.json |
Tabelas transparentes ZACAD_* |
Login com usuário e senha em administrador.csv (texto puro) |
Login e autorização do próprio SAP (SU01 / PFCG / S_TCODE) |
"tipo" do exercício em texto livre |
Domínio ZACAD_D_GRUPO_MUSC com valores fixos |
| Objetivo e sexo como texto | Domínios com valores fixos + listbox na tela |
Matrícula 1000 + len(alunos) |
Próxima matrícula a partir do maior número gravado no banco |
Pastas dados/ × caminhos data/ no código (arquivos nunca encontrados) |
Acesso ao banco via Open SQL, sem caminhos de arquivo |
| Exercícios copiados dentro do treino | Itens referenciando o cadastro mestre (EXERC_ID) |
| "Atribuir treino ao aluno" em desenvolvimento | Implementado com vigência por data e histórico |
print() de listas |
ALV com filtro, ordenação, exportação para Excel e layouts |
| Sem testes | ABAP Unit com test doubles + abaplint no CI |
Requisitos: SAP NetWeaver / ABAP Platform 7.55 ou superior (S/4HANA 2020+), por causa das CDS view entities. O ABAP Platform Trial (Docker, gratuito) atende.
- Instale o abapGit no sistema (programa
ZABAPGIT_STANDALONE). - Crie o pacote
ZACADEMIAna SE80/SE21 (ou deixe o abapGit criar). - No abapGit: New Online → URL
https://github.com/Efraimelm/academia→ pacoteZACADEMIA→ Pull. - Ative os objetos que ficarem inativos (o abapGit mostra a lista).
- Rode
ZACAD_CARGA_DEMOna SE38 para ter dados de exemplo.
O idioma original dos objetos é português (P). Se o seu sistema não tiver PT instalado, faça logon em PT ou altere
MASTER_LANGUAGEno.abapgit.xmlantes do pull.
- SE38 →
ZACAD_CARGA_DEMO: carrega exercícios, treinos e alunos. ZACAD05: lista os alunos com IMC colorido (verde = normal, amarelo = atenção, vermelho = obesidade).- Duplo clique em um aluno: abre a ficha de treino (
ZACAD06) com os exercícios do treino vigente. ZACAD03: crie um treino, inclua exercícios (F4 no campo do exercício) e veja os itens 010, 020, 030…ZACAD04: atribua o novo treino a um aluno. NaZACAD05, ele aparece como vigente.ZACAD01→ Inativar: o aluno some do relatório padrão (filtro de status) e a vigência é encerrada.
Os testes unitários estão em ZCL_ACAD_ALUNO e ZCL_ACAD_TREINO (aba Test Classes / arquivos *.testclasses.abap). Para rodar: SE24/SE80 → Testar → Teste unitário (Ctrl+Shift+F10) ou, no Eclipse ADT, Ctrl+Shift+F10.
O que é coberto: cálculo e classificação de IMC, idade, validações de cadastro, geração de matrícula, nome duplicado, inativação, numeração de itens, exercício repetido no treino, troca de vigência e bloqueio de exclusão de treino em uso.
A verificação estática roda a cada push pelo GitHub Actions. Para rodar localmente:
npx @abaplint/cli abaplint.json- Intervalo de numeração (SNRO) e objeto de bloqueio (
ENQUEUE_EZACAD_ALUNO) para concorrência - Objeto de autorização próprio (
ZACAD_ACT) comAUTHORITY-CHECKpor atividade - Versão RAP (RESTful ABAP Programming) com app Fiori Elements sobre as mesmas tabelas
- Ajudas de pesquisa (SE11) no lugar do F4 programado