Problemas com NestedDataSets...

Delphi

03/08/2005

Olá!

Pessoal, estou tentando usar NestedDataSets com IBX (Firebird 1.5 - Delphi7) para criar um mestre/detalhe entre dois ClientDataSets. Fiz o seguinte:

1) Inseri o DataSetM (IBDataSet) e defini a seguinte SQL:

SELECT
   AUTOMATICO,
   NOME
FROM
   NOTAM


2) Inseri o DataSetD (IBDataSet) e defini a seguinte SQL:

SELECT
   GERADOR,
   CODIGONOTA,
   NOMEPRODUTO,
   QUANTIDADE,
   VALORUNIT
FROM
   NOTAD
WHERE
   CODIGONOTA=:AUTOMATICO


3) Adicionei um DataSource (dsMaster) apontando para o DataSetM e liguei a propriedade DataSet do DataSetD para o DataSource dsMaster.

4) Adicionei um DataSetProvider (dspMaster) apontando para o DataSetM.

5) Adicionei o primeiro ClientDataSet (cdsMaster), cuja propriedade ProviderName aponta para o dspMaster. Adicionei depois os campos no Fields Editor para o cdsMaster. Com isso ele gerou um TDataSetField chamado DataSetD.

6) Adicionei o segundo ClientDataSet (cdsDetail), cuja propriedade DataSetField aponta para cdsMasterDataSetD.

Fiz tudo isso em um projeto teste para aprender a usar NestedDataSets. O problema é o seguinte: O campo CODIGONOTA da tabela detalhe não está sendo preenchido. Com isso, depois que eu fecho o programa e abro de novo o vínculo se perde. Esse parece ser o mesmo problema de um tópico antigo que não teve resposta:

[url]http://forum.clubedelphi.net/viewtopic.php?t=29165[/url]

Eu estou disponibilizando o projeto com o banco de dados na internet. O arquivo tem 45k. Se alguém puder me ajudar eu agradeço!

Link para download: [url]http://www.geocities.com/delphirj/NestedDataset.zip[/url]

Só um detalhe. Como é um projeto teste eu não criei nenhum GENERATOR. Então o processo que estou fazendo é o seguinte:

1) Dou um insert pelo DBNavigator;
2) Digito um número para o campo AUTOMATICO (que deveria ser preenchido pelo GENERATOR).
3) Vou para o Grid e dou entrada em um produto para a nota. Note que eu também preencho o campo GERADOR porque também não tem GENERATOR, mas no campo CODIGONOTA eu não preencho nada para tentar ver o momento em que o campo seria preenchido para mantar o vínculo. Bem, depois disso eu dou um post pelo DBNavigator, pressiono o botão ApplyUpdates e o campo continua sem ser prenchido. Se cadastrar uma outra nota ele funciona como se o campo tivesse sido preenchido, ou melhor, não importa se o campo está ou não preenchido, quando você vai passeando pelos registros ele mostra os registros certos para aquele mestre, mas como o campo não está preenchido quando eu fecho o programa e abro de novo não se consegue mais pegar os vínculos.

Ah, esqueci de dizer que já setei como true as opções poCascadeUpdates e poCascadeDeletes do DataSetProvider.

Li no fórum do Firebase que eu poderia setar a propriedade UniDirectional para True. Isso é verdade? Seria melhor ou pior?

Bem, é isso. Se alguém puder me ajudar... Valeu!


Delphi32

Delphi32

Curtidas 0

Respostas

Kotho

Kotho

03/08/2005

No insert, o campo de ligação não é preenchido automaticamente... Você tem que preencher na mão... pode usar o evento OnNewRecord... ou o AfterInsert para atribuir o(s) valor(es)


GOSTEI 0
Delphi32

Delphi32

03/08/2005

e se no momento de dar entrada nos detalhes eu ainda não tiver o código do mestre?

usando NestedDataSets eu teria sempre que obrigatoriamente ter o código do mestre antes de dar entrada nos detalhes?

t+!


GOSTEI 0
POSTAR