Como localizar registro para não gravar 2 vezes com Locate..

08/11/2005

Procedure T_Cargos.T_CargosBeforePost(DataSet: TDataSet); begin DM.T_CargosLocate.Active:= true; if DM.T_CargosLocate.locate(´Cargo´,_Funcionarios.ComboBox1.text,[lopartialKey]) = true then begin T_Cargos.Cancel; DM.T_CargosLocate.Active:= false; end; end;


Aonde estou errando...


Max.jgs

Respostas

09/11/2005

Bruno Belchior

Quando você dá um Locate ele tira seu DataSet de modo de edição/inserção...


Responder Citar

09/11/2005

Kotho

Se estiver usando ClientDataSet, você pode utilizar um recurso legal, chamado CloneCursor...

procedure TfrmCadSeqProducao.CdsCadSeqProducaoOS_NUMValidate(Sender: TField);
var
  vCdsCadSeqProducao: TClientDataSet;
  vCdProduto: String;
begin
  inherited;
  vCdsCadSeqProducao := TClientDataSet.Create(Self);
  vCdsCadSeqProducao.CloneCursor(CdsCadSeqProducao, False);
  try
    if vCdsCadSeqProducao.Locate(´OS_NUM´, Sender.AsString, [&93;) then
      raise EErro.Create(´OS já digitada!´);
  finally
    FreeAndNil(vCdsCadSeqProducao);
  end;
end;


Dessa forma, os dados são os mesmos, tanto se fizer alguma alteração no vCdsCadSeqProducao, irá alterar os dados em CdsCadSeqProducao... mas a posição do cursor é diferente...


Responder Citar

01/09/2009

Lenasi

Se estiver usando ClientDataSet, você pode utilizar um recurso legal, chamado CloneCursor...
procedure TfrmCadSeqProducao.CdsCadSeqProducaoOS_NUMValidate(Sender: TField);
var
  vCdsCadSeqProducao: TClientDataSet;
  vCdProduto: String;
begin
  inherited;
  vCdsCadSeqProducao := TClientDataSet.Create(Self);
  vCdsCadSeqProducao.CloneCursor(CdsCadSeqProducao, False);
  try
    if vCdsCadSeqProducao.Locate(´OS_NUM´, Sender.AsString, [&93;) then
      raise EErro.Create(´OS já digitada!´);
  finally
    FreeAndNil(vCdsCadSeqProducao);
  end;
end;
Dessa forma, os dados são os mesmos, tanto se fizer alguma alteração no vCdsCadSeqProducao, irá alterar os dados em CdsCadSeqProducao... mas a posição do cursor é diferente...


Olá Amigo,
Sou novo por aqui, e achei seu post na pesquisa, pois é exatamente do que precisava....
Só queria uma ajuda em questão dos códigos.
Poderia me descrever o que faz linha a linha, para que eu entenda mehlor e adapte ao meu sistema?

Muito obrigado.


Responder Citar

01/09/2009

Osocram

fiz algumas alterações que eu considero p ficar mais correto.

procedure TfrmCadSeqProducao.CdsCadSeqProducaoOS_NUMValidate(Sender: TField);
var
  vCdsCadSeqProducao: TClientDataSet;
  vCdProduto: String;
begin
  inherited;
  //cria o clientDataSet em tempo de execução
  //troquei o self por nil pois quem vai controlar a destruição dele é vc mesmo, la no finally
  //vCdsCadSeqProducao := TClientDataSet.Create(self);
  vCdsCadSeqProducao := TClientDataSet.Create(NIL);
  //Cria um clone do cursor do ClientDataSet CdsCadSeqProducao
  vCdsCadSeqProducao.CloneCursor(CdsCadSeqProducao, False);
  try
  //não sei se é necessario isso aqui antes do locate, mas ja tive problemas, então eu sempre faço um First antes
  vCdsCadSeqProducao.first;

    //aqui ele localiza o registro
    if vCdsCadSeqProducao.Locate(´OS_NUM´, Sender.AsString, [&93;) then
      //raise EErro.Create(´OS já digitada!´);
      //Não acho elegante ficar criando exception a toa. qdo é apenas p notificar o usuario
      showmessage(´OS já digitada!´);
  finally
    //aqui libera o componente criado em tempo de execução
    FreeAndNil(vCdsCadSeqProducao);
  end;
end;

Acho que ta bem explicado agora.
Bom aprendizado.


Responder Citar

01/09/2009

Lenasi

[code]
Acho que ta bem explicado agora.
Bom aprendizado.[/quote]


AMIGO, FANTÁSTICO... PARABÉNS!!!
ÓTIMA EXPLICAÇÃO....
ESTÁ FUNCIONANDO PERFEITAMENTE...

UMA DÚVIDA:
COM RELAÇÃO AO BANCO, PRECISO FAZER ALGO PARA ESTAR UTILIZANDO O LOCATE? APESAR DE ESTAR FUNCIONANDO...
ME LEMBRO VAGAMENTE DE ALGUMA COISA, TIPO CRIAR, UNIQUES. É ISSO? PRECISA MESMO?


Responder Citar

01/09/2009

Osocram

Não é preciso nada p funcionar locate.

Acho que o unico problema é q ele não é incremental.


[code] Acho que ta bem explicado agora. Bom aprendizado.



AMIGO, FANTÁSTICO... PARABÉNS!!!
ÓTIMA EXPLICAÇÃO....
ESTÁ FUNCIONANDO PERFEITAMENTE...

UMA DÚVIDA:
COM RELAÇÃO AO BANCO, PRECISO FAZER ALGO PARA ESTAR UTILIZANDO O LOCATE? APESAR DE ESTAR FUNCIONANDO...
ME LEMBRO VAGAMENTE DE ALGUMA COISA, TIPO CRIAR, UNIQUES. É ISSO? PRECISA MESMO?[/quote]


Responder Citar