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 DelphiAntes 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) | |
| ITENSPEDIDOS | ||
|---|---|---|
| PK | Item | Integer |
| FK | CodigoPedido | Integer |
| Produto | Varchar(30) | |
| Qtde | Numeric(12,2) | |
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 |
| Item | CodigoPedido | Produto | Qtde |
|---|---|---|---|
| 1 | 1 | Arroz | 5 |
| 2 | 1 | Feijao | 20 |
| 3 | 1 | Carne | 2 |
| 1 | 2 | Macarrao | 3 |
| 2 | 2 | Batatas | 6 |
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 = CodigoNã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;