Fórum Comparar banco de dados do inicio ao fim delphi #511492

22/02/2015

0

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

Responder

Post mais votado

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.

Joel Rodrigues

Joel Rodrigues
Responder

Gostei + 1

Mais Posts

23/02/2015

Nelson Filho

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;
Responder

Gostei + 0

23/02/2015

Joel Rodrigues

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

Gostei + 0

25/02/2015

Nelson Filho

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;
Responder

Gostei + 0

25/02/2015

Joel Rodrigues

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();.
Responder

Gostei + 0

03/03/2015

Nelson Filho

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;
Responder

Gostei + 0

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

Aceitar