Cadastro único com mestre detalhe entre 4 tabelas

25/02/2019

8

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:
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

Paulo Carvalho

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.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar