Dúvida mestre/detalhe com ClientDataSet

22/09/2004

Olá amigos do fórum,

Estou utilizando D7 + ADO + TClientDataSet para criar uma relação mestre detalhe no SQL Server 7.

As instruções SQL do TADODataSet são as seguintes:

SELECT * FROM PEDIDOS WHERE CODPEDIDO=:CODPEDIDO
SELECT * FROM PEDIDOSITEM WHERE CODPEDIDO=:CODPEDIDO

Existem 2 maneiras de se fazer o relacionamento:

1) Fazer o relacionamento entre os TADODataSet, criando um aninhamento e, consequentemente, utilizando apenas um TDataSetProvider.

2) Utilizar 2 TDataSetProvider e criar o relacionamento entre os TClientDataSet.

Gostaria de saber quais as diferenças entre essas duas abordagens (Notem pela primeira cláusula SQL que apenas 1 pedido será consultado por vez).

Gostaria de saber também como utilizar campos autoincremento de maneira correta pois no momento do Insert de um Pedido o Itens não estão recebendo o número do pedido o que está gerando erro no ApplyUpdates.

Obrigado pela ajuda,
Gabriel


Gatoledo

Respostas

22/09/2004

Afarias

|Gostaria de saber quais as diferenças entre essas duas abordagens
|(Notem pela primeira cláusula SQL que apenas 1 pedido será consultado
|por vez).

Na forma de tabelas aninhadas vc tem a vantagen de ter toda operaçào em uma transação única, totalmente ´automatizada´ pelo provider. Entretanto, tabelas aninhadas ´as vezes´ não são boa opção justamente por causa disso mesmo, em algumas situações precisamos q a trasação do mestre seja diferente da dos detalhes.

Outra coisa ´ruim´ em tabelas aninhadas é quando vc terá ´muitos´ mestres carregados (que não é o seu caso)


|Gostaria de saber também como utilizar campos autoincremento de
|maneira correta pois no momento do Insert de um Pedido o Itens não
|estão recebendo o número do pedido o que está gerando erro no
|ApplyUpdates.

para acabar com o erro, basta colocar o campo como Required=False, e configurar o Provider com [PropagateChanges]

mas se vc deseja ver o valor no momento do Insert, utilize o evento OnNewRecond do ClientDataSet para gerar o novo valor


T+


Responder Citar