Registros duplicados ClientDataSet Temporário
Fui incumbido do seguinte:
Preciso criar um formulário de cadastro de cheques com os seguinte campos:
Banco, NumeroCheque, Vencimento, Valor até ai tudo bem. Estou usando um ClientDataSet temporário. Fiz da seguinte forma criei um indeci unique, resolveu. Mas acontece que o cheque quer que o usuário cadastre os dados do cheque a vontade e só depois que clicar no botão salvar é preciso varrer o dbgrid e se for descoberto número iguais, pintar a grid.
Alguém poderia me ajudar nessa empreitada. Ozias
Preciso criar um formulário de cadastro de cheques com os seguinte campos:
Banco, NumeroCheque, Vencimento, Valor até ai tudo bem. Estou usando um ClientDataSet temporário. Fiz da seguinte forma criei um indeci unique, resolveu. Mas acontece que o cheque quer que o usuário cadastre os dados do cheque a vontade e só depois que clicar no botão salvar é preciso varrer o dbgrid e se for descoberto número iguais, pintar a grid.
Alguém poderia me ajudar nessa empreitada. Ozias
Oziasl
Curtidas 0
Respostas
Macario
11/12/2006
Olá boa tarde Ozias,
Vejamos se posso lhe ajudar.
Voce tem a seguinte estrutura:
Altere para:
Este campo Flag, sera usado para identificar os registros não únicos.
o codigo seria algo como:
Ai visualmente voce identifica os registros fazendo uso do campo Flag, pintando o grid(evento OnDrawColumnCell).
Espero que lhe ajude;
8)
Vejamos se posso lhe ajudar.
Voce tem a seguinte estrutura:
Banco(integer), NumeroCheque(varchar), Vencimento(datetime), Valor(float oucurrency)
Altere para:
Banco(integer), NumeroCheque(varchar), Vencimento(datetime), Valor(float oucurrency), Flag(boolean)
Este campo Flag, sera usado para identificar os registros não únicos.
o codigo seria algo como:
var cdsClone: TClientDataSet; begin cdsClone := TClientDataSet.Create(self); try cdsClone.CloneCursor(cdsTemp, True); cdsClone.IndexFieldNames := ´BANCO;NUMEROCHEQUE´; cdsTemp.first; while not cdsTemp.eof do begin cdsClone.SetKey; cdsClone.FieldByName(´BANCO´).AsInteger := cdsTemp.FieldByName(´BANCO´).AsInteger; cdsClone.FieldByName(´NUMEROCHEQUE´).AsString := cdsTemp.FieldByName(´NUMEROCHEQUE´).AsString; if (cdsClone.GotoKey) then begin cdsTemp.edit; cdsTemp.FieldByName(´FLAG´).AsBoolean := true; cdsTemp.post; end; cdsTemp.next; end; finally cdsClone.Free; end; end;
Ai visualmente voce identifica os registros fazendo uso do campo Flag, pintando o grid(evento OnDrawColumnCell).
Espero que lhe ajude;
8)
GOSTEI 0
Oziasl
11/12/2006
Macario, por enquanto obrigado pela ajuda. Mas não está dando certo.
Pela sua dica os flags de todos os campos passam para true.
A idéia é mudar para true somente os campos que possuírem Banco e NumeroCheque que foram digitados mais de uma vez, ou seja digitados em duplicidades.
Tipo:
Banco NumeroCheque Vencimento valor flag
100 123456 30/11/2006 10,00 true
101 123456 01/12/2006 10,00 false
100 123456 02/12/2006 10,00 true
Toda a ajuda é bem vinda. Obrigado.
Pela sua dica os flags de todos os campos passam para true.
A idéia é mudar para true somente os campos que possuírem Banco e NumeroCheque que foram digitados mais de uma vez, ou seja digitados em duplicidades.
Tipo:
Banco NumeroCheque Vencimento valor flag
100 123456 30/11/2006 10,00 true
101 123456 01/12/2006 10,00 false
100 123456 02/12/2006 10,00 true
Toda a ajuda é bem vinda. Obrigado.
GOSTEI 0
Macario
11/12/2006
Olá Ozias.
No exemplo que postei é totalmente funcional.
O que você tem que faze é no momento do cadastro (no cdsTemp por exemplo) ja setar o campo Flag para false. Não sei se por padrão campos booleanos são iniciados como true.
Verifique este ponto.
[]´s
No exemplo que postei é totalmente funcional.
O que você tem que faze é no momento do cadastro (no cdsTemp por exemplo) ja setar o campo Flag para false. Não sei se por padrão campos booleanos são iniciados como true.
Verifique este ponto.
[]´s
GOSTEI 0
Oziasl
11/12/2006
Macario, fiz o que você me falou na ultima dica mas não funcionou. Continua ainda mudando todos os campos flag para true;
Estou fazendo assim, veja se está certo:
Coloco um clientdataset no form com o nome cdstemp, crio os campos e em seguida clico com o lado direito no clientdataset e escolho a opção create dataset. Coloquei um dbgrid apontando para datasource que está ligado no cdstemp, em seguida coloquei a codificação que vc me enviou num botão. No evento DrawColumnCell da dbgrid faço a checagem para pintar as células. Está pintando legal, só q, como os campo mudando todos para flag = true, todas as células são pintadas.
Pergunta: É preciso criar indice na tabela cdstemp?
Por enquanto muito obrigado.
Estou fazendo assim, veja se está certo:
Coloco um clientdataset no form com o nome cdstemp, crio os campos e em seguida clico com o lado direito no clientdataset e escolho a opção create dataset. Coloquei um dbgrid apontando para datasource que está ligado no cdstemp, em seguida coloquei a codificação que vc me enviou num botão. No evento DrawColumnCell da dbgrid faço a checagem para pintar as células. Está pintando legal, só q, como os campo mudando todos para flag = true, todas as células são pintadas.
Pergunta: É preciso criar indice na tabela cdstemp?
Por enquanto muito obrigado.
GOSTEI 0
Macario
11/12/2006
Olá Ozias, boa tarde.
Me relamente voce esta certo, o codigo nao funciona.
Precisamos lá de um ´2º agente auxiliar´.
veja este novo exemplo(não cheguei a testar).
Me relamente voce esta certo, o codigo nao funciona.
Precisamos lá de um ´2º agente auxiliar´.
veja este novo exemplo(não cheguei a testar).
var
cdsClone: TClientDataSet;
List: TStringList;
sChave : String;
begin
cdsClone := TClientDataSet.Create(self);
[b:b398fe1577][color=orange:b398fe1577]List := TStringList.Create;[/color:b398fe1577][/b:b398fe1577]
[b:b398fe1577]cdsTemp.indexFieldNames := ´BANCO;NUMEROCHEQUE;[/b:b398fe1577]
try
cdsClone.CloneCursor(cdsTemp, True);
[b:b398fe1577]cdsClone.IndexFieldNames := ´BANCO;NUMEROCHEQUE´;[/b:b398fe1577]
cdsTemp.first;
while not cdsTemp.eof do
begin
sChave := cdsTemp.FieldByName(´BANCO´).AsString+cdsClone.FieldByName(´NUMEROCHEQUE´).AsString;
[b:b398fe1577][color=orange:b398fe1577]if (List.IndexOf(sChave) =-1) then[/color:b398fe1577][/b:b398fe1577] begin
List.Add(sChave);
end
else
begin
cdsClone.SetKey;
cdsClone.FieldByName(´BANCO´).AsInteger := cdsTemp.FieldByName(´BANCO´).AsInteger;
cdsClone.FieldByName(´NUMEROCHEQUE´).AsString := cdsTemp.FieldByName(´NUMEROCHEQUE´).AsString;
if (cdsClone.GotoKey) then
begin
cdsTemp.edit;
cdsTemp.FieldByName(´FLAG´).AsBoolean := true;
cdsTemp.post;
end;
end;
cdsTemp.next;
end;
finally
cdsClone.Free;
FreeAndNil(List);
end;
end;
GOSTEI 0
Oziasl
11/12/2006
Macário, muito obrigado mesmo. Agora funcionou legal. Fiz somente uma pequena mudança, ou seja acresci as seguintes linhas. Esse Fórum é d+...
cdstemp.first;
while not cdstemp.eof do
begin
cdstemp.edit;
cdstemp.fieldbyname(´Flag´).asBoolean := False;
cdstemp.post;
end;
agora a dica que você me passou:
ar
cdsClone: TClientDataSet;
List: TStringList;
sChave : String;
begin
cdsClone := TClientDataSet.Create(self);
List := TStringList.Create;
cdsTemp.indexFieldNames := ´BANCO;NUMEROCHEQUE;
try
cdsClone.CloneCursor(cdsTemp, True);
cdsClone.IndexFieldNames := ´BANCO;NUMEROCHEQUE´;
cdsTemp.first;
while not cdsTemp.eof do
begin
sChave := cdsTemp.FieldByName(´BANCO´).AsString+cdsClone.FieldByName(´NUMEROCHEQUE´).AsString;
if (List.IndexOf(sChave) =-1) then begin
List.Add(sChave);
end
else
begin
cdsClone.SetKey;
cdsClone.FieldByName(´BANCO´).AsInteger := cdsTemp.FieldByName(´BANCO´).AsInteger;
cdsClone.FieldByName(´NUMEROCHEQUE´).AsString := cdsTemp.FieldByName(´NUMEROCHEQUE´).AsString;
if (cdsClone.GotoKey) then
begin
cdsTemp.edit;
cdsTemp.FieldByName(´FLAG´).AsBoolean := true;
cdsTemp.post;
end;
end;
cdsTemp.next;
end;
finally
cdsClone.Free;
FreeAndNil(List);
end;
end;
cdstemp.first;
while not cdstemp.eof do
begin
cdstemp.edit;
cdstemp.fieldbyname(´Flag´).asBoolean := False;
cdstemp.post;
end;
agora a dica que você me passou:
ar
cdsClone: TClientDataSet;
List: TStringList;
sChave : String;
begin
cdsClone := TClientDataSet.Create(self);
List := TStringList.Create;
cdsTemp.indexFieldNames := ´BANCO;NUMEROCHEQUE;
try
cdsClone.CloneCursor(cdsTemp, True);
cdsClone.IndexFieldNames := ´BANCO;NUMEROCHEQUE´;
cdsTemp.first;
while not cdsTemp.eof do
begin
sChave := cdsTemp.FieldByName(´BANCO´).AsString+cdsClone.FieldByName(´NUMEROCHEQUE´).AsString;
if (List.IndexOf(sChave) =-1) then begin
List.Add(sChave);
end
else
begin
cdsClone.SetKey;
cdsClone.FieldByName(´BANCO´).AsInteger := cdsTemp.FieldByName(´BANCO´).AsInteger;
cdsClone.FieldByName(´NUMEROCHEQUE´).AsString := cdsTemp.FieldByName(´NUMEROCHEQUE´).AsString;
if (cdsClone.GotoKey) then
begin
cdsTemp.edit;
cdsTemp.FieldByName(´FLAG´).AsBoolean := true;
cdsTemp.post;
end;
end;
cdsTemp.next;
end;
finally
cdsClone.Free;
FreeAndNil(List);
end;
end;
GOSTEI 0
Macario
11/12/2006
Olá, Ozias.
reveja este trecho pois da maneira que se encotra ele fara um looping infinito..
No mais funcionou a dica?
[]´s
reveja este trecho pois da maneira que se encotra ele fara um looping infinito..
cdstemp.first; while not cdstemp.eof do begin cdstemp.edit; cdstemp.fieldbyname(´Flag´).asBoolean := False; cdstemp.post; end;
No mais funcionou a dica?
[]´s
GOSTEI 0
Oziasl
11/12/2006
Macário,
Retificando:
cdstemp.first;
while not cdstempo.eof do
begin
cdstemp.edit;
cdstemp.fieldbyname(´Flag´).AsBoolean := False;
cdstemp.post;
cdstemp.next;
end;
No meu código fiz certo, na hora de postar aqui no forum é que coloquei a codifiçação faltando o cdstemp.next
Valeu.
Retificando:
cdstemp.first;
while not cdstempo.eof do
begin
cdstemp.edit;
cdstemp.fieldbyname(´Flag´).AsBoolean := False;
cdstemp.post;
cdstemp.next;
end;
No meu código fiz certo, na hora de postar aqui no forum é que coloquei a codifiçação faltando o cdstemp.next
Valeu.
GOSTEI 0