Jump to content
Fórum Script Brasil
  • 0

Como Salvar Mestre/detalhe Usando Table?


Guest Deville
 Share

Question

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 to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0
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

Link to comment
Share on other sites

  • 0
Guest Deville

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.

Edited by Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link to comment
Share on other sites

  • 0

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

Link to comment
Share on other sites

  • 0
Guest Deville

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ça

Deville

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.4k
×
×
  • Create New...