Depois de muito pesquisar na internet sobre formulários Mestre Detalhes no Delphi 7 utilizando o DBExpress cheguei a conclusão que é necessário fazer muitas configurações nos componentes sqlQuery, DataSetProvider e ClienteDataSet para que se possa conseguir um resultado satisfatório. Tentando achar uma solução mais fácil, descobri uma forma de fazer um esse tipo de formulário, que acredito eu, é mais rápida.

Saiba mais Curso Criando minha primeira aplicação em Delphi

Antes de continuarmos, devo esclarecer alguns aspectos importantes. Vou considerar que você já saiba usar o básico do Firebird, como criação de tabela e chaves primarias, não vou entrar em maiores detalhes e que também o conexão do banco de dados (SqlConnection) já esteja devidamente configurada. Para este exemplo serão consideradas as 2 tabelas, a Pedidos e a ItensPedidos, mostradas logo abaixo:

As duas tabelas que servirão de exemplo, são mostradas abaixo:

PEDIDOS
PK Codigo Integer
DataEmissao TimeStamp
DataEntrega TimeStamp
TotalPedido Numeric(12,2)
Tabela 1. Tabela Mestre - PEDIDOS
ITENSPEDIDOS
PK Item Integer
FK CodigoPedido Integer
Produto Varchar(30)
Qtde Numeric(12,2)
Tabela 2. Tabela Mestre - ITENSPEDIDOS
Nota: PK = Chave Primária; FK = Chave Estrangeira.

Preencha as tabelas com os seguintes dados:

Código DataEmissao DataEntrega TotalPedido
1 01/08/2007 15/08/2007 150,00
2 01/09/2007 30/09/2007 500,00
Tabela 3. Tabela Pedidos
Item CodigoPedido Produto Qtde
1 1 Arroz 5
2 1 Feijao 20
3 1 Carne 2
1 2 Macarrao 3
2 2 Batatas 6
Tabela 4. Tabela ItensPedidos

Primeiro configuraremos os componentes da tabela Mestre.

  • Adicione ao formulário 1 componente SQLQuey e configure da seguinte forma:
    
        SQLConnection = Sua conexão com o banco devidamente configurada
        SQL = select * from pedidos
        Name =  sqlMestre
        
  • Adicione 1 componente DataSetProvider e configure:
    
    DataSet = sqlMestre
    Name = dspMestre
    
  • Adicionar 1 ClienteDataSet e altere suas propriedades:
    
    Name = cdsMestre
    ProviderName = dspMestre
    
  • Por último, adicione um DataSource e faça conforme está abaixo:
    
    Name = dsMestre
    DataSet = cdsMestre
    

Pronto, já configuramos nossa tabela mestre. Agora vamos configurar a tabela detalhes.

  • Adicione um SQLQuery e configure:
    Name = sqlDetalhes
    SQL = select * from ITENSPEDIDOS
    SQLConnection = Sua conexão devidamente configurada
    
  • Coloque um DataSetProvider e o configure conforme abaixo:
    Name = dspDetalhes
    DataSet = sqlDetalhes
    

Agora, vamos configurar o ClientDataSet da tabela detalhes.

  • Adicione um ClienteDataSet ao formulário e mude suas propriedades para:
    Name = cdsDetalhes
    IndexFieldsNames = CodigoPedido
    MasterFields = Codigo
    

    Não vamos configurar a propriedade MasterSource agora, ela será configurada em tempo de execução. Se ela for configurada agora, ira dar um erro quando a aplicação for executada.

  • Adicione também um DataSource e altere suas propriedades:
    Name = dsDetalhes
    DataSet = cdsDetalhes
    

Agora vamos fazer as coisas funcionarem, adicione dois DBGrids ao formulário, um na parte de cima do Form e outro na parte de baixo. No dbGrid de cima altere a propriedade DataSource para dsMestre. No dbGrid de baixo coloque a propriedade DataSource como dsDetalhes.

  • Agora no evento OnCreate do formulário escreva o seguinte código:
    cdsMestre.Open;
    cdsDetalhes.Open;
    cdsDetalhes.MasterSource := dsMestre;
    

Pronto, seu formulário Mestre Detalhes está configurado. Agora de você quiser que as alterações realizadas nele sejam gravadas é necessário observar o seguinte. O componente DBGrid de cima (da tabela Mestre) irá gravar os dados normalmente, basta executar o comando cdsMestre.ApplyUpdates(0). Agora o dbGrid de baixo não irá gravar os dados. Isso acontece porque o MasterSource do cdsDetalhes não deixa os dados serem gravados. Para resolver isso basta, antes de gravar, retirar o componente dsMestre da propriedade MasterSource do cdsDetalhes, executar o comando cdsDetalhes.ApplyUpdates(0); e depois voltar o dsMestre para o propriedade MasterSource novamente. Veja como o código ira ficar:

cdsDetalhes.MasterSource := nil;
cdsDetalhes.ApplyUpdates(0);
cdsDetalhes.MasterSource := dsMestre;

Confira também