Como localizar registro para não gravar 2 vezes com Locate..
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
Curtidas 0
Respostas
Bruno Belchior
08/11/2005
Quando você dá um Locate ele tira seu DataSet de modo de edição/inserção...
GOSTEI 0
Kotho
08/11/2005
Se estiver usando ClientDataSet, você pode utilizar um recurso legal, chamado CloneCursor...
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...
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...
GOSTEI 0
Lenasi
08/11/2005
Se estiver usando ClientDataSet, você pode utilizar um recurso legal, chamado CloneCursor...
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...
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;
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.
GOSTEI 0
Osocram
08/11/2005
fiz algumas alterações que eu considero p ficar mais correto.
Acho que ta bem explicado agora.
Bom aprendizado.
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.
GOSTEI 0
Lenasi
08/11/2005
[code]
Acho que ta bem explicado agora.
Bom aprendizado.
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?
GOSTEI 0
Osocram
08/11/2005
Não é preciso nada p funcionar locate.
Acho que o unico problema é q ele não é incremental.
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?
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?
GOSTEI 0