Comparar banco de dados do inicio ao fim delphi

Delphi

22/02/2015

Ola povo.

Seguinte oque eu preciso é o seguinte:
Eu tenho um grid de boletos com varios campos e um que que tem o campos que fica a vencer.

Tendo isso eu preciso clicar em um botão este botão deve ir do primeiro ao ultimo registro dakele bando de dados, fazer a comparação um por um ... " se o campo VENCIMENTO estiver como " A vencer " e o campo DATA VENCIMENTO for menor que a data atual entao no campo vencimento escreva " VENCIDO ".

E eu uso DataSource e ibquery.
Nelson Filho

Nelson Filho

Curtidas 0

Melhor post

Joel Rodrigues

Joel Rodrigues

23/02/2015

TODOS os registros do banco mesmo? Tem certeza?
Se for, aconselho usar um STORED PROCEDURE que percorra a tabela com um CURSOR e faça a verificação e alteração em cada linha.
Se você desejar fazer isso apenas nos registros que estão no DataSet, você pode fazer um loop simples sobre ele e fazer a verificação e alteração, algo no seguinte formato:
ds.First();
while not ds.Eof do
begin
  if (ds.FieldByName('VENCIMENTO').Value = 'A vencer') and (ds.FieldByName('DATA_VENCIMENTO').Value < Date) then
  begin
    ds.Edit();
    ds.FieldByName('VENCIMENTO').Value := 'VENCIDO';
    ds.Post();
  end;
  ds.Next();
end;


Escrevi o código diretamente aqui, então cuidado se for copiar pois pode conter algum erro.
GOSTEI 1

Mais Respostas

Nelson Filho

Nelson Filho

22/02/2015

Joel nao consegui usar mas consegui fazer o cod com base no que se pos.
Como que ponho o loop ai?
eu uso ibquery / inupdate / datasource



procedure TForm1.Button27Click(Sender: TObject);
VAR
DATA_ATUAL : TDateTime;
VENCIMENTO : STRING;
STATUS     : STRING;


begin


DATA_ATUAL := Date();
VENCIMENTO := dbgrid5.Fields[6].asstring;
STATUS     := dbgrid5.Fields[9].asstring;

IF (DateTimeToStr(DATA_ATUAL) > VENCIMENTO) and (STATUS = 'A VENCER')THEN
BEGIN
end;

IF (DateTimeToStr(DATA_ATUAL) = VENCIMENTO) and (STATUS = 'A VENCER')THEN
BEGIN
M.IBQuery13.Open;
M.IBQuery13.Edit;
FORM1.dbgrid5.Fields[9].asstring := 'A AVISAR' ;
M.IBQuery13.Post;
m.IBTransaction13.commit;
M.IBQuery13.open;
end;

IF ( VENCIMENTO < DateTimeToStr(DATA_ATUAL)) and (STATUS = 'A VENCER')THEN
BEGIN
M.IBQuery13.Open;
M.IBQuery13.Edit;
FORM1.dbgrid5.Fields[9].asstring  := 'VENCIDO' ;
M.IBQuery13.Post;
m.IBTransaction13.commit;
M.IBQuery13.open;
END;

end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

22/02/2015

Reveja o código que eu sugeri. Obseve que eu não trabalhei sobre o DBGrid e sim sobre o próprio DataSet, ou seja, a sua IBQuery. Onde tem "ds" você vai colocar o nome da sua query.
Tente novamente e veja se consegue.
GOSTEI 0
Nelson Filho

Nelson Filho

22/02/2015

Fico assim.
Mas na hora que eu aciono ele trava tudo.....

procedure TForm1.Button27Click(Sender: TObject);
VAR
DATA_ATUAL : TDateTime;
VENCIMENTO : STRING;
STATUS     : STRING;

begin


DATA_ATUAL := Date();
VENCIMENTO := m.IBQuery13.fields[5].asstring;
STATUS     := m.IBQuery13.fields[7].asstring;

m.IBQuery13.First();
while not m.IBQuery13.Eof do
begin


IF (DateTimeToStr(DATA_ATUAL) > VENCIMENTO) and (STATUS = 'A VENCER')THEN
BEGIN
end;

IF (DateTimeToStr(DATA_ATUAL) = VENCIMENTO) and (STATUS = 'A VENCER')THEN
BEGIN
M.IBQuery13.Open;
M.IBQuery13.Edit;
m.IBQuery13.fields[7].asstring := 'A AVISAR' ;
M.IBQuery13.Post;
m.IBTransaction13.commit;
M.IBQuery13.open;
end;

IF ( VENCIMENTO < DateTimeToStr(DATA_ATUAL)) and (STATUS = 'A VENCER')THEN
BEGIN
M.IBQuery13.Open;
M.IBQuery13.Edit;
m.IBQuery13.fields[7].asstring  := 'VENCIDO' ;
M.IBQuery13.Post;
m.IBTransaction13.commit;
M.IBQuery13.open;
END;

end;
end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

22/02/2015

Faltou avançar as linhas da query usando o Next.
Reveja o código em que dei o exemplo, repare que dentro do While tem o ds.Next();.
GOSTEI 0
Nelson Filho

Nelson Filho

22/02/2015

Joel segue abaixo do jeito que você pos porem quando eu executo ele entra em loop e trava o programa.


procedure TForm1.Button27Click(Sender: TObject);
VAR
DATA_ATUAL : TDateTime;
VENCIMENTO : TDateTime;//STRING;
STATUS     : STRING;

begin


DATA_ATUAL := Date();
VENCIMENTO := m.IBQuery13.fields[5].AsDateTime;
STATUS     := m.IBQuery13.fields[7].AsString;



m.IBQuery13.First();
while not m.IBQuery13.Eof do
begin


IF (DATA_ATUAL > VENCIMENTO) and (STATUS = 'A VENCER') THEN
BEGIN
end;

IF (DATA_ATUAL = VENCIMENTO) and (STATUS = 'A VENCER')THEN
BEGIN
M.IBQuery13.Open;
M.IBQuery13.Edit;
m.IBQuery13.fields[7].asstring := 'A AVISAR' ;
M.IBQuery13.Post;
m.IBTransaction13.commit;
M.IBQuery13.open;
end;

IF (VENCIMENTO < DATA_ATUAL) and (STATUS = 'A VENCER')THEN
BEGIN
M.IBQuery13.Open;
M.IBQuery13.Edit;
m.IBQuery13.fields[7].asstring  := 'VENCIDO' ;
M.IBQuery13.Post;
m.IBTransaction13.commit;
M.IBQuery13.open;
END;
end;
m.IBQuery13.next();
end;
GOSTEI 0
POSTAR