Fórum Cadastro único com mestre detalhe entre 4 tabelas #600773
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)