Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DataSet.LocateNext (horizontale Suche) (https://www.delphipraxis.net/177699-dataset-locatenext-horizontale-suche.html)

Dennis991 21. Nov 2013 15:48

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX

DataSet.LocateNext (horizontale Suche)
 
Hallo Leute,

ich habe folgendes Problem:

Ich habe ein DatabaseGrid und nutze LocateNext für die Suche in dem DatabaseGrid.
Die Suche geht jeweils die übergebenen Spalten einzeln durch und durchsucht jede Spalte vollständig, anstatt nur in die erste Zeile jeder Spalte zu gucken und dann erst in die zweite zu springen.

Wenn ich zum Beispiel nach dem Begriff Test suche, der in der Spalte 3 (Zeile 2) steht und in der Spalte 1 (Zeile 4) steht Test ebenfalls, dann markiert die Suche die Zeile 4 und nicht 2.

Ich hoffe Ihr wisst, was ich meine.

Gibt es eine Möglichkeit horizontal zu suchen, anstatt jede Spalte nacheinander vertikal zu durchsuchen?

Vielen Dank vorab,
Dennis991

Perlsau 21. Nov 2013 16:12

AW: DataSet.LocateNext (horizontale Suche)
 
Meinst du sowas:
Delphi-Quellcode:
...
Var
  Zaehl : Integer;

Begin
  Zaehl := 0;
  MyQuery.SQL.Text := 'select Spalte1, Spalte3 from MeineTabelle order by Spalte1';
  MyQuery.Open;
  IF MyQuery.Locate('Spalte1;Spalte3',VarArrayOf([Suchwort1, Suchwort2]),[]) THEN
  Begin
    Inc(Zaehl);
    WHILE MyQuery.LocateNext('Spalte1;Spalte3',VarArrayOf([Suchwort1, Suchwort3]),[]) DO
          Inc(Zaehl);
  End;
  ShowMessage('Insgesamt gefunden: ' + IntToStr(Zaehl));
End;
Ungetestet, da im Foren-Editor getippt ...

Sir Rufo 21. Nov 2013 16:20

AW: DataSet.LocateNext (horizontale Suche)
 
Locate macht aber AFAIK eine UND Suche über die Felder.

Wenn er aber Werte in Spalte1 oder Spalte3 oder Spalte3 suchen soll, dann geht das so nicht.

Perlsau 21. Nov 2013 16:43

AW: DataSet.LocateNext (horizontale Suche)
 
Zitat:

Zitat von Sir Rufo (Beitrag 1236949)
Locate macht aber AFAIK eine UND Suche über die Felder.
Wenn er aber Werte in Spalte1 oder Spalte3 oder Spalte3 suchen soll, dann geht das so nicht.

Stimmt, hier werden nur Records gefunden, bei denen in beiden Spalten der gesuchte Begriff steht.

Wie wär's dann mit:
Delphi-Quellcode:
MyQuery.Active := False;
MyQuery.SQL.Clear;
MyQuery.SQL.Append := 'select * from MeineTabelle';
MyQuery.SQL.Append := 'where (Spalte1 = ' + Suchwort + ')';
MyQuery.SQL.Append := 'or   (Spalte3 = ' + Suchwort + ')';
MyQuery.Open;

Sir Rufo 21. Nov 2013 18:54

AW: DataSet.LocateNext (horizontale Suche)
 
Hmmm, ich denke er möchte in dem bereits geholten Dataset suchen ;)

Perlsau 21. Nov 2013 18:57

AW: DataSet.LocateNext (horizontale Suche)
 
Zitat:

Zitat von Sir Rufo (Beitrag 1236976)
Hmmm, ich denke er möchte in dem bereits geholten Dataset suchen ;)

Wie sonst sollte man es anstellen, Datensätze herauszufinden, in denen ein Begriff in mindestens einer Spalten vorkommt?

Sir Rufo 21. Nov 2013 19:05

AW: DataSet.LocateNext (horizontale Suche)
 
Man benötigt ein Feld in dem die Werte aller Suchfelder mit Trennzeichen zusammengeführt sind.
Code:
Spalte1=Wert
Spalte2=Such
Spalte3=Feld
SuchSpalte=#Wert#Such#Feld#
Jetzt kann mit Locate über dieses Suchfeld gesucht werden (mit Parameter
Delphi-Quellcode:
loPartialKey
)

Ganze Feldwerte sucht man mit den Trennzeichen um den Wert
Delphi-Quellcode:
#Wert#
und Teile davon einfach mit dem Teil
Delphi-Quellcode:
el
.

Es entzieht sich meiner Kenntnis, ob Locate auch über berechnete Felder geht, möglich wäre es ...

Perlsau 21. Nov 2013 19:09

AW: DataSet.LocateNext (horizontale Suche)
 
Das ist natürlich auch eine Möglichkeit: Einfach die Tabelle erweitern oder ein entsprechendes View in der DB erstellen – ach ja, und natürlich, wenn' Locate über berechnete Felder geht, ein solches in der Query einrichten.

Darauf hätte ich auch selber kommen müssen – mit Ausnahme der berechneten Felder, das wäre mir nicht im Traum eingefallen.

Sir Rufo 21. Nov 2013 19:43

AW: DataSet.LocateNext (horizontale Suche)
 
Es geht aber auch ganz anders ... man schreibt sich eine
Delphi-Quellcode:
procedure
die das macht.

In etwa so: (ungetestet)
Delphi-Quellcode:
function DataSetLocateNext( ADataSet : TDataSet; const AFields : string; const AValue : Variant; ALocateOptions : TLocateOptions ) : Boolean;
var
  LBookmark : TBookmark;
  LSValue : string;
  LCValue : string;
  LFields : TStringList;
begin
  LSValue := VarToStrDef( AValue, '' );

  if loCaseInsensitive in ALocateOptions then
    LSValue := LowerCase( LSValue );

  LFields := TStringList.Create;
  try
    LFields.Delimiter := ';';
    LFields.StrictDelimiter := True;
    LFields.DelimitedText := AFields;

    for LIdx := 0 to LFields.Count - 1 do
      LFields.Objects[LIdx] := ADataSet.FieldByName( LFields[LIdx] );

    Result := False;

    LBookmark := ADataSet.GetBookmark;

    ADataSet.DisableControls;
    try
      while not ADataSet.Eof and not Result do
      begin
        ADataSet.Next;
        for LIdx := 0 to LFields.Count - 1 do
          begin
            LCValue := VarToStrDef( TField( LFields.Objects[LIdx] ).Value, '' );

            if loCaseInsensitive in ALocateOptions then
              LCValue := LowerCase( LCValue );

            if loPartialKey in ALocateOptions then
              Result := Pos( LSValue, LCValue ) > 0
            else
              Result := LSValue = LCValue;
          end;
      end;

      if not Result then
        ADataSet.GotoBookmark( LBookmark );

    finally
      ADataSet.EnableControls;
    end;
  finally
    LFields.Free;
  end;
end;

Dennis991 22. Nov 2013 07:37

AW: DataSet.LocateNext (horizontale Suche)
 
Danke für Eure zahlreichen Antworten, ich werde die Vorschläge mal ausprobieren.

Update:
funktioniert ;-) (habe die Lösung von Sir Rufo umgesetzt, da ich dadurch nicht das Grid erweitern muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz