Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datei mit FireDac "Case Sensitive" filtern (https://www.delphipraxis.net/184060-datei-mit-firedac-case-sensitive-filtern.html)

ATS3788 23. Feb 2015 16:24

AW: Datei mit FireDac "Case Sensitive" filtern
 
Ich poste alles damit vielleicht
jemand mal einen nutzen hat.

Delphi-Quellcode:

function RTF_Stream_To_Plain_Text(Stream : TStream) : string;
var
RichEdit    : TRichEdit;
begin
try
RichEdit := TRichEdit.CreateParented(HWND_MESSAGE);
RichEdit.Parent := nil;
RichEdit.PlainText := False;
RichEdit.WordWrap := false;
RichEdit.Visible := false;

Stream.Position := 0;
RichEdit.Lines.LoadFromStream(Stream);

Result := RichEdit.Lines.Text;
finally
RichEdit.Free;
end;
 end;



function DumpTable(MemTable : TFDMemTable;const UniqueInt : string) : t64Array;
var
i : Int64;
 begin
     i := 0;
      MemTable.First;
       while not MemTable.Eof do begin
        inc(i);
         SetLength(Result , i);
       Result[i-1] := MemTable.Fields.FieldByName(UniqueInt).AsLargeInt;
       MemTable.Next;
     end;
   end;


procedure FilterNoCaseSensitive(Table : TFDTable;Filter, Field2Filter, UniqueInt : string);
var
_Connection : TFDConnection;
LocalSQL : TFDLocalSQL;
MemTable : TFDMemTable;
S       : string;
Stream  : TStream;
arr     : t64Array;
i       : Integer;
begin
     Stream  := TStream.Create;
     _Connection := TFDConnection.Create(nil);
     _Connection.DriverName := 'SQLite';
     LocalSQL := TFDLocalSQL.Create(nil);
     LocalSQL.Connection := _Connection;

     MemTable := TFDMemTable.Create(nil);
     MemTable.Name := 'Testtable';
     MemTable.LocalSQL := LocalSQL;

     MemTable.FieldDefs.Add(UniqueInt, ftLargeint);
     MemTable.FieldDefs.Add(Field2Filter, ftString, 1000);
     MemTable.CreateDataSet;

     LocalSQL.Active := True;
     MemTable.Active := True;

     Table.First;
     while not Table.Eof do begin
     MemTable.Insert;

     MemTable[UniqueInt] := Table[UniqueInt];
     Stream := Table.CreateBlobStream(Table.FieldByName('FELD1') , bmRead);
    S := RTF_Stream_To_Plain_Text(Stream);
    S := LowerCase(S);
      MemTable[Field2Filter] := S;
      MemTable.Post;
      Table.Next;
     end;


    Filter := LowerCase(Filter);
       MemTable.Filter := Field2Filter + ' LIKE ''%'+ Filter +'%''';
       MemTable.Filtered := False;

    MemTable.Filtered := True;

        arr := DumpTable(MemTable, UniqueInt);

   S := '';
  for i := Low(arr) to High(arr) do
   S := S +  IntToStr(arr[i]) + ',';

   Delete(S,Length(S), 1);
   S := UniqueInt + ' in (' + S + ')';

   Table.Filter := S;
   Table.Filtered := True;

     MemTable.Free;
     LocalSQL.Free;
     _Connection.Free;
      Stream.Free;
   end;

FilterNoCaseSensitive(FDTable1 , 'TesT', 'FELD1', 'COUNTER');

jobo 23. Feb 2015 16:34

AW: Datei mit FireDac "Case Sensitive" filtern
 
Zitat:

Zitat von ATS3788 (Beitrag 1291135)
Es ist hilfreich wenn man BC338, oder Bc338 oder bc338
eingibt und immer das gleich im einem String Grid ausgegeben wird.

Also mal unabhängig davon, ob es Probleme gibt. Was Du da schreibst, ist doch CaseInSensitive.
Dafür gibt es Collate Sequenzen, die auf Deiner DB vielleicht auch eingestellt sind.. ?
Oben hast Du geschrieben, dass Du beides können willst?
Kommen bei CaseInSensitive soviel Ergebnisse raus, dass man es genauer braucht?

ATS3788 26. Feb 2015 07:18

AW: Datei mit FireDac "Case Sensitive" filtern
 
Danke jobo
Gut zu wissen das man so was auch in einer Datenbank vorgeben kann.
Ich wollte beiden in der Applikation haben.

jobo 26. Feb 2015 08:25

AW: Datei mit FireDac "Case Sensitive" filtern
 
Zitat:

Zitat von ATS3788 (Beitrag 1291571)
..
Gut zu wissen das man so was auch in einer Datenbank vorgeben kann.
Ich wollte beiden in der Applikation haben.

Das hatte Union eigentlich auch bereits geschrieben:
Zitat:

Zitat von Union (Beitrag 1291093)
Vermutlich hat der DB-Designer entschieden, dass so was nicht gehen soll und daher das Feld mit einer ci_ Collation definiert.

Wenn man beides realisieren will, bietet es sich vielleicht alternative an, DB-seitig CaseSensitive zu arbeiten (also keine CI collation zu verwenden) und das InSensitive über Upper Funktionen im SQL darüber zu legen, wenn der Anwender es aktiviert.

mkinzler 26. Feb 2015 09:21

AW: Datei mit FireDac "Case Sensitive" filtern
 
Und hierfür kann man dann einen weiteren expression index anlegen, wenn man es regelmässig benötigt.

ATS3788 28. Feb 2015 06:00

AW: Datei mit FireDac "Case Sensitive" filtern
 
Hallo
Für Leute die auf diesen Post stoßen

http://www.destructor.de/firebird/ca...tivesearch.htm

Nur die Frage ist, geht das auch für ein Blob ?
oder ist da die komplizierte Funktion besser.

mkinzler 28. Feb 2015 08:04

AW: Datei mit FireDac "Case Sensitive" filtern
 
Ein Textblob verhält sich bis zur Länge von 32k weitgehenst wie ein VarChar-Feld
http://www.firebirdsql.org/refdocs/l...pd21-blob.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 Uhr.
Seite 2 von 2     12   

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