Tutorial: Mestre/Detalhe

Uma interface de mestre-detalhe exibe um registro principal e os detalhes para o item atualmente selecionado. O mestre pode ser um formulário, lista ou árvore de itens, e o detalhe pode ser um formulário, lista ou árvore de itens tipicamente colocados abaixo ou ao lado da área do mestre.

A relação de mestre-detalhe pode ser do tipo um-para-muitos (1-N). Exemplos de uma relação mestre-detalhe são:

  • Um conjunto de ordens de compra e um conjunto de itens de linha pertencentes a cada ordem de compra
  • Um relatório de despesas com um conjunto de itens referente a cada despesa
  • Um relatório de departamentos exibindo a lista de funcionários que pertencem a ele

Um outro exemplo do conceito de mestre-detalhe pode ser aplicado para permitir que os usuários naveguem através dos dados de pedidos de compra e assim ver os dados dos itens detalhadamente.

Exemplo Mestre/Detalhe em PHP

Neste exemplo será desenvolvido uma aplicação Mestre/Detalhe completa, onde obteremos um formulário de edição dos pedidos de uma compra e também dos itens daquele pedido.

Mestre Detalhe completa

Para construir esta aplicação serão criados dois formulários. O primeiro baseado na tabela orders, que será nossa aplicação Mestre, e o segundo formulário será baseado na tabela orders_details que fará o papel de aplicação Detalhe.

Criando o formulário Mestre

1. Crie uma nova aplicação do tipo formulário simples baseado na tabela orders.

2. No menu de aplicação acesse o item Posicionamento dos Campos.

3. Remova os seguintes campos: ShipVia, ShipRegion e ShipPostalCode

4. No menu de aplicação acesse a pasta Layout e clique no item Blocos.

5. Altere o nome e o label do bloco existente para General Info

6. Clique no botão Criar Novo Bloco.

7. Informe para as propriedades Nome e Label o valor Ship Info

8. Clique novamente no botão Criar Novo Bloco.

9. Informe para as propriedades Nome e Label o valor Order Details.

10. Edite as propriedades dos blocos criados de acordo com a imagem exibida abaixo:

11. No menu de aplicação acesse o item Editar Campos e organize os campos de acordo com a tabela abaixo:

BlocoField
General InfoOrderID
CustomerID
EmplyeeID
OrderDate
RequiredDate
PriceOrder
Ship InfoShippedDate
ShipAdress
Freight
ShipCity
ShipState
ShipCountry
Order Details 

Criando o formulário detalhe

12. Crie uma novo formulário do tipo Grid Editável view baseada na tabela order_details.

13. Gere o código fonte do formulário detalhe. Para isto clique no botão Gerar Código Fonte na barra de ferramentas do ScriptCase.

Criando a ligação entre o formulário Mestre e o Detalhe.

1. Volte para a edição do formulário Mestre clicando sobre a aba de aplicações

2. No menu de aplicação acesse a pasta Mestre/Detalhes e clique no item Novo Mestre/Detalhe

3. Nas propriedades Nome e Label informe Details.

4.Escolha a aplicação de destino e clique em avançar

5. Na próxima etapa do wizard faça a ligação relacionando os campos OrderID dos dois formulários. Para finalizar clique no botão Salvar.

Pronto, o formulário Mestre/Detalhe já está criado, mas agora vamos customizar os campos e criar regras de validação para a aplicação.

Customizando os Campos dos Formulários

1. Ainda na aplicação Detalhe, clique no item Posicionamento dos Campos no menu.

2. Remova os campos OrderDetailsID e OrderID.

3. No menu de aplicação acesse a pasta Campos e clique no campo ProductID.

4. Altere a propriedade Tipo de Dados para Select.

5. Ainda no campo ProductID acesse a guia Lookup de Edição

6. Na propriedade SQL Select Statement insira o seguinte comando:

SELECT ProductID, ProductName
 FROM products
 ORDER BY ProductID
 

7. Altere a propriedade Usar Título/Negação para Sim.

8. Ainda na pasta Campo do menu de aplicação clique sobre o item Novo Campo.

9. Na quantidade de campos informe 1 e clique no botão Prosseguir.

10. Na propriedade Tipo selecione Decimal e nas propriedades Nome e Label informe Total. Em seguida clique no botão Criar.

Criando métodos para o formulário detalhe

O primeiro método será utilizado para calcular o valor total da soma de todos os itens de cada pedido.

1. No menu de aplicação acesse a pasta Programação->Métodos.

2. Crie um novo método chamado calculate_total

3. Insira o seguinte código para o método criado:

{total} = ({unitprice} * {quantity}) - {discount};

O segundo método será utilizado para verificar se o item a ser inserido no pedido ainda existe em estoque.

4. Crie um novo método chamado check_stock

5. Insira o seguinte código para o método criado:

sc_lookup (dataset, "SELECT unitsinstock 
FROM products 
WHERE productid = {productid}");

if ({dataset} [0] [0] <{quantity}) {
sc_error_message ("Insufficient Quantity");
sc_set_focus ('quantity');
}
if ({unitprice}! = 0 && {quantity}! = 0) {
{total} = ({unitprice} * {quantity}) - {discount};
}

O terceiro método será utilizado para atualizar no formulário de Pedido, o valor total da soma de todos os itens de um determinado pedido.

6. Crie outro método chamado update_master

7. Insira o seguinte código para o método criado:

sc_lookup (dataset, "select SUM ((quantity * unitprice) - discount) FROM order_details 
WHERE orderid = {orderid}");

if (! empty ({dataset [0] [0]}))
{
$ total = {dataset [0] [0]};
sc_exec_sql ("UPDATE orders SET priceorder = $ total WHERE orderid = {orderid}"); 
sc_format_num ($ total, '.', ',', 2, 'S', '1', '');
sc_master_value ('priceorder', $ total);
} else {

$ total = 0;
sc_format_num ($ total, '.', ',', 2, 'S', '1', '');
sc_master_value ('priceorder', $ total);

}

Criando eventos Ajax para o formulário detalhe

1. No menu de aplicação acesse a pasta Eventos Ajax.

2. Clique no item Novo Evento Ajax.

3. Selecione o campo Discount e selecione o evento onChange. Clique no botão Criar Evento para finalizar.

4. No editor de código do evento faça uma chamada ao metodo calculate_total.

5. Crie um novo evento Ajax para o campo ProductID no evento onChange .

6. Insira o código exibido na imagem abaixo:

sc_lookup (dataset, "select unitprice from products 
WHERE productid = '{productid}'");

if (! empty ({dataset} [0] [0])) {

{unitprice} = {dataset} [0] [0];
sc_set_focus ('quantity');
}
else {
{unitprice} = 0;
sc_set_focus ('unitprice');
}

7. Crie um novo evento Ajax para o campo Quantity no evento onChange.

8. Insira o código exibido na imagem abaixo:

sc_lookup (dataset, "select unitprice from products 
WHERE productid = '{productid}'");

if (! empty ({dataset} [0] [0])) {

{unitprice} = {dataset} [0] [0];
sc_set_focus ('quantity');
}
else {
{unitprice} = 0;
sc_set_focus ('unitprice');
}

9. Crie um novo evento Ajax para o campo UnitPrice no evento onChange.

10. No editor de código do evento faça uma chamada ao metodo calculate_total.

Fazendo chamada dos métodos criados nos eventos do formulário detalhe

1. Acesse a pasta Eventos no menu de aplicação (veja a imagem abaixo). Assim como foi feito para os eventos dos campos, nós iremos fazer as chamadas dos métodos nos eventos do formulário. Na tabela abaixo está a relação dos metodos que devem ser chamados em cada evento.

Event Method
onBeforeInsert check_stock ();
onAfterInsert update_master ();
onBeforeUpdate check_stock ();
onAfterUpdate update_master ();
onAfterDelete update_master ();
onLoadRecord check_stock ();

2. Gere o código fonte do formulário detalhe. Para isto clique no botão Gerar Código Fonte na barra de ferramentas do ScriptCase.

3. Acesse novamente a aplicação Mestre e execute-a através do botão na barra de ferramentas do ScriptCase.

Clique AQUI para ver mais exemplos criados usando o Scriptcase.

Compartilhe este tutorial

Tutoriais na mesma categoria

Nova opção de Marca d’água

Nova opção para exibir a marca d'água do campo de data dentro do input, disponível para Formul...

Gerenciamento de Arquivos na Nuvem

Alguns dos serviços de armazenamento de dados estão prontos para ler e armazenar com segurança ...

Formulário com label fixo

Esta opção pode ser selecionada nas formas do tipo Registro Múltiplo , Grid Editável e Visualiz...

Formulário de Contato

Neste tutorial, veremos uma aplicação do tipo Formulário de Controle customizado, onde teremos e...

Comente este post