Der er flere problemer med dit filter. Først og fremmest mangler Felt-angivelsen. Dermæst filtrerer du på Hour + Min, men da feltet er en TDateTime mangler dato-delen og endelig kalder du DateTimeToStr med et Word, hvor funktionen kræver en TDateTime (=Double)...
Filter property'en er kun til (forholdsvis) simple filtreringer.
OnFilterRecord er typisk beregnet til de mere avancerede. Hvis du anvender begge samtidigt skal du passe meget på de ikke konflikter, hvilket resulterer i et tomt datasæt.
Ok, slut med pedanteriet:
Umiddelbart kunne du omskrive
ADOTable3.Filter:= HourOf(Now))+':'+DateTimeToStr(MinuteOf(Now));
til
var
Y, M, D, H, MI, S, MS: Word;
begin
...
DecodeDateTime(Now, Y, M, D, H, MI, S, MS);
ADOTable3.Filter := 'Dato = ' + DateTimeToStr(EncodeDateTime(Y, M, D, H, MI, 0, 0));
...
end;
Filtret ville så blive noget i retning af 'Dato = 03-01-2005 22:24:00'
Om dette så løser dit problem er en anden sag. Hvis du anvender dette filter skal Datotids-feltet i databasen matche nøjagtigt når filteret sættes. Dvs. tidspunktet
skal være 22:24:00 som i eksemplet. Det må ikke være 22:24:35, så bliver datasættet tomt...
Hvis du f.eks. ønsker at filtrere, således at der ikke tages hensyn til sekunderne. Dvs. alle tider >= 22:24:00 og < 22:24:59 medtages gør du flg.:
1. Glemmer ADOTable3.Filter og bruger OnFilterRecord
2. Ændrer OnFilterRecord til
procedure TForm1.ADOTable3FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var
DT: TDateTime;
Y, M, D, H, MI, S, MS: Word;
begin
// Hent aktuel dato/tid
DecodeDateTime(Now, Y, M, D, H, MI, S, MS);
// opbyg testdato. Bemærk at sek. er sat til 30
DT := EncodeDateTime(Y, M, D, H, MI, 30, 0);
// Test om datasættets Dato/tid er indenfor +- 30 sek.
Accept := SecondsBetween(DataSet['Dato'], DT) <= 30;
end;
3. Styrer evt. opdateringen af datasættet/filtreringen ved at kalde ADOTable3.Refresh med mellemrum f.eks. via en timer el. på anden vis.
mvh.
hsv
[Redigeret d. 03/01-05 23:04:20 af HSV][Redigeret d. 03/01-05 23:06:27 af HSV]