ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Editar dados obtidos em consulta em ClientDataSet diferentes

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
RefPina
Novato
Novato


Registrado: Quinta-Feira, 31 de Outubro de 2019
Mensagens: 43
Localização: São Paulo

MensagemEnviada: Seg Nov 04, 2019 5:28 pm    Assunto: Editar dados obtidos em consulta em ClientDataSet diferentes Responder com Citação

Boa tarde Pessoal,
tenho um form de cadastro de termos, dentro deste form tenho os edits, labels, botões para cadastrar um novo termo. Dentro desse mesmo form tambem tenho dois dblookupcombobox que fazem parte do cadastro e tambem da pesquisa, para a pesquisa alem dos dblookup tenho um edit, um botão(Pesquisar) e um DBGrid. A pesquisa é realizada por um ClientDataSet e a inclusão e edição por outro ClientDataSet. Fiz isso pois por decisão do chefe o DBGrid tem que entrar vazio e somente retornar os dados pesquisados. O que não estou conseguindo fazer é que após o DBGrid retornar a pesquisa o usuario tem a opção de editar aquele registro. No evento oncellclick ele preenche os edits com o resultado da pesquisa, mas quando clica em salvar ele cria um novo registro ao inves de editar o selecionado. Alguém poderia me auxiliar com esta edição. Resumindo: Quando clicar na célula do DBGrid(clientdataset5) da consulta, editar registro (ClientDataSet4). Agradeço desde já.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Nov 04, 2019 8:41 pm    Assunto: Responder com Citação

Boa noite,

Você está utilizando Edits mesmo ou DBEdits?
Antes de editar o registro você vai precisar posicionar o ClientDataSet no registro a ser editado, e a princípio você pode utilizar o método Locate do ClientDataSet para essa finalidade.
Se você estiver utilizando Edits vai ser necessário executar o método Edit, carregar os valores do Edits nos campos do ClientDataSet, e depois executar os métodos Post e ApplyUpdates.
A sequencia é parecida se você estiver utilizando DBEdits, só que nesse caso não é necessário carregar os valores dos campos nos Edits e nem carregar os valores do Edits nos campos, pois os DBEdits fazem isso automaticamente.

Espero que ajude


Editado pela última vez por imex em Seg Dez 04, 2023 11:57 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
RefPina
Novato
Novato


Registrado: Quinta-Feira, 31 de Outubro de 2019
Mensagens: 43
Localização: São Paulo

MensagemEnviada: Seg Nov 04, 2019 9:47 pm    Assunto: Responder com Citação

Boa noite Imex,
Primeiramente obrigado pela dica. Uso edit e carrego eles com o resultado da pesquisa. Será que você poderia me dar um exemplo de como usar o Locate neste caso, por gentileza? Obrigado mais uma vez.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Nov 05, 2019 9:51 am    Assunto: Responder com Citação

Bom dia,

Segue um exemplo considerando que o campo IdTermo é a chave primária da tabela:

Código:
if ClientDataSet4.Locate('IdTermo', ClientDataSet5.FieldByName('IdTermo').AsInteger, []) then
  begin
    ClientDataSet4.Edit;
  end
else
  ShowMessage('Registro não encontrado');


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
RefPina
Novato
Novato


Registrado: Quinta-Feira, 31 de Outubro de 2019
Mensagens: 43
Localização: São Paulo

MensagemEnviada: Ter Nov 05, 2019 11:11 am    Assunto: Responder com Citação

Bom dia Imex,
Desculpe te incomodar novamente, implementei o código que me mandou, mas ele continua salvando dois registros no banco ao inves de editar. Acho que não estou colocando o código no evento correto. Pode me auxiliar por favor? Obrigado.

Código:
  procedure Tfrmwsconfig.SBpesquisaClick(Sender: TObject);

  begin
   operacao:='pesquisa';
  if DBLookupComboBox5.KeyValue = null then
  begin
    ShowMessage('Selecione uma língua de chegada.');
    abort;
    edtPesquisa.Clear;
    DBLookupComboBox4.KeyValue := null;
  end;

  ClientDataSet5.Close;
  ClientDataSet5.ParamByName('pcod').AsInteger := DBLookupComboBox4.KeyValue;
  ClientDataSet5.ParamByName('plc').AsInteger := DBLookupComboBox5.KeyValue;
  ClientDataSet5.ParamByName('tlp').AsString := '%' + UpperCase(edtPesquisa.Text) + '%';
  ClientDataSet5.Open;
    if ClientDataSet5.IsEmpty then
    begin
      ShowMessage('Termo não cadastrado.');
    end;
    edtPesquisa.Clear;
    abort;
    if ClientDataSet4.Locate('termolp',clientdataset5.FieldByName('termolp').AsString, []) then
    begin
      ClientDataSet4.Edit;
    end;
  end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Nov 05, 2019 11:45 am    Assunto: Responder com Citação

Os comandos colocados depois do Abort não são executados, pois o Abort gera uma exceção.
De qualquer forma, acho que você pode executar o Locate no botão salvar, antes de carregar os valores dos Edits nos campos.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
RefPina
Novato
Novato


Registrado: Quinta-Feira, 31 de Outubro de 2019
Mensagens: 43
Localização: São Paulo

MensagemEnviada: Ter Nov 05, 2019 2:08 pm    Assunto: Responder com Citação

Imex,
Implementei no botão editar antes de carregar os edits e funcionou certinho está parte. Mais uma duvida, quando clico no editar, após o retorno da pesquisa o sistema cai no evento AfterPost do ClientDataSet. Alguma dica para resolver isto? Já tentei criar uma variavel private com nome de operação e fiz um if then else para ele comparar com o resultado da variavel, mas não deu certo ele continua caindo no AfterPost quando clico em editar.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Nov 05, 2019 4:09 pm    Assunto: Responder com Citação

Acho que você primeiro teria que verificar qual linha de código está provocando a ocorrência do AfterPost. Para isso seria melhor você colocar um BreakPoint no início do código do botão editar e depois prosseguir a execução passo a passo com F8. Dependendo do caso pode ser necessário prosseguir com F7 ao chegar na linha em questão.
A execução de vários métodos podem provocar o Post automático, inclusive a execução do método Edit.
Outro ponto é que se está ocorrendo o AfterPost é porque o ClientDataSet estava em modo de inserção ou edição, então você também tem que verificar se realmente deveria estar em um desses modos, e se é o caso de cancelar ou confirmar o que estava sendo feito.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
RefPina
Novato
Novato


Registrado: Quinta-Feira, 31 de Outubro de 2019
Mensagens: 43
Localização: São Paulo

MensagemEnviada: Qua Nov 06, 2019 1:42 pm    Assunto: Responder com Citação

Boa tarde Imex, segui o que me indicou de debugg e já resolvi o erro. No caso o meu clientdataset estava em modo de edição quando recebia o Locate e por isso caia no AfterPost.
Muito obrigado pela disposição.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB