Comparar banco de dados do inicio ao fim delphi
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.
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
Curtidas 0
Melhor post
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:
Escrevi o código diretamente aqui, então cuidado se for copiar pois pode conter algum erro.
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
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
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
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.
Tente novamente e veja se consegue.
GOSTEI 0
Nelson Filho
22/02/2015
Fico assim.
Mas na hora que eu aciono ele trava tudo.....
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
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();.
Reveja o código em que dei o exemplo, repare que dentro do While tem o ds.Next();.
GOSTEI 0
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