Cadastro único com mestre detalhe entre 4 tabelas
25/02/2019
0
Criei um cadastro com 4 tabelas em um db access tabela Pessoa, contato, e-mail, endereço o campo código da tabela pessoa e fk nas outras 3 tabelas campo codigo_pessoa. Estou com problema para gravar com formulário de cadastro único. acontece o seguinte da post na primeira e diz que as outras não estão em insert mode. como cadastrar de uma unica vez todo os registros nas 4 tabelas senda que no campo codigo_pessoa vai precisar do código da tabela pessoa?
Abaixo codigo da app:
Abaixo codigo da app:
unit uCadastrarNovoContato; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.ExtCtrls, Vcl.DBCtrls, Vcl.Grids, Vcl.DBGrids, Data.Win.ADODB, Vcl.StdCtrls, Vcl.Mask, uDmPrincipal; type TFrmCadastrarNovoContato = class(TForm) Label1: TLabel; DBEdit1: TDBEdit; Label2: TLabel; Label3: TLabel; DBEdit3: TDBEdit; DBComboBox1: TDBComboBox; Label4: TLabel; DBEdit2: TDBEdit; Label5: TLabel; DBEdit4: TDBEdit; Label6: TLabel; DBEdit5: TDBEdit; Label7: TLabel; DBEdit6: TDBEdit; Label8: TLabel; DBEdit7: TDBEdit; Label9: TLabel; DBEdit8: TDBEdit; Label10: TLabel; Button1: TButton; Button5: TButton; Button6: TButton; DBCEstado: TDBComboBox; procedure Button1Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var FrmCadastrarNovoContato: TFrmCadastrarNovoContato; implementation {$R *.dfm} procedure TFrmCadastrarNovoContato.Button1Click(Sender: TObject); begin DmPrincipal.ADOTPessoa.Active:=True; DmPrincipal.ADOTContato.Active:=True; DmPrincipal.ADOTEmail.Active:=True; DmPrincipal.ADOTEndereco.Active:=True; DmPrincipal.ADOTPessoa.Insert; DmPrincipal.ADOTContato.Insert; DmPrincipal.ADOTEmail.Insert; DmPrincipal.ADOTEndereco.Insert; DBCEstado.ItemIndex := 15; DBEdit1.SetFocus; end; procedure TFrmCadastrarNovoContato.Button5Click(Sender: TObject); begin end; procedure TFrmCadastrarNovoContato.Button6Click(Sender: TObject); begin Application.Terminate end; procedure TFrmCadastrarNovoContato.FormShow(Sender: TObject); begin DmPrincipal.ADOTPessoa.Active:=false; DmPrincipal.ADOTContato.Active:=false; DmPrincipal.ADOTEmail.Active:=false; DmPrincipal.ADOTEndereco.Active:=false; Button1.SetFocus; end; end.
Paulo Carvalho
Curtir tópico
+ 0
Responder
Posts
25/02/2019
Hélio Devmedia
Olá Paulo,
Desta forma você terá que fazer tudo via linha de código, copiando a chave estrangeira para os demais datasets.
Neste ponto você não pode utilizar as propriedades masterSource e masterFields são para filtrar a consulta e não para salvar em cache, que é o que vc precisa.
A Melhor forma de você fazer isso é reestruturar um pouco os seus componentes adicionando na equação o ClientDataSet e o DataSetProvider.
Eles trabalham em conjunto de forma que quando você não precisa ficar dando insert em cada um deles. o primeiro dataset vai comandar tudo...
e quando você der um applyupdate no primeiro dataSet ele faz toda a gravação dos demais de forma sincronizada, mas para isso você vai ter que estudar o artigo.
Veja o seguinte artigo da DevMedia: https://www.devmedia.com.br/mestre-detalhe-em-delphi/16388
só que ao invés de utilizar SQLDataSet você irá utilizar um ADOQuery ...
Espero ter ajudado. Um forte abraço e fique com Deus.
Desta forma você terá que fazer tudo via linha de código, copiando a chave estrangeira para os demais datasets.
Neste ponto você não pode utilizar as propriedades masterSource e masterFields são para filtrar a consulta e não para salvar em cache, que é o que vc precisa.
A Melhor forma de você fazer isso é reestruturar um pouco os seus componentes adicionando na equação o ClientDataSet e o DataSetProvider.
Eles trabalham em conjunto de forma que quando você não precisa ficar dando insert em cada um deles. o primeiro dataset vai comandar tudo...
e quando você der um applyupdate no primeiro dataSet ele faz toda a gravação dos demais de forma sincronizada, mas para isso você vai ter que estudar o artigo.
Veja o seguinte artigo da DevMedia: https://www.devmedia.com.br/mestre-detalhe-em-delphi/16388
só que ao invés de utilizar SQLDataSet você irá utilizar um ADOQuery ...
Espero ter ajudado. Um forte abraço e fique com Deus.
Responder
Clique aqui para fazer login e interagir na Comunidade :)