Array
(
)

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

Max.jgs
   - 08 nov 2005


Citação:
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...


Bruno Belchior
   - 09 nov 2005

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


Kotho
   - 09 nov 2005

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

#Código

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, []) 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...


Lenasi
   - 01 set 2009


Citação:
Se estiver usando ClientDataSet, você pode utilizar um recurso legal, chamado CloneCursor...

#Código

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, []) 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.


Osocram
   - 01 set 2009

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

#Código

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, []) 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.


Lenasi
   - 01 set 2009

[tagcod]
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?


Osocram
   - 01 set 2009

Não é preciso nada p funcionar locate.

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



Citação:
[tagcod]
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?