Você está na página 1de 57

Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?

id=30923

Já vimos algumas regras de negócio durante nossas práticas. Vamos relembrar um pouco de SQL, PL/SQL e
técnicas de debug.

No final deste módulo você deverá ser capaz de:


Fazer consultas, alterações de dados.
Montar um bloco PL/SQL.
Utilizar técnicas de debug para identificar valores em campos ocultos.
Site: TCU - Tribunal de Contas da União
Curso: Curso Básico de Apex
Livro: Aplicando regras de negócio
Impresso por: WILCIONE SOARES COSTA
Data: sexta, 3 Mai 2019, 13:28

1 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

1 Revisão básica de SQL


1.1 Otimizando o SQL
2 Revisão básica de PL/SQL
3 Técnicas de debug
4 Aplicando as regras de negócio
4.1 Regra de Negócio RN 01
4.2 Regras de Negócio RN 03 e RN 02
4.3 Regra de Negócio RN 04
4.4 Regra de Negócio RN 05
5 Resumo

2 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

SQL (Structured Query Language ou Linguagem de Consulta Estruturada) é a principal linguagem de


pesquisa, utilizada nos mais diversos bancos de dados relacionais. Como o Apex é intrinsicamente ligado ao
banco de dados Oracle, essa é a principal linguagem utilizada para entrarmos em contato com os dados e os
objetos presentes no banco.
Nós consideramos que você já conhece o básico do SQL, em especial do SELECT, INSERT e DELETE.
No Apex, podemos utilizar o SQL de várias formas possíveis, fazendo com que nossas aplicações atinjam um
grau de maturidade inalcançável sem ele. Veremos a seguir algum dos comandos mais utilizados dentro do
Apex.
Para uma referência mais completa sobre SQL, busque na internet SQL Oracle e irá encontrar várias
apostilas (inclusive em português) que vão do básico ao avançado. Ou vá à seção Links úteis da comunidade
Apex do TCU.

Estas funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo.
Cada função aceita um argumento. Esta tabela identifica as opções que você pode usar na sintaxe:

Function Descrição

AVG(expr) Valor médio de expr; ignora valores nulos.

COUNT(expr) ou COUNT(*) COUNT(expr) - Retorna número de linhas, em que expr é avaliado como
um valor diferente de nulo. Count(*) - conta todas as linhas selecionadas,
inclusive valores duplicados e linhas com valores nulos.

MAX(expr) Valor máximo de expr; ignora valores nulos.

MIN(expr) Valor mínimo de expr; ignora valores nulos.

SUM(expr) Valores somados de expr; ignora valores nulos.

Exemplo: O exemplo abaixo mostra os pagamentos médio, máximo e mínimo e a soma dos pagamentos
mensais. Para deixar o exemplo mais claro, iremos alterar o valor pago pelo participante com o COD=4 para
R$ 89,76.

3 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comandos:

O exemplo abaixo mostra o número de linhas da tabela ALUNO:

4 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Com o PL/SQL é possível declarar variáveis e usá-las em outras instruções. As variáveis são usadas para
armazenar dados temporariamente e para manipular estes valores armazenados. Um uso prático dessas
variáveis é ser o retorno de uma função.
Em suma, é a forma mais simples de transferir uma informação vinda de um SELECT no banco para uma
variável programável.
A reusabilidade é outra vantagem da declaração de variáveis. Após a sua declaração, as variáveis podem ser
usadas repetidamente em uma aplicação através de sua referência em instruções.
Exemplo:

A função DECODE implementa a lógica IF-THEN-ELSE dentro de um SELECT. Ou seja, se o campo1 for
igual ao parametro1, então retorna valor1 senão retorna o valor2.
Exemplo: Se o valor do campo IND_SEXO da tabela ALUNO for 'M' então retorne 'Masculino', senão
retorne 'Feminino'.

5 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comando:

O DECODE também pode receber mais que dois parâmetros! Ex.: DECODE(ind_semaforo, 1, 'Verde', 2,
'Amarelo', 3, 'Vermelho', 4, 'Com defeito')

A função Length retorna a quantidade de caracteres de uma string ou de um campo. O tamanho, portanto.
Exemplo: Se precisássemos saber a quantidade de caracteres de cada nome dos alunos cadastrados.

6 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comandos:

Existem algumas funções que são normalmente usadas associadas a LENGTH, como INITCAP, REPLACE,
TRANSLATE, SUBSTR, RTRIM, LTRIM, CONCAT, etc. Para saber mais sobre elas, basta visitar os links
úteis da Comunidade Apex do TCU.

Similar ao DECODE, o CASE também implementa a lógica do IF-THEN-ELSE. Só que em vez de apenas
fazer comparações em grau de igualdade, o CASE também pode verificar se um valor é diferente, igual,
maior, menor, se está ou não numa lista de valores etc.
Exemplo: Imagine que o problema pedisse para classificar o nome dos alunos em relação à quantidade de
letras. Onde o nome com menos de 20 letras é considerado curto, com 20 é médio e com mais de 20 letras é
considerado longo. Para esse tipo de problema, temos o CASE para nos ajudar como no exemplo abaixo.
7 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comando:

Dica: Caso deseje que o texto apresentado no rótulo da coluna seja algo mais significatico do
que "CASEWHENLENGTH(NOME)
<20THEN'NOMECURTO'WHENLENGTH(NOME)=20THEN'NOMEMÉDIO'ELSE'NOMELONGO'END",
utilize um apelido (alias) para a coluna colocando simplesmente o apelido depois da coluna. Veja o exemplo:

8 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comando:

Agora é com você!


1. Execute cada um dos códigos SQL mostrados até agora no SQL Workshop > Comandos SQL.
2. Visite aqui e explore os links úteis de nossa Comunidade de prática relativos a SQL.

9 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Da mesma forma que um bom SQL resolve os principais problemas de sistema e de negócio em uma solução
informatizada, um SQL pouco otimizado leva a um baixo desempenho e, portanto, frustração aos usuários
finais.
Como otimização de SQL seria um curso inteiro, você verá apenas duas das formas de melhorar um SQL.
a. Evite o produto cartesiano
Quando uma condição de join (junção) é inválida ou completamente omitida, o resultado é um produto
cartesiano, no qual todas as combinações de linha são exibidas. Todas as linhas da primeira tabela são unidas
a todas as linhas da segunda tabela.
Um produto cartesiano tende a gerar um grande número de linhas e o resultado raramente é útil. Inclua
sempre uma condição de join válida, a menos que exista uma necessidade específica de combinar todas as
linhas de todas as tabelas.
Exemplo: Um produto cartesiano será gerado se uma condição de join for omitida.

Clicando na aba Explicação veremos o plano de execução, que é a forma que o banco de dados usa para
recuperar as informações

10 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Em destaque vemos a palavra CARTESIAN que indica que aconteceu um produto cartesiano e o Custo que é
o "preço" relativo que o banco de dados cobra para executar esta operação.
Agora com o join correto (evitando o produto cartesiano)

Veremos em seguida a Explicação deste select.

11 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comparando com a Explicação anterior, vemos quer a palavra Cartesian sumiu e que o custo para executar
essa consulta caiu em mais de 70%. Isso aconteceu porque fizemos os joins e estes joins utilizam os índices
da tabela, fazendo com que esta consulta retorne o resultado correto em menos da metade do tempo.
Assim, sempre que um SQL estiver lento, fuja das construções cartesianas!
b. Use índices
Um índice do servidor Oracle é um objeto de esquema que pode acelerar a recuperação de linhas usando um
ponteiro. É possível criar índices de forma explícita ou automática (quando for criada uma chave primária ou
única).
Um índice permite acesso direto e rápido a linhas de uma tabela. Seu objetivo é reduzir a necessidade de I/O
de disco usando um caminho indexado para localizar os dados com rapidez. O servidor Oracle usa e mantém
automaticamente o índice.
Diretrizes para a Criação de um Índice

12 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

c. Outras possibilidades
Uso ineficiente de cursores e do shared pool: A não reutilização de cursores em análises (parses) repetidas. Se
uma variável de bind não for usada então acontecerá um hard parse de todas as instruções SQL. Isto tem um
impacto enorme na performance, sendo totalmente não-escalável. Utilize os cursores com variáveis de bind
que abrem o cursor e o executam várias vezes. Você verá mais sobre cursores na próxima lição.
Código SQL Ruim: É o código que usa mais recursos do que o necessário para os requisitos da aplicação.
Isto pode acontecer numa consulta que roda por horas ou uma consulta em uma aplicação tradicional que
leva mais de 1 minuto. Os SQLs que consomem uma quantidade significativa de recursos devem ser
investigados para que possam ser ajustados.
Varredura Integral (Full-table scan): Varredura total na tabela em operações online podem indicar um
design ineficiente da transação, falta de índices ou otimização ineficiente de SQL.
Grande quantidade de SQL recursivo: grandes quantidades de SQL recursivos podem indicar atividades de
gerenciamento de espaço sendo executado. Isto não é escalável e tem um grande impacto no tempo de
resposta do usuário.
Erros nos schema e problemas no otimizador: Em vários casos, um usuário da aplicação usa muitos
recursos porque o schema proprietário das tabelas não foi migrado com sucesso do ambiente de
desenvolvimento ou da sua versão anterior. Como exemplo, podemos citar a falta de índices ou estatísticas
incorretas. Estes erros podem deixar os planos de execução sem eficiência, com baixa performance para o
usuário.

13 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

PL/SQL é a linguagem estruturada da Oracle, utilizada para desenvolver operações e procedimentos que
seriam impossíveis de serem implementados utilizando apenas SQL. Dentro do PL/SQL temos criação de
variáveis, estruturas de decisão e repetição. Com esse conjunto de ferramentas, poderemos criar nossos
processos, filtros e cálculos dentro do Apex.
Agora veremos alguns dos principais tópicos do PL/SQL.

A estrutura básica de um bloco PL/SQL está dividida em três sessões:

Sessão Descrição Inclusão

Declarativa Contém as declarações de todas as variáveis, constantes, cursores e Opcional


(DECLARE) exceções definidas pelo usuário que serão referenciadas na sessão
executável e na sessão de exceção.

Executável (BEGIN Contém instruções SQL para retornar dados do banco de dados; Obrigatório
… END) contém instruções PL/SQL para manipular dados em um bloco.

Exceção Especifica as ações que serão executadas quando acontecerem erros e Opcional
(EXCEPTION) condições anormais na sessão executável.

Em um bloco PL/SQL as palavras-chave DECLARE, BEGIN e EXCEPTION não são terminadas com um
ponto e vírgula [;]. Contudo a palavra-chave END, todas as instruções SQL e PL/SQL devem terminar com
um ponto e vírgula [;].
Exemplo: Abaixo temos o exemplo da estrutura de um bloco anônimo, procedure e função.

Bloco anônimo – Deve ser utilizado em rotinas pontuais, que são executadas para atender uma demanda
específica, como um processo, uma migração de dados ou correção dos mesmos, por exemplo.
Procedure – É um procedimento que fica armazenado no banco de dados. Com isso a sua reutilização pode
ser facilmente feita, uma vez em que podemos colocar apenas o nome da procedure no nosso código PL/SQL
e passar os parâmetros necessários para que a execução aconteça. Quanto aos parâmetros, as procedures
podem receber ou não parâmetros de entrada e de saída, o que pode fazer com que ela tenha zero ou mais
retornos de dados.
Ex: No procedimento abaixo, iremos atualizar todos os currículos dos professores com a frase 'Sem currículo
cadastrado' quando os professores não tiverem nada cadastrado neste campo.

14 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Function – É uma função que fica armazenada no banco de dados e tem como objetivo retornar
obrigatoriamente um valor, possuindo ou não parâmetros de entrada. Para utilizar uma função, podemos
colocar uma variável recebendo o retorno desta ou usá-la diretamente dentro da nossa expressão SQL.
Ex: A função abaixo retorna a quantidade de alunos de uma determinada turma, que é passada através de um
parâmetro de entrada

Resumidamente, Packages são procedures e functions de banco empacotadas por assunto, facilitando assim a
organização dos códigos PL/SQL. Ela é composta pela PACKAGE (área responsável pela interface da
package com os códigos PL/SQL, armazenando aqui além do cabeçalho dos procedimentos e funções,
declaração de variáveis que serão visíveis a todas as partes da package) e o PACKAGE BODY (que como o
nome sugere, é o corpo da package, local onde constam todos os códigos das funções e procedimentos).
Vantagens do uso de Packages
Modularidade e Facilidade de Manutenção: através do encapsulamento das estruturas relacionadas num
módulo nomeado. Cada package deve ser fácil de entender e a interface entre packages deve ser simples,
clara e bem definida.
Design de aplicação fácil: A codificação e a compilação da especificação e do corpo da package podem ser
feitas separadamente.
Melhor performance: Na primeira chamada de um subprograma dentro de uma package, toda a package é
carregada na memória. Após isto, todas as chamadas aos subprogramas de uma package não vão precisar de
15 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923
I/O de disco. Apenas uma cópia da package em memória é necessária para todos os usuários.
Exemplo: Abaixo temos um exemplo de package.

Quando você for referenciar a package em um SQL ou processo, use professores_pck.atualiza_curriculo ou


professores_pck.retorna_qt_professores.

A forma mais simples de fazer uma estrutura de LOOP é o loop infinito, que engloba uma seqüência de
instruções entre as palavras-chave LOOP e END LOOP. A cada vez que o fluxo de execução atinge a
instrução END LOOP o controle é retornado para a instrução LOOP correspondente.
Exemplo: O exemplo abaixo insere 5 alunos na turma 1.

16 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comandos:

17 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Note que no trecho:

O valor correspondente ao campo cod_turma está fixo em 1. Isso pode causar problemas dependendo dos
valores que compõem a sequência de chaves primárias na sua tabela TURMA. Para verificar isso, vá em SQL
Workshop > Browser de Objetos e selecione a tabela TURMA. Acesse a aba Dados para verificar as
informações contidas na tabela, e caso seja necessário, ajuste o código do exemplo para que o campo
cod_turma possua um valor existente na coluna cod dentro da tabela TURMA.

Os loops FOR têm a mesma estrutura geral de um loop básico. Além disso, o FOR possui uma instrução de
controle antes da palavra-chave LOOP para definir o número de iterações (repetições) que o PL/SQL irá
executar.
Exemplo: O exemplo abaixo insere os alunos com COD_ALUNO maiores de 12 na turma 2.

18 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Comandos:

Atente-se novamente para o mesmo possível erro que foi descrito no item anterior. Observe que dessa vez
tanto o campo cod_aluno quanto o cod_turma podem dar problemas dependendo da sequência, portanto
verifique os valores no browser de objetos e ajuste o V_COD e o campo cod_turma de acordo.

19 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Da mesma maneira que o SELECT INTO permite transferir um dado das tabelas do banco para uma variável,
o cursor permite transferir muitos dados ao mesmo tempo para manipulação programática.
Um cursor nada mais é que um ponteiro para uma área de memória alocada no servidor Oracle. Pode ser
implícito (criados e gerenciados pelo servidor Oracle) ou explícito (declarado explicitamente pelo
programador).
O servidor Oracle aloca uma área de memória privada chamada de “Área de Contexto” para processamento
de instruções SQL. As instruções são analisadas (parse) e processadas nesta área. As informações necessárias
para o processamento e as informações retornadas após o processamento são todas armazenadas nesta área.
Exemplo: O exemplo abaixo extrai as colunas da tabela ALUNO e as coloca num cursor chamado
ALUNO_REC.
OBS: O atributo %ROWTYPE especifica um tipo de registro que representa uma linha em uma tabela.

Comandos:

20 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Agora é com você!


Você viu muitos conceitos de PL/SQL. Será que no mundo real do Apex haveria necessidade de saber tanto?
Normalmente, não há necessidade do PL/SQL. O Apex é uma ferramenta de desenvolvimento rápido, certo?
Para construir algumas regras de negócio de cálculos, navegação e relatórios mais sofisticados, um pouco de
PL/SQL será importante.
E há os casos mais complexos mesmo, que só o PL/SQL dá jeito.

21 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

O que são as técnicas de debug e para o que servem?


Sabe quando tudo parece estar correto e você não consegue entender porque a sua página ou sua rotina não
está fazendo o que deveria fazer? Sempre que se deparar com esse tipo de situação, procure uma técnica de
debug. Em geral elas expõem informações que normalmente são ocultadas para que o processamento seja
algo mais transparente para o usuário. Neste módulo veremos algumas delas.

Bind variable ( :Pn_ITEM )


Quando as variáveis de bind são usadas em uma instrução, o otimizador do Oracle assume que o
compartilhamento de cursores (cursor sharing) será utilizado e que as diversas chamadas a esta instrução
devem usar o mesmo plano de execução.
O uso de variáveis de bind constitui numa boa prática que traz benefícios para a chamada de SQLs idênticos.
Pois, caso a instrução não seja encontrada em memória, será necessário fazer um novo parse desta instrução.
Exemplo: Caso dependamos da interação do usuário com a aplicação para informar um aluno em especial,
como resolver? Este é um caso típico para Bind Variable.
Faça o select de teste nos Comandos SQL do SQL Workshop.

Onde :cod_aluno (bind variable) significa que esse valor será informado pelo usuário.
Quando o select estiver funcionando bem nos testes, já pode ser adaptado para gerar relatórios, gráficos, etc,
só que utilizando os valores dos itens da tela.
Assim, o select mudaria para:

Nesta parte apresentaremos três formas diferentes de ver o valor de um campo oculto. Isso pode ser útil no
caso de uma tela que passe parâmetro para outra e por algum motivo o parâmetro não está sendo encontrado.
A primeira técnica é a sessão.
Passo 1 - Clique no link Sessão na parte inferior da tela.

22 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 2 – Observe na janela mostrada que o valor dos campos já populados são mostrados, mesmo no caso de
itens ocultos.

23 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

A segunda técnica apresentada é a exibição do campo oculto.


Passo 1 – Localize o campo oculto, neste caso o P3_COD, e altere a propriedade Exibir Como dele para
Campo de Texto.

24 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 2 – Execute a página e veja que o campo agora aparece na tela, dando o exato valor do mesmo.

25 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 3 – Ao final desta técnica retorne ao campo e o altere para Oculto e Protegido, para evitar que o usuário
altere o mesmo.

26 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Agora imagine outro problema comum: uma ação que deveria acontecer em certo momento, está acontecendo
antes ou depois do momento desejado. Como saber e como resolver?
Serão demonstradas duas técnicas, e a primeira é a depuração.
Passo 1 – Clique no link Depurar para que a tela seja recarregada exibindo todos os processos executados
décimo a décimo de segundo.

27 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 2 – Clique no link Exibir Depuração para abrir exibir a depuração da página.

28 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 3 – Clique no Identificador referente a sua sessão para exibir a depuração daquela sessão.

29 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 4 – Analise as informações mostradas pelo debug. Com essas informações pode ser mais fácil descobrir
o que está acontecendo.

30 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

A outra técnica é na edição da página, alterar a lista de Renderização. Ao invés de escolher "Agrupar por Tipo
de Componente", marque "Agrupar por Ordem de Renderização". Com isso o Apex mostra todos os eventos
da página e sua ordem de execução. Caso deseje alterar a ordem de processamento, clique no item desejado e
altere o valor da Sequência. Os eventos respeitam a ordem desta sequência.

31 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Sempre que possível, evite programar em PL/SQL se o Apex puder fazer o trabalho por você. Mas se for
inevitável, como depurar um código mais complexo em PL/SQL, como uma função ou procedimento?
Inclua o seu código no SQL Workshop > Browser de Objetos > Funções (ou Procedimentos) e clique em
Salvar e Compilar. Os eventuais erros aparecerão em destaque. O número com a linha do erro fica clicável,
destacando a linha problemática diretamente no código.

32 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

33 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Neste momento, muito da nossa aplicação Minha Escola já está pronta. Logo, devemos voltar ao nosso
problema e verificar se todas as regras do negócio já foram atendidas. Retornando ao DGA ou à lição 2.1,
veremos as seguintes regras de negócio:
RN 01: Toda turma tem um ou mais professores, uma sala de aula, e vários alunos.
RN 02: As notas são classificadas de 0 (sem rendimento) a 10 (excelente rendimento).
RN 03: O aluno só pode entrar em uma turma que possua vagas.
RN 04: Todos os alunos têm nota em cada uma das turmas que participa.
RN 05: Todos os valores monetários são em reais (R$), podendo eventualmente ser gratuitos.

Vamos agora entender as regras de negócio. Para isso, o ideal é pegar apenas uma regra por vez e tentar
desmembrá-las no menor tamanho possível. Faremos isso agora, regra por regra.

34 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Toda turma tem um ou mais professores, uma sala de aula, e vários alunos
Olhando no nosso modelo de dados, podemos identificar que essa regra atinge as tabelas TURMA,
PROFESSOR_TURMA e PARTICIPANTE_TURMA.
a. Primeira parte
Para checar se todas as condições já foram atendidas no momento da criação do nosso modelo, vamos testar a
primeira parte da regra, “Toda a turma tem um ou mais professores”.

Reparando na imagem acima (estrutura da tabela PROFESSOR_TURMA), vemos que os campos


COD_PROFESSOR e COD_TURMA estão como campos de preenchimento obrigatório. Com isso temos
garantido (pelas constraints) que cada turma tem no mínimo um professor o que já nos possibilita dizer que
essa primeira parte da regra está atendida. Caso haja mais de um professor para esta turma, teremos mais um
registro na tabela repetindo o código da turma e alterando o do professor.
b. Segunda parte

35 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923
A segunda parte da regra de negócio 1 diz que toda turma tem que ter uma sala.

Como podemos observar, o campo SALA da tabela TURMA aceita valor nulo, o que contradiz a nossa regra
de negócio. Para atendê-la, iremos alterar a tabela, impossibilitando assim a presença de valores nulos.
Passo 1 – Entre no Browser de Objetos e escolha a tabela TURMA. Em seguida clique no botão Modificar
Coluna. Agora altere a Coluna para SALA (VARCHAR2) e o campo Anulável para NOT NULL (requer um
valor).

36 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 2 – Clique no botão Próximo > em seguida finalize clicando no botão Finalizar. Com isso você verá
que a nova estrutura da tabela ficará como mostrada na imagem abaixo.

37 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Agora é sua vez!


Agora implemente esta alteração no banco e onde couber no DGA do MinhaEscola.

A última parte da regra diz que a turma deve ter vários alunos. Para isso checaremos a estrutura da tabela
PARTICIPANTE_TURMA e verificaremos se a coluna COD_ALUNO é de preenchimento obrigatório ou
não.

38 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Como vimos, todas as regras citadas na RN 01 estão atendidas!

39 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

O aluno só pode entrar em uma turma que possua vagas.


Essa, sem dúvida, é a regra mais complexa deste sistema. Aproveitando a complexidade moderada desta
regra, introduziremos mais de uma forma de resolver o problema, tentando sempre ampliar o seu
conhecimento.
Repare também que não estamos seguindo na ordem das regras de negócio conforme estão no DGA do Minha
Escola. Isso se dá pelo fato que para aplicar o RN 02 (As notas são classificadas de 0 a 10), é necessário que
as páginas “Relatório de Participantes nas Turmas” e “Cadastro de Participantes nas Turmas” sejam criadas,
ambas associadas com a tabela PARTICIPANTE_TURMA que é quem possui o campo Nota.
Para facilitar a compreensão da solução, iremos subdividir esta regra em problemas menores. O problema é:
qual a capacidade de alunos em uma determinada turma?

Passo 1a – A primeira coisa que faremos será utilizar o wizard do APEX para criar o nosso Form e o Report.
Clique em Criar Página . Em seguida clique em Form.

Passo 2a – No próximo passo, clique em Relatório com Form em Tabela.

40 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 3a – Preencha como a imagem abaixo e clique em Próximo , conforme a imagem abaixo. Os números
da páginas podem variar de acordo com a sua aplicação.

41 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 4a – Crie uma nova entrada do menu de navegação, selecione "Turmas Com Vagas" e clique em
Próximo .

42 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 5a – Nas Colunas do Relatório, apenas clique em Próximo .

43 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 6a – Nas opções da Página de Form, defina os itens como na imagem abaixo e clique em Criar.

44 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923
Passo 7a – Execute a página e observe o relátorio. Meio difícil dizer qual é o aluno que está em qual turma,
não? Vamos melhorar este relatório na próxima etapa.

Passo 1b - Antes de melhorar nosso relatório iremos adicionar alguns componentes a nossa aplicação. Clique
em "Componentes Compartilhados". E em seguida em "Lista de Valores" em Outros Componentes.

Passo 2b - Na sua Lista de Valores clique em "Criar".

Passo 3b - Crie o seguinte item como na imagem abaixo. O

45 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923
nome PX_PARTICIPANTE_TURMA_NOME_ALUNO, onde X corresponde ao número da sua página,
pode variar.

Passo 4b - Crie outro item com os dados que estão listados na imagem. Preste atenção no nome doo item que
pode variar de acordo com o número da sua página.

Passo 5b – Pronto, agora iremos melhorar o nosso relatório! Retorne ao Designer de Página. A antiga
Consulta SQL não estava funcional para o nosso exemplo. Substitua por uma que faça mais sentido
visualizarmos o relatório. Não se esqueça de modificar a Coluna "COD" para o Tipo "Coluna Oculta".

46 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 6b – No Designer de Página para alterar os itens da página “Cadastro de Participantes nas Turmas” e
mude as Definições do item PX_COD_ALUNO como na imagem abaixo. No item Lista de Valores,
selecione o item que criamos anteriormente "P13_PATICIPANTE_TURMA_NOME_ALUNO".

47 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 7b – No Designer de Página para alterar os itens da página “Cadastro de Participantes nas Turmas” e
mude as Definições do item PX_COD_TURMA para "Redirect and Set Value". No item Lista de Valores,
selecione o item que criamos anteriormente "P13_PATICIPANTE_TURMA_COD_TURMA".

48 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 8b – Aproveite para mudar as Definições de validação do item PX_NOTA, aplicando a RN 02 que
diz: As notas são classificadas de 0 (sem rendimento) a 10 (excelente rendimento).
Para isso altere o para que só aceitem valores entre 0 e 10, conforme a imagem abaixo.

Passo 9b – Agora iremos criar um novo Item de Página. Clique com o botão direito sobre Cadastro de
Participantes da Turma e clique em "Criar Item de Página", como mostra a imagem abaixo.

49 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 10b - Renomeie o item para PX_LIMITE_MAXIMO_TURMA e mude o seu Tipo para "Somente
Exibição". Defina o seu Label como "Total de Vagas".

Passo 11b - Na parte de Origem do item, selecione Consulta SQL (retornar valor único) e coloque como
Consulta SQL a seguinte expressão:

Passo 12b – Crie um novo item de página, coloque seu Nome como P1X_QT_ALUNOS_TURMA, selecione
o seu Tipo como Somente Exibição e defina o Label como "Alunos Matriculados".

50 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Na parte de Origem do item, selecione Consulta SQL (retornar valor único) e coloque como Consulta SQL a
seguinte expressão:

Passo 13b - Execute a página e selecione uma das turmas cadastradas. A sua aplicação agora deverá exibir o
Total de Vagas naquela turma e a quantidade de Alunos Matriculados.

Com isso já resolvemos a primeira parte do problema, possuímos um item que exibe a capacidade máxima da
turma e outro item que exibe a quantidade de alunos matriculados naquela turma.

Ok, já sabemos qual é o limite máximo de alunos e quantos temos na turma, mas como fazer que o Apex,
munido destas informações, bloqueie a tentativa de inserção de um aluno além do limite da turma? Essa é
nossa meta principal.
Resolução
Passo 1c – Volte ao Designer de Página e clique em Processamento. Dentro de Processos, clique com o botão
direito e clique em "Criar Processo", conforme imagem abaixo.
51 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 2c – Renomeie o processo para "validar matricula", selecione o seu Tipo como "Código PL/SQL" e na
Origem do Código PL/SQL escreva o seguinte código:

Passo 3c – Execute a página e tente matricular um aluno em uma turma diferente. Parabéns!

52 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Pronto! Todas as perguntas referentes a essa regra de negócio foram respondidas.


Assim fechamos a regra de negócio RN 03!

53 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Todos os alunos têm nota em cada uma das turmas que participa
Para ver se esta regra já está ou não atendida, devemos checar se o campo NOTA aceita ou não valores nulos.
Primeiramente, vamos acessar a tabela para ver se o campo é anulável. Se for, vamos implementar uma
validação que impeça isso.
Resolução
Passo 1 – Acessando o Browser de Objetos, clicando sobre a tabela PARTICIPANTE_TURMA veremos na
estrutura da tabela que o campo NOTA aceita valores nulos. Poderíamos criar uma validação e alterar a tabela
como fizemos na RN1, mas para vamos apenas criar a validação.
A rigor, o correto é alterar também a tabela! Vamos alterar a tabela e não se esqueça de alterar o que for
necessário no DGA.

Clique em Modificar Coluna e altere a Coluna "NOTA" o atributo Anulável como "NOT NULL".

Passo 2 – Voltando para a Aplicação MinhaEscola v1 e entrando na Página 14, altere os atributos do campo
P14_NOTA. Nas Definições, defina o Valor Mínimo como 0 (zero) e o Valor Máximo como 10 (dez). E na
Validação, defina como Valor Necessário "Sim".

54 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Passo 3 – Execute essa página, preencha os dados deixando a Nota Final nula. Ao se clicar em Criar, a
mensagem de erro será exibida informando que “Preencha este campo.".

Com isso fechamos a regra de negócio RN4!

55 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

Todos os valores monetários são em reais (R$) e podem ser zero


Além de contextualizar os dados, garantindo que todos os valores mostrados pelo sistema são em reais, há
também a restrição de que o valor pode ser zero.
Pergunta: há algo mais a fazer em relação a esta regra de negócio?

56 of 57 03/05/2019 13:28
Aplicando regras de negócio https://contas.tcu.gov.br/ead/mod/book/tool/print/index.php?id=30923

- O que é SQL e seus principais comandos;


- O que é PL/SQL e suas principais estruturas;
- Algumas técnicas de debug;
- Como implementar todas as regras de negócio.

57 of 57 03/05/2019 13:28

Você também pode gostar