Capítulo 14: Formulários Mestre-Detalhes (Ordem de Frete e Itens de Carga)

🎯 Objetivo da Aula

Nesta aula de arquitetura avançada de interfaces, você aprenderá a construir a tela mais emblemática de qualquer sistema de ERP ou SIG do planeta: o Formulário Mestre-Detalhes (Parent-Child / Master-Detail Form). No laboratório de informática, você aprenderá a embutir um Subformulário (SubForm) dentro de uma tela principal, sincronizando os registros através das propriedades LinkMasterFields e LinkChildFields. Você aprenderá também a criar Totalizadores Dinâmicos, calculando subtotais no rodapé do subformulário e refletindo a soma geral instantaneamente no cabeçalho da ordem de frete.

Ao final desta aula, você terá desenvolvido a tela central de expedição da FastLog S.A. (frm_OrdemFreteMestre), permitindo o faturamento de carretas completas com múltiplos itens de mercadorias em uma única tela integrada.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: O assistente de faturamento da matriz passava por um processo burocrático e exaustivo: para lançar uma viagem de carga fracionada com 5 produtos diferentes, ele precisava abrir uma tela para cadastrar o frete (ID 105), anotar o número gerado em um pedaço de papel de rascunho, fechar a tela, abrir outra tela separada para lançar os itens, redigitar o código 105 manualmente cinco vezes e, por fim, somar os valores das mercadorias na calculadora de mesa para preencher o valor do seguro no cabeçalho. Em dias de grande movimento, erros de digitação faziam com que itens fossem faturados para a viagem errada, atrasando carretas na balança rodoviária.
Sua Missão: Como engenheiro de sistemas, você construirá uma interface Mestre-Detalhes unificada. Na parte superior da tela, o operador selecionará a data, a placa e o motorista; na parte inferior, em uma grade fluida e sincronizada, ele digitará as mercadorias, enquanto o Access preenche as chaves estrangeiras automaticamente e totaliza o peso e o valor em tempo real.


🧠 Fundamentos: A Teoria Traduzida

1. A Arquitetura Mestre-Detalhes (Master-Detail)

Em bancos de dados relacionais, quando temos um relacionamento 1:N ou N:M, a forma mais ergonômica de manipulação visual é reunir as duas tabelas em uma única janela:

  • Formulário Mestre (Pai / Cabeçalho): Conectado à tabela do lado “1” (tbl_OrdensFrete). Exibe as informações que são únicas para a viagem inteira (Código do Frete, Data, Placa, Rota, Motorista).
  • Subformulário Detalhe (Filho / Grade): Conectado à tabela do lado “Vários” (tbl_ItensFrete). Exibe as múltiplas linhas de mercadorias transportadas naquela viagem específica.
flowchart TD
    subgraph FORM_MESTRE["🖥️ Formulário Mestre: frm_OrdemFrete (tbl_OrdensFrete)"]
        direction TB
        CAB["Cabeçalho da Viagem: ID_OrdemFrete: 105 | Data: 10/10/2026 | Placa: BRA2E19"]
        
        subgraph SUBFORM["📋 Subformulário Filho: sub_ItensFrete (tbl_ItensFrete)"]
            direction TB
            L1["Linha 1: Smartphones 5G | Qtd: 200 | Peso: 3.000 kg | R$ 600.000,00"]
            L2["Linha 2: Cafés Especiais | Qtd: 150 | Peso: 9.000 kg | R$ 180.000,00"]
            ROD["Rodapé do Subformulário: =Soma([Valor_Declarado_Item]) ➔ R$ 780.000,00"]
        end

        CAB --- SUBFORM
        TOT["Total Geral Refletido no Mestre: R$ 780.000,00 (Dinâmico)"]
        SUBFORM -.-> TOT
    end

    style FORM_MESTRE fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
    style CAB fill:#2980b9,stroke:#fff,stroke-width:1px,color:#fff
    style SUBFORM fill:#2c3e50,stroke:#fff,stroke-width:1px,color:#fff
    style L1 fill:#34495e,stroke:#fff,color:#fff
    style L2 fill:#34495e,stroke:#fff,color:#fff
    style ROD fill:#27ae60,stroke:#fff,color:#fff
    style TOT fill:#e67e22,stroke:#fff,stroke-width:2px,color:#fff

2. O Mecanismo de Sincronismo: LinkMasterFields e LinkChildFields

Como o subformulário sabe que deve mostrar apenas os itens da viagem atual?

  • Vincular Campos Mestres (LinkMasterFields): É o campo-chave do formulário principal (ID_OrdemFrete).
  • Vincular Campos Filhos (LinkChildFields): É a chave estrangeira do subformulário (ID_OrdemFrete).
  • A Mágica do Access: Quando o operador digita uma nova linha no subformulário, o Access preenche a chave estrangeira automaticamente nos bastidores com o código da viagem atual, sem que o operador precise digitar nada!

3. Fórmulas Cruzadas entre Formulários

Para ler uma soma que está dentro do rodapé de um subformulário e exibi-la no formulário mestre: $$\text{Origem do Controle} = \text{=[\textit{NomeDoSubformulario}].[\textit{Form}]![\textit{NomeDaCaixaDeTexto}]}$$


📖 Exemplo Guiado: Passo a Passo no Laboratório

Abra o arquivo FastLog_Database.accdb. Vamos construir o subformulário de itens em primeiro lugar.

Passo 1: Criando o Subformulário de Itens (sub_ItensFrete)

  1. No Painel de Navegação, selecione a tabela tbl_ItensFrete.
  2. Acesse a guia Criar ➔ clique em Mais Formulários ➔ selecione Folha de Dados (Datasheet).
  3. Uma grade com as colunas da tabela de itens será criada.
  4. Salve o formulário com o nome: sub_ItensFrete e feche-o.

🛠️ Prática Obrigatória 1: Criando o Formulário Mestre e Acoplando o Subformulário

Agora você criará o formulário principal da ordem de frete e embutirá o subformulário de mercadorias.

Passo a Passo no Computador:

  1. Acesse Criar ➔ Design do Formulário (Form Design).
  2. Pressione F4 para abrir a Folha de Propriedades.
  3. Na guia Dados, configure a propriedade Origem do Registro (RecordSource) como: tbl_OrdensFrete.
  4. Inserindo os Campos do Mestre:
    • Na faixa de opções (guia Design de Formulário), clique em Adicionar Campos Existentes (ícone da tabela com campos).
    • Uma lista com os campos de tbl_OrdensFrete se abrirá à direita.
    • Dê duplo clique em: ID_OrdemFrete, Data_Despacho, Data_Entrega_Prevista, ID_Cliente, Placa_Veiculo, ID_Motorista, Codigo_Rota, Valor_Frete.
    • Posicione e organize os campos no topo da seção Detalhe.
  5. Embutindo o Subformulário:
    • Localize o formulário sub_ItensFrete no Painel de Navegação à esquerda.
    • Clique, segure e arraste sub_ItensFrete para dentro do formulário mestre, soltando-o logo abaixo dos campos de cabeçalho!
  6. Verificando os Vínculos de Sincronismo:
    • Clique sobre a borda alaranjada do subformulário embutido.
    • Na Folha de Propriedades (F4), clique na guia Dados.
    • Verifique que o Access já configurou automaticamente:
      • Vincular Campos Mestres: ID_OrdemFrete
      • Vincular Campos Filhos: ID_OrdemFrete
  7. Salve o formulário com o nome oficial: frm_OrdemFreteMestre.

✅ Resultado Esperado (Prática 1):

O formulário mestre exibe as informações gerais da viagem na parte superior e a grade dinâmica de itens transportados na parte inferior, sincronizados pela chave ID_OrdemFrete.


🛠️ Prática Obrigatória 2: Totalizador Dinâmico no Rodapé

Você programará o cálculo automático do valor declarado e peso total das mercadorias.

Passo a Passo no Computador:

  1. Abra o subformulário sub_ItensFrete no Modo Design.
  2. Abra um espaço na seção Rodapé do Formulário (Form Footer).
  3. Adicione uma nova Caixa de Texto (TextBox):
    • Clique sobre a caixa e abra a Folha de Propriedades (F4).
    • Na guia Outro, altere o Nome para: txt_TotalMercadorias.
    • Na guia Dados, na linha Origem do Controle, digite exatamente:
      1
      
      =Soma([Valor_Declarado_Item])
    • Na guia Formato, altere o Formato para: Moeda.
  4. Salve e feche sub_ItensFrete.
  5. Abra o formulário principal frm_OrdemFreteMestre no Modo Design.
  6. Adicione uma nova Caixa de Texto no formulário mestre:
    • Altere o Rótulo para: VALOR TOTAL DECLARADO DA CARGA:.
    • Selecione a Caixa de Texto e, na propriedade Origem do Controle, digite:
      1
      
      =[sub_ItensFrete].[Form]![txt_TotalMercadorias]
    • Configure o Formato como: Moeda e marque a propriedade Bloqueado: Sim (para o operador não alterar a soma na mão).
  7. Mude para o Modo Formulário:
    • Navegue entre as viagens existentes: observe a grade de itens mudar automaticamente a cada registro!
    • Adicione um novo produto na grade e veja o total geral da carga se recalcular no mesmo instante!

✅ Resultado Esperado (Prática 2):

A tela calcula o valor total das mercadorias da viagem em tempo real, sem necessidade de calculadoras manuais ou risco de erro de digitação.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve todas as alterações e feche o Access.
  2. Nomeie o arquivo: FastLog_BD_Cap14_SeuNome_SeuSobrenome.accdb.
  3. Acesse o Microsoft Teams na sua turma técnica.
  4. Abra a tarefa: “Banco de Dados - Cap 14: Formulários Mestre-Detalhes”.
  5. Anexe o seu arquivo .accdb e conclua o envio clicando em Entregar (Turn In).

💡 Checkpoint de Gestão & TI

Por que esta aula é um marco na formação técnica? Porque agora você construiu a espinha dorsal de um sistema ERP de verdade. Toda nota fiscal, todo pedido de compras e todo conhecimento de transporte rodoviário (CT-e) no Brasil opera sob a arquitetura Mestre-Detalhes. Dominar a ligação entre formulários e a propagação de cálculos em tempo real coloca você no nível mais alto de desenvolvimento desktop com SGBD.


🔥 Desafio de Fixação: Totalizador de Peso Líquido Transportado

Assim como totalizamos o valor financeiro da carga para o seguro, o departamento de tráfego precisa saber o Peso Total dos Itens em Quilos para comparar com a capacidade máxima do caminhão e evitar multas por excesso de peso na balança rodoviária.

Implemente o totalizador de peso na tela Mestre-Detalhes:

  1. Abra sub_ItensFrete no Modo Design e adicione uma segunda Caixa de Texto no Rodapé do Formulário:
    • Nome: txt_PesoTotalItens
    • Origem do Controle: =Soma([Peso_Aferido_Kg])
    • Formato: Número Padrão.
  2. No formulário mestre frm_OrdemFreteMestre, adicione uma Caixa de Texto correspondente:
    • Rótulo: PESO TOTAL AFERIDO (KG):
    • Origem do Controle: =[sub_ItensFrete].[Form]![txt_PesoTotalItens]
    • Propriedade: Bloqueado = Sim.
  3. Teste a tela adicionando novos itens e verifique a soma de peso em tempo real.

🔑 Revelar Gabarito Oficial e Material de Apoio da Aula (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Especificação dos Controles do Desafio de Fixação:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
1. No Rodapé de sub_ItensFrete (Subformulário):
   - Caixa de Texto: txt_PesoTotalItens
   - Origem do Controle: =Soma([Peso_Aferido_Kg])
   - Formato: Padrão (com separador de milhar)

2. No Formulário Mestre frm_OrdemFreteMestre:
   - Rótulo: PESO TOTAL AFERIDO (KG):
   - Caixa de Texto: txt_ExibePesoTotal
   - Origem do Controle: =[sub_ItensFrete].[Form]![txt_PesoTotalItens]
   - Propriedades de Proteção: Ativado = Não | Bloqueado = Sim
   - Formatação: Negrito, Fonte 11pt, Alinhamento à Direita

📥 Download dos Scripts desta Aula:
Baixe o arquivo de script Capitulo_14.sql ou o pacote compactado (.zip) com os comandos SQL e esquemas da aula.


📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas reflexivas abaixo com base no conteúdo deste capítulo. Ao concluir, apresente o caderno ao professor para conferência e visto.

  1. O que caracteriza a arquitetura de interfaces conhecida como Formulário Mestre-Detalhes (Parent-Child)?
  2. No Cenário Prático da FastLog, qual era o procedimento manual e arriscado realizado pelo assistente de faturamento antes da tela integrada?
  3. Qual tabela da transportadora atua como origem do Formulário Mestre e qual tabela atua como origem do Subformulário?
  4. Qual é o papel da propriedade Vincular Campos Mestres (LinkMasterFields)?
  5. Qual é o papel da propriedade Vincular Campos Filhos (LinkChildFields)?
  6. O que o Microsoft Access faz nos bastidores quando um operador digita uma nova linha na grade do subformulário?
  7. Em qual seção do subformulário devemos obrigatoriamente inserir as caixas de texto contendo fórmulas agregadoras como =Soma(...)?
  8. Qual é a sintaxe exata utilizada no formulário principal para capturar o valor calculado dentro do subformulário?
  9. Por que é recomendável configurar a propriedade Bloqueado = Sim nas caixas de texto que exibem totais consolidados?
  10. No Desafio de Fixação, qual é a importância logística de monitorar o totalizador de peso em tempo real durante a digitação dos itens da carga?