Ir para conteúdo
Fórum Script Brasil
  • 0

Como Salvar Mestre/detalhe Usando Table?


Guest Deville

Pergunta

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

  • 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 para o comentário
Compartilhar em outros sites

  • 0

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 por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

  • 0

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 para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...