Problemas com nested table
Tenho a seguinte estrutura de dados:
[b:0232fcd3ba]Cliente:[/b:0232fcd3ba]
ID+ (PK)
Nome: string
Endereco: string
etc...
[b:0232fcd3ba]ClienteContato:[/b:0232fcd3ba]
ID+ (PK)
ID_Cliente: (FK Cliente.ID)
Nome: string
Telefone: string
etc..
Na minha aplicação servidora (COM+), criei a ligação entre as tabelas usando nested tables:
[b:0232fcd3ba]SQLDataset_Cliente[/b:0232fcd3ba]
[i:0232fcd3ba]CommandText[/i:0232fcd3ba]: ´select * from cliente´;
[b:0232fcd3ba]Datasource_Cliente[/b:0232fcd3ba]
[i:0232fcd3ba]Dataset[/i:0232fcd3ba]: SQLDataset_Cliente
[b:0232fcd3ba]SQLDataset_ClienteContato[/b:0232fcd3ba]
[i:0232fcd3ba]CommandText[/i:0232fcd3ba]: ´select * from clientecontato where id_cliente = :id´
[i:0232fcd3ba]Datasource[/i:0232fcd3ba]: Datasource_Cliente;
[b:0232fcd3ba]DatasetProvider_Cliente[/b:0232fcd3ba]
[i:0232fcd3ba]Dataset[/i:0232fcd3ba]: SQLDataset_Cliente;
Até aí creio que não haja nenhum problema.
Na minha aplicação cliente, instanciei dois ClienteDatasets:
ClientDataset_Cliente e ClientDataset_ClienteContato.
Trabalho com sockets, então eu aponto o ClientDataset_Cliente.RemoteServer para um ConnectionBroker, e a propriedade DatasetProvider eu coloco como DatasetProvider_Cliente (aquele criado no COM+);
Persisto todos os campos (automaticamente é trazido o campo de ligação com a tabela ClienteContato);
aponto meu ClientDataset_ClienteContato.DatasetField para esse campo de ligação.
Tudo correto até aqui. (espero...)
O problema ocorre quando eu crio um registro na tabela filha (ClienteContato): [b:0232fcd3ba]ao invés de[/b:0232fcd3ba] o componente [b:0232fcd3ba]preencher[/b:0232fcd3ba] o campo ClienteContato.[b:0232fcd3ba]ID_Cliente[/b:0232fcd3ba], que é o campo de ligação entre a tabela ClienteContato (filha) e a tabela Cliente (pai) - como é visto na instrução SQL de SQLDataset_ClienteContato -, ele [b:0232fcd3ba]preenche o campo[/b:0232fcd3ba] ClienteContato.[b:0232fcd3ba]ID[/b:0232fcd3ba], que é o campo autoincremento da tabela filha.
Pelos meus testes só funcionaria a contento se os campos de ligação tivessem sempre o mesmo nome nas duas tabelas.
Fiz algo errado ou esse tipo de ligação - com campos de nome diferente - não é possível?
Qualquer ajuda será muito bem-vinda.
[b:0232fcd3ba]Cliente:[/b:0232fcd3ba]
ID+ (PK)
Nome: string
Endereco: string
etc...
[b:0232fcd3ba]ClienteContato:[/b:0232fcd3ba]
ID+ (PK)
ID_Cliente: (FK Cliente.ID)
Nome: string
Telefone: string
etc..
Na minha aplicação servidora (COM+), criei a ligação entre as tabelas usando nested tables:
[b:0232fcd3ba]SQLDataset_Cliente[/b:0232fcd3ba]
[i:0232fcd3ba]CommandText[/i:0232fcd3ba]: ´select * from cliente´;
[b:0232fcd3ba]Datasource_Cliente[/b:0232fcd3ba]
[i:0232fcd3ba]Dataset[/i:0232fcd3ba]: SQLDataset_Cliente
[b:0232fcd3ba]SQLDataset_ClienteContato[/b:0232fcd3ba]
[i:0232fcd3ba]CommandText[/i:0232fcd3ba]: ´select * from clientecontato where id_cliente = :id´
[i:0232fcd3ba]Datasource[/i:0232fcd3ba]: Datasource_Cliente;
[b:0232fcd3ba]DatasetProvider_Cliente[/b:0232fcd3ba]
[i:0232fcd3ba]Dataset[/i:0232fcd3ba]: SQLDataset_Cliente;
Até aí creio que não haja nenhum problema.
Na minha aplicação cliente, instanciei dois ClienteDatasets:
ClientDataset_Cliente e ClientDataset_ClienteContato.
Trabalho com sockets, então eu aponto o ClientDataset_Cliente.RemoteServer para um ConnectionBroker, e a propriedade DatasetProvider eu coloco como DatasetProvider_Cliente (aquele criado no COM+);
Persisto todos os campos (automaticamente é trazido o campo de ligação com a tabela ClienteContato);
aponto meu ClientDataset_ClienteContato.DatasetField para esse campo de ligação.
Tudo correto até aqui. (espero...)
O problema ocorre quando eu crio um registro na tabela filha (ClienteContato): [b:0232fcd3ba]ao invés de[/b:0232fcd3ba] o componente [b:0232fcd3ba]preencher[/b:0232fcd3ba] o campo ClienteContato.[b:0232fcd3ba]ID_Cliente[/b:0232fcd3ba], que é o campo de ligação entre a tabela ClienteContato (filha) e a tabela Cliente (pai) - como é visto na instrução SQL de SQLDataset_ClienteContato -, ele [b:0232fcd3ba]preenche o campo[/b:0232fcd3ba] ClienteContato.[b:0232fcd3ba]ID[/b:0232fcd3ba], que é o campo autoincremento da tabela filha.
Pelos meus testes só funcionaria a contento se os campos de ligação tivessem sempre o mesmo nome nas duas tabelas.
Fiz algo errado ou esse tipo de ligação - com campos de nome diferente - não é possível?
Qualquer ajuda será muito bem-vinda.
Emerson Nascimento
Curtidas 0
Respostas
Kotho
20/06/2005
Os campos de ligação não são preenchidos automaticamente quando se insere um registro novo... este preenchimento deve ser feito manualmente...
Quanto ao seu procedimento, me parece que está tudo correto...
Quanto ao seu procedimento, me parece que está tudo correto...
GOSTEI 0
Emerson Nascimento
20/06/2005
os campos de ligação são preenchidos automaticamente sim. isso é uma afirmação.
porém o campo preenchido não é o campo correto. como eu disse o relacionamento é feito entre o campo ClienteContato.ID_Cliente e Cliente.ID, mas quando eu crio um novo registro ´filho´, a aplicação insiste em preencher o campo ClienteContato.ID ao invés de ClienteContato.ID_CLIENTE.
porém o campo preenchido não é o campo correto. como eu disse o relacionamento é feito entre o campo ClienteContato.ID_Cliente e Cliente.ID, mas quando eu crio um novo registro ´filho´, a aplicação insiste em preencher o campo ClienteContato.ID ao invés de ClienteContato.ID_CLIENTE.
GOSTEI 0
Kotho
20/06/2005
Bom... então nós temos versões diferentes do Delphi... a minha é a 7, e, com toda a certeza do mundo, os campos de ligação das tabelas filhas NÃO são preenchidos nos programas que eu fiz... Tive que preencher na unha...
Agora, só se o nome ID for tratado diferente pelo Provider... isso eu já não sei...
Talvez alguém possa tirar essa dúvida pra gente :D
Agora, só se o nome ID for tratado diferente pelo Provider... isso eu já não sei...
Talvez alguém possa tirar essa dúvida pra gente :D
GOSTEI 0
Emerson Nascimento
20/06/2005
eu também utilizo o Delphi 7...
GOSTEI 0
Emerson Nascimento
20/06/2005
sobe
GOSTEI 0
Emerson Nascimento
20/06/2005
ninguém se habilita? hein? hein?
:)
:)
GOSTEI 0
Emerson Nascimento
20/06/2005
Problema resolvido!
GOSTEI 0
Eselvati
20/06/2005
bom, em um relacionamento master-detail com dbexpress usando nesteddataset, o campo de ligacao da tabela pai é automaticamente inserido na tabela filha, ´como num passe de mágica´, devido a arquitetura datasnap..mas o valor ja deve existir na tabela pai, para q ele o possa inserir...
Ederson Selvati
Ederson Selvati
GOSTEI 0
Martins
20/06/2005
O rapaz, posta aqui como foi q vc resolveu isso sô.
O pessoal quer saber!!!
O pessoal quer saber!!!
GOSTEI 0
Emerson Nascimento
20/06/2005
[b:41b37a9f0d]eselvati[/b:41b37a9f0d], o meu problema não era necessariamente com o preenchimento do campo, mas sim com o preenchimento do campo errado!
como no exemplo anterior:
como vemos, o relacionamento é entre o campo Cliente.ID e ClienteContato.ID_CLIENTE.
o problema é que quando essa ligação é feita com nested tables, o campo preenchido na tabela filha é o campo ID, ao invés de ID_CLIENTE.
Mas agora o problema está resolvido. Mesmo os campos de ligação tendo nomes diferentes (como é o caso) seu preenchimento é feito corretamente.
como no exemplo anterior:
PAI FILHO Cliente: ClienteContato: ID+ (PK) |------+ ID+ (PK) Nome: string +--------< ID_Cliente: (FK Cliente.ID) Endereco: string Nome: string etc... Telefone: string
como vemos, o relacionamento é entre o campo Cliente.ID e ClienteContato.ID_CLIENTE.
o problema é que quando essa ligação é feita com nested tables, o campo preenchido na tabela filha é o campo ID, ao invés de ID_CLIENTE.
Mas agora o problema está resolvido. Mesmo os campos de ligação tendo nomes diferentes (como é o caso) seu preenchimento é feito corretamente.
GOSTEI 0
Gustavo Cruz
20/06/2005
Mas como foi resolvido?
GOSTEI 0