Fórum Registros duplicados ClientDataSet Temporário #334558

11/12/2006

0

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


Oziasl

Oziasl

Responder

Posts

12/12/2006

Macario

Olá boa tarde Ozias,

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)


Responder

Gostei + 0

13/12/2006

Oziasl

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.


Responder

Gostei + 0

13/12/2006

Macario

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


Responder

Gostei + 0

13/12/2006

Oziasl

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.


Responder

Gostei + 0

13/12/2006

Macario

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).


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;



Responder

Gostei + 0

13/12/2006

Oziasl

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;


Responder

Gostei + 0

14/12/2006

Macario

Olá, Ozias.


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


Responder

Gostei + 0

14/12/2006

Oziasl

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar