![]() |
Datenbank: MS SQL 2000 • Version: 8.0 • Zugriff über: ADO
Locate und VarArrayCreate
Hi,
ich möchte ein Feld welches mehrere Tausend DateTime-Werte enthält mittels Locate durchsuchen und nur die Werte zurück bekommen die bestimmten Kriterien entsprechen, z.B. alle Termine vom Januar 2006. Dazu benutze ich bisher:
Delphi-Quellcode:
Bei der Ausführung kommt es jedoch bei Locate zur Exception
procedure TForm1.Button1Click(Sender: TObject);
var I : Integer; B : TBookMarkStr; MaxDays : Variant; Y, M, D : Word; begin ListBox1.Items.Clear; DecodeDate(GetLastMonthDay(EncodeDate(2006, 01, 01)), Y, M, D); MaxDays := VarArrayCreate([1, D], varVariant); for I := 1 to D do MaxDays[I] := Trunc(EncodeDate(2006, 01, I)); B := ADODataSet1.Bookmark; if ADODataSet1.Locate('StartTime', MaxDays, [loCaseInsensitive, loPartialKey]) then begin ListBox1.Items.Add(ADODataSet1.FieldValues['StartTime']); end; ADODataSet1.Bookmark := B; end; "Variante des Typs(Array Variant) konnte nicht in den Type(String) konventiert werden". Ein VarArrayCreate([1,D], varString) schlägt auch fehl, das kein sicheres Array oder Variante erzeugt werden kann. Wie gehts 'richtiger'? Gruss Alter Mann |
Re: Locate und VarArrayCreate
Wäre da nicht ein Filter sinnvoller?
Bzw. gleich eine Query zu nehmen die per Parameter nur Deine gewünschten Datensätze zurückgibt. Moin |
Re: Locate und VarArrayCreate
Nimm TQuery und bau dir ein Query mit Parametern zusammen.
|
Re: Locate und VarArrayCreate
Hallo,
Filter oder TQuery scheiden aus, brauche es für etwas anderes ![]() Bin erst einmal darauf ausgewichen:
Delphi-Quellcode:
Gruss
procedure TForm1.Button1Click(Sender: TObject);
var I : Integer; B : TBookMarkStr; DT : TDateTime; Y, M, D : Word; begin ListBox1.Items.Clear; DecodeDate(dtpFirst.Date, Y, M, D); D := 32; try while not IsValidDate(Y, M, D) do Dec(D); except end; B := ADODataSet1.Bookmark; for I := 1 to D do begin DT := EncodeDate(Y, M, I); if ADODataSet1.Locate('StartTime', DT, , [loCaseInsensitive, loPartialKey]) then begin ListBox1.Items.Add(ADODataSet1.FieldValues['StartTime']); end; end; ADODataSet1.Bookmark := B; end; |
Re: Locate und VarArrayCreate
Hi Alter Mann,
Für jeden Feldnamen im 1.Parameter der Locate-Methode musst du einen Wert im 2.Parameter übergeben. der wird auf Gleichheit geprüft. In den Options kannst Du noch angeben, ob bei einem Stringvergleich die Gross/Kleinschreibung eine Rolle spielt (loCaseInsensitive) bzw. ob man nach einem Substring suchen will (loPartialCompare). Einen Bereich zu finden geht so nicht, dazu nimmst du etwas selbstgebautes:
Delphi-Quellcode:
Function LocateBetween (aDS : TDataset; aFieldName : String; aLowDate, aHighDate : TDateTime) : Boolean;
Var fField : TDateTimeField; Begin Result := False; fField := aDS.FieldByName(aFieldName); While not ADS.Eof Do Begin If (fField.AsDateTime >= aLowDate) And (fField.AsDateTime <= aHighDate) Then Begin Result := True; Exit; End; aDS.Next; End; End; |
Re: Locate und VarArrayCreate
Zitat:
Ausm Kopf mal die grundsätzliche Idee:
Delphi-Quellcode:
Die Werte für AnfangsDatum und EndDatum sind natürlich entsprechend zu setzen.
procedure TForm1.Button1Click(Sender: TObject);
procedure DatumAuslesen(const ADAT, EDAT: TDateTime); begin if not Query1.Prepared then begin Query1.SQL.Text := 'SELECT starttime FROM MeineTabelle ' + 'WHERE starttime BETWEEN :ANFDAT AND :ENDDAT'; Query1.Prepare; end; Query1.Close; Query1.Params[0].AsDateTime := ADAT; Query1.Params[1].AsDateTime := EDAT; Query1.Open; end; var AnfangsDatum, EndDatum : TDateTime; ... begin ListBox1.Items.Clear; AnfangsDatum := ...; EndDatum := ...; DatumAuslesen(AnfangsDatum, EndDatum); if not Query1.Empty then begin ListBox1.Items.Add(Query1.FieldValues['StartTime']); Query1.Next; end; end; ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz