Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
RefPina Novato
Registrado: Quinta-Feira, 31 de Outubro de 2019 Mensagens: 43 Localização: São Paulo
|
Enviada: Seg Nov 04, 2019 5:28 pm Assunto: Editar dados obtidos em consulta em ClientDataSet diferentes |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Nov 04, 2019 8:41 pm Assunto: |
|
|
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 |
|
|
RefPina Novato
Registrado: Quinta-Feira, 31 de Outubro de 2019 Mensagens: 43 Localização: São Paulo
|
Enviada: Seg Nov 04, 2019 9:47 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Nov 05, 2019 9:51 am Assunto: |
|
|
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 |
|
|
RefPina Novato
Registrado: Quinta-Feira, 31 de Outubro de 2019 Mensagens: 43 Localização: São Paulo
|
Enviada: Ter Nov 05, 2019 11:11 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Nov 05, 2019 11:45 am Assunto: |
|
|
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 |
|
|
RefPina Novato
Registrado: Quinta-Feira, 31 de Outubro de 2019 Mensagens: 43 Localização: São Paulo
|
Enviada: Ter Nov 05, 2019 2:08 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Nov 05, 2019 4:09 pm Assunto: |
|
|
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 |
|
|
RefPina Novato
Registrado: Quinta-Feira, 31 de Outubro de 2019 Mensagens: 43 Localização: São Paulo
|
Enviada: Qua Nov 06, 2019 1:42 pm Assunto: |
|
|
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 |
|
|
|