Guest Deville Postado Agosto 9, 2007 Denunciar Share Postado Agosto 9, 2007 beleza Pessoal!Em Delphi5.Tenho duas tabelas: Clientes e Dependentes. Como faço para salvar um cliente com N dependentes usando Table sem dar erro de integridade da chave da tabela cliente, já que as tabelas estão ligadas pelo MasterSource e ListSource.Valeu. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Agosto 9, 2007 Denunciar Share Postado Agosto 9, 2007 Tenho duas tabelas: Clientes e Dependentes. Como faço para salvar um cliente com N dependentes usando Table sem dar erro de integridade da chave da tabela cliente, já que as tabelas estão ligadas pelo MasterSource e ListSource.Deville, você tem que gravar o Cliente primeiro, para obter o código chave (acho que você utiliza AutoIncrement). Após o Post do cliente, você terá o campo chave que deverá ser atribuído ao respectivo campo na tabela Dependentes, utilizando o evento OnNewRecord.Algo mais ou menos assim:procedure TForm1.TabDependentesNewRecord(Objects :TDataSet); begin TabDependentesCodCliente.Value := TabClienteCodCliente.Value; end;ao criar um novo dependente (OnNewRecord), pressupõe-se que será para o cliente atualmente selecionado (atual registro na tabela clientes).Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Deville Postado Agosto 9, 2007 Denunciar Share Postado Agosto 9, 2007 (editado) Micheus, Antes de mais nada obrigado pela resposta.Vou detalhar como estou fazendo...Primeiro coloco a tabela em Insert:DM.DBSistema.StartTransaction; DM.tbCliente.Insert; Segundo no "AfterInsert" eu faço uma consulta no BD e crio uma Chave.with DM.tbCliente do begin FieldByName('cdCliente').AsString := vCliente; FieldByName('status').AsString := 'Ativo'; FieldByName('completo').AsString := 'N'; end; * Neste ponto eu já tenho na tabela Dependentes o evento NewRecord com:DM.tbDependente.FieldByName('cdCliente').AsString := DM.tbCliente.FieldByName('cdCliente').AsString * E também o Evento BeforeInsert com:if DM.tbCliente.State in [dsEdit, dsInsert] then DM.tbCliente.Post; Terceiro eu uso uma função (Carrega_Dependentes) para pré incluir 03 dependentes por Default.... for x := 1 to 3 do begin DM.tbDependente.Insert; DM.tbDependente.FieldByName('numDependente').AsInteger := x; Next; end; ... Se eu Gravar:try with DM do begin if (tbCliente.State in [dsEdit, dsInsert]) then tbCliente.Post; if (tbDependente.State in [dsEdit, dsInsert]) then tbDependente.Post; end; DM.DBSistema.Commit; except DM.DBSistema.Rollback; end; Dá Tudo Beleza mas... Se eu Cancelar: with DM do begin if (tbCliente.State in [dsEdit, dsInsert]) then tbCliente.Cancel; if (tbDependente.State in [dsEdit, dsInsert]) then tbDependente.Cancel; DBLavoisier.Rollback; end;Não cancela a parte que eu gravei automatico: CLIENTE: cdCliente, status e completo; Registro('XPTO', 'Ativo', 'N'); DEPENDENTE: numDependente. Registro(1....2....3);Porque que o Rollback não desfaz tudo?obs: Se não for abusar, você tem um esqueletinho de como você faria este programinha.Abraço. Editado Agosto 9, 2007 por Micheus Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Agosto 9, 2007 Denunciar Share Postado Agosto 9, 2007 Deville, é impressão minha ou a dúvida agora é apenas: por que o rollback não funciona?Que banco de dados você utiliza?Lá na tal função que você colocou parte, o que é aquele Next? Não estaria faltando também um Post, para que a cada dependente default inserido o mesmo seja gravado?Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Deville Postado Agosto 9, 2007 Denunciar Share Postado Agosto 9, 2007 Micheus, O Banco que eu uso é o Oracle mas o problema do Rollback é que eu não estava dando Refresh nas Tabelas, por isto, parecia que não funcionava.Ah! aquele Next não deveria estar ali (é um FOR).A pergunta para finalizar é: Esta é a forma correta e/ou a melhor forma de se usar Mestre/Detalhes no componente Table?Obrigado pela forçaDeville Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Agosto 9, 2007 Denunciar Share Postado Agosto 9, 2007 A pergunta para finalizar é: Esta é a forma correta e/ou a melhor forma de se usar Mestre/Detalhes no componente Table?com Table, que eu saiba, não teria outra melhor. E com query, seria similar. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Guest Deville
beleza Pessoal!
Em Delphi5.
Tenho duas tabelas: Clientes e Dependentes. Como faço para salvar um cliente com N dependentes usando Table sem dar erro de integridade da chave da tabela cliente, já que as tabelas estão ligadas pelo MasterSource e ListSource.
Valeu.
Link para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.