Insert usando MestreDetalhe DatasetField
Seguinte fizemos um exemplo básico uma tabela Contato (ID, Nome) e outra Telefone (ID, Contato_ID,Telefone). Usamos um sqlDataset (select * from contato) e no outro (sql * from telefone where Contato_ID = :ID) montamos toda estrutura mestre detalhe com o DataSetfield até aí td blz na visualizacao. Agora qdo vamos dar um insert na tabela detalhe ao invés de o ID da tabela Contato preencher o campo contato_id, ela preenche é o ID da Tabela Telefone. Pra resolver este problema alteramos os nome dos campos ID para:Tabela Contato (Contato_ID, Nome) eTabela Telefone (Telefone_ID, Contato_ID,Telefone). e funcionou perfeitamente. Gostariamos de saber se há outra forma de resolver este problema na hora da inserção já que teríamos que mudar nosso padrão de nomenclatura do banco de dados.
Parabéns pelo blog estou sempre acompanhando as novidades..
Abxxx Muito Obrigado
Parabéns pelo blog estou sempre acompanhando as novidades..
Abxxx Muito Obrigado
Samuel Silva
Curtidas 0
Respostas
André Silveira
17/03/2011
O funcionamento do insert com datasetfield é esse mesmo, pois quando se tem o mesmo nome de campo em duas tabelas diferentes, ele usará o mesmo nome do campo usado no relacionamento (ID).
O que se pode fazer é setar no OnBeforeUpdateRecord, para alterar o campo do delta para colocar o valor correto no campo certo.
No mais somente renomeando o campo para que não se repita o nome mesmo que em tabelas diferentes quando se usa essa estrutura de relacionamento mestre/detalhe.
Atenciosmente,
André Luis da Silveira.
O que se pode fazer é setar no OnBeforeUpdateRecord, para alterar o campo do delta para colocar o valor correto no campo certo.
No mais somente renomeando o campo para que não se repita o nome mesmo que em tabelas diferentes quando se usa essa estrutura de relacionamento mestre/detalhe.
Atenciosmente,
André Luis da Silveira.
GOSTEI 0
André Silveira
17/03/2011
Acabei de fezer um teste aqui e o que pode fazer para não ter que renomear todos os campos nas tabelas, seria renomear eles apenas nas querys.
Sendo assim o campo ID do contato ficaria com o nome na query de CONTATO_ID, fazendo o link com a outra tabela por esse campo, assim ele colocaria o código do contato no campo correto do filho.
Somente essa saída ou então renomear todos os campos no banco.
Atenciosamente,
André Luis da Silveira.
Sendo assim o campo ID do contato ficaria com o nome na query de CONTATO_ID, fazendo o link com a outra tabela por esse campo, assim ele colocaria o código do contato no campo correto do filho.
Somente essa saída ou então renomear todos os campos no banco.
Atenciosamente,
André Luis da Silveira.
GOSTEI 0
Samuel Silva
17/03/2011
Acabei de fezer um teste aqui e o que pode fazer para não ter que renomear todos os campos nas tabelas, seria renomear eles apenas nas querys.
Sendo assim o campo ID do contato ficaria com o nome na query de CONTATO_ID, fazendo o link com a outra tabela por esse campo, assim ele colocaria o código do contato no campo correto do filho.
Somente essa saída ou então renomear todos os campos no banco.
Atenciosamente,
André Luis da Silveira.
Mas nesse caso renomear os campos no seria o mais correto! Até porque o banco está apenas modelado.
Abxxx Obrigado pela ajuda.
GOSTEI 0
André Silveira
17/03/2011
Se o banco está somente modelado, pode sim renomear diretamente nas tabelas do mesmo.
Sugiro que utilize uma notação que deixe mais claro a qual tabela o campo pertence, algo mais ou menos assim:
Tabela Clientes :
CODI_CLI, NOME_CLI, FONE_CLI
Tabela Fornecedores:
CODI_FOR, DESC_FOR, FONE_FOR
Tabela Produtos:
CODI_PRO, DESC_PRO, UNID_PRO, CODI_FOR (campo relacionado a tabela fornecedores).
Assim acho que fica mais fácil de saber qual o campo que faz relacionamento a qual tabela do banco.
Atenciosamente,
André Luis da Silveira.
Sugiro que utilize uma notação que deixe mais claro a qual tabela o campo pertence, algo mais ou menos assim:
Tabela Clientes :
CODI_CLI, NOME_CLI, FONE_CLI
Tabela Fornecedores:
CODI_FOR, DESC_FOR, FONE_FOR
Tabela Produtos:
CODI_PRO, DESC_PRO, UNID_PRO, CODI_FOR (campo relacionado a tabela fornecedores).
Assim acho que fica mais fácil de saber qual o campo que faz relacionamento a qual tabela do banco.
Atenciosamente,
André Luis da Silveira.
GOSTEI 0
Samuel Silva
17/03/2011
Se o banco está somente modelado, pode sim renomear diretamente nas tabelas do mesmo.
Sugiro que utilize uma notação que deixe mais claro a qual tabela o campo pertence, algo mais ou menos assim:
Tabela Clientes :
CODI_CLI, NOME_CLI, FONE_CLI
Tabela Fornecedores:
CODI_FOR, DESC_FOR, FONE_FOR
Tabela Produtos:
CODI_PRO, DESC_PRO, UNID_PRO, CODI_FOR (campo relacionado a tabela fornecedores).
Assim acho que fica mais fácil de saber qual o campo que faz relacionamento a qual tabela do banco.
Atenciosamente,
André Luis da Silveira.
Ops.. Obrigado pelas considerações!
GOSTEI 0
Marco Salles
17/03/2011
Além da nomenclatura dar uma orientação melhor ao desevolvimento , eu particularmente , para evitar problemas iniciais relatado por vc , gosto de deixar o nome do relacionamento. Evitara problemas relatoado inicialmente por vc
alé de ter que ficar criando solução ou paleativos para contornar o problema
Table Contato ID_Cont; Nome_Cont SqlCliente (select * from contato) Tabela Telefone ID_Tel ID_Cont ; apesar deste campo não seguir a padronização do nome ele mostra claramente do que se trata Telefone_Tel SqlTelefone (sql * from telefone where Contato_ID = :Contato_ID)
GOSTEI 0