Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Blob mit SQL nach Teilstring durchsuchen? (https://www.delphipraxis.net/55683-blob-mit-sql-nach-teilstring-durchsuchen.html)

Angel4585 26. Okt 2005 12:58

Re: Blob mit SQL nach Teilstring durchsuchen?
 
Feld heisst 'Nummer' und ist AutoInc

Frage : Muss ich vielleicht irgendwas bei der TTable komponente einstellen?

Sagt das jemandem was:

#. Programmer's name for it: SNoFieldAccess
#: Vcl/bdeconst.pas:68
msgid "Cannot access field '%s' in a filter"
msgstr "Auf Feld '%s' kann in einem Filter nicht zugegriffen werden"

marabu 26. Okt 2005 13:03

Re: Blob mit SQL nach Teilstring durchsuchen?
 
Ich habe dir jetzt Nummer als pkName in meinem Beispiel für die Filter-Routine eingetragen. Wenn es jetzt immer noch nicht funktioniert, dann musst du mal deine Filter-Routine hier zeigen.

marabu

Angel4585 26. Okt 2005 13:05

Re: Blob mit SQL nach Teilstring durchsuchen?
 
Delphi-Quellcode:
function GetMemo(tblName, fldName, keyName: string; keyValue: variant): string;
const
  SELECT = 'SELECT %s FROM %s WHERE %s = :key';
var
  ss: TStringStream;
  q: TQuery;
begin
  q := TQuery.Create(nil);
  with q do
  begin
    DatabaseName := 'Mailingliste';
    SQL.Text := Format(SELECT, [fldName, tblName, keyName]);
    Params.ParamValues['key'] := keyValue;
    Open;
    ss := TStringStream.Create('');
    TBlobField(Fields[0]).SaveToStream(ss);
    Result := ss.DataString;
    ss.Free;
    Close;
  end;
end;

procedure TdmMain.TSearchFilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
  i: integer;
  f: TField;
  s, pkName: string;
  pkValue: variant;
begin
  Accept:=false;
  with DataSet do
  begin
    pkName := 'Nummer';
    pkValue := FieldValues[pkName];
    for i := 0 to Pred(FieldCount) do
    begin
      f := Fields[i];
      ShowMessage(f.AsString);
      case f.DataType of
        ftMemo: s := GetMemo('"int.db"', f.FieldName, pkName, pkValue);
        ftGraphic: s := '';
        else s := f.AsString;
      end;
      if Pos(s, tfSearch.SearchString)>0 then
      begin
        Accept := true;
        Break;
      end;
    end;
  end;
 end;
so siehts bei mir aus

Edit Ob 'int' oder '"int.db"' macht keinen Unterschied

marabu 26. Okt 2005 13:12

Re: Blob mit SQL nach Teilstring durchsuchen?
 
Der Code ist jetzt prinzipiell in Ordnung. Du hast AnsiContainsText() durch Pos() ersetzt, dadurch wird die Schreibweise eventuell zum Stolperstein. Der Fehler ensteht dadurch, dass du einfach über alle Felder iterierst, wobei es Felder gibt, auf die du im OnFilterRecord-Event nicht zugreifen darfst. Zu diesen Feldern gehören alle Blob-Felder. Untersuche mal die Struktur der Tabelle int, ob da noch andere kritische Feldtypen vorkommen.

marabu

Angel4585 26. Okt 2005 13:15

Re: Blob mit SQL nach Teilstring durchsuchen?
 
ne es sind nur ftMemo und ftBlob, wenn ich diese ausklammer dann funktioniert es ohne Probs.
Das deprimierende ist, ich "erneuere" gerade ein altes Programm das mit der selben Tabelle läuft. Und das alte Programm kann auf diese Felder zugreifen(ausserhalb des OnFilterRecords). d.h. ich muss diese Suchfunktion irgendwie ausserhalb des Filters realisieren oder?

Edit: Wie kann ich dieses ANsiContainsText nutzen? mein Delphi kennt das nicht
Edit2 : Ah habs, StrUtils einbinden dann..gehts aber immernochnicht. Ich probier das mal anders. Ich werd das ganze extern machen und in en StringGrid reinschreiben.. dann müssts eigentlich gehen

Angel4585 26. Okt 2005 14:50

Re: Blob mit SQL nach Teilstring durchsuchen?
 
So.. Ich hab jetzt folgenden Code.. es funktioniert auch fast.. aber eben nur fast. Irgendwann, nachdem es 15 sekunden oder so das System blockiert kommt die Meldung falscher Parameter. Aber ich weis nicht warum, zumal es ja ne Weile perfekt läuft.

Delphi-Quellcode:
procedure TtfSearch.InitGrid;
var
 i : integer;
begin
tfSearchResults.searchgrid.ColCount:=dmMain.TSearch.FieldCount;
for i:= 0 to dmMain.TSearch.FieldCount -1 do
 tfSearchResults.searchgrid.Cells[i,0]:=dmMain.TSearch.Fields.Fields[i].FieldName;
tfSearchResults.searchgrid.RowCount:=2;
end;
{------------------------------------------------------------------------------}
procedure TtfSearch.AddFound(f : TFields);
var
 i : integer;
begin
with tfSearchResults.searchgrid do
 begin
 for i:= 0 to dmMain.TSearch.FieldCount -1 do
  Cells[i,RowCount-1]:=dmMain.TSearch.Fields.Fields[i].AsString;
 RowCount:=RowCount+1;
 end;
end;
{------------------------------------------------------------------------------}
function GetMemo(tblName, fldName, keyName: string; keyValue: variant): string;
const
  SELECT = 'SELECT %s FROM %s WHERE %s = :key';
var
  ss: TStringStream;
  q: TQuery;
begin
  q := TQuery.Create(nil);
  with q do
  begin
    DatabaseName := 'Mailingliste';
    SQL.Text := Format(SELECT, [fldName, tblName, keyName]);
    Params.ParamValues['key'] := keyValue;
    Open;
    ss := TStringStream.Create('');
    TBlobField(Fields[0]).SaveToStream(ss);
    Result := ss.DataString;
    ss.Free;
    Close;
  end;
end;
{------------------------------------------------------------------------------}
procedure TtfSearch.Suche(SearchPart : string; Feld : string; GrossKlein : boolean;Komplett : boolean);
var
 temp : string;
 RecAll,i : integer;
  f: TField;
  s, pkName: string;
  pkValue: variant;
begin
with dmMain.TSearch do
 begin
 Open;
 pkName := 'Nummer';
 InitGrid;
 First;
 while not eof do
  begin
   pkValue := FieldValues[pkName];
   for i := 0 to Pred(FieldCount) do
    begin
     f := Fields.Fields[i];
      case f.DataType of
        ftMemo: s := GetMemo('"'+TableName+'"', f.FieldName, pkName, pkValue);
        else s := f.AsString;
      end;
    if AnsiContainsText(s, tfSearch.SearchString) then
     begin
      AddFound(Fields);
      ShowMessage(Fields.Fields[0].asstring);
      Break;
     end;
    end;
   Next;
  end;
 if RecordCount > 0 then
  tfSearchResults.tsbStatus.Panels.Items[1].Text:=Format(' %7d/%-7d Treffer gesamt',[RecordCount,RecAll])
 else MessageDlg('Es wurden keine Übereinstimmungen gefunden',mtConfirmation,[mbOK],0);
 end;
end;
Weis jemand wo ich diesmal den Fehler hab?

Angel4585 27. Okt 2005 09:59

[GELÖST] Blob mit SQL nach Teilstring durchsuchen?
 
SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY SORRY

hab mich SOOOOOOOOOOOOOOOOOOOOOO DUMM angestellt, dabei gehts ganz einfach:


Ich habe folgendes gemacht :
SQL-Code:
WHERE CAST('+Feld+' AS CHARACTER(255)) LIKE "%'+SearchPart+'%"
ging mit Blobs nicht :

jetzt hab ich gerade irgendwo DAS gesehen:

SQL-Code:
WHERE '+Feld+' LIKE "%'+SearchPart+'%"
und was soll ich sagen: ES FUNKTIONIERT!!!!

:wall: :wall: :wall: :wall: :wall: :wall: :wall:

Edit :
ein kleines Problem hab ich aber trotzdem noch: die Funktion UPPER() funktioniert nicht auf dem Memo...
Soll ich en Neuen Thread eröffnen oder machen wir das gleich hier?(kurz und schmerzlos)

Übrigens hier die Seite auf der ich das gefunden hab. Ist hoffentlich kein Problem wenn ich da mal hier rein mache :DATABASE
da unter 5. e) (Resttext ist ein Blob)

marabu 27. Okt 2005 10:58

Re: Blob mit SQL nach Teilstring durchsuchen?
 
Martin, geht es noch um Paradox? In MySQL gibt es reichlich Unterstützung für den BLOB resp. TEXT Datentyp, in Paradox gar keine - insbesondere keine Operatoren. Wie kann das also bei dir funktionieren? Indem du nur die ersten 255 Stellen für deine Suche heranziehst? Klar es gibt keinen compile-time oder run-time Fehler, aber das nenne ich nicht funktionieren.

marabu

Angel4585 27. Okt 2005 11:28

Re: Blob mit SQL nach Teilstring durchsuchen?
 
marabu, ja es geht noch um Paradox. Ich weis nicht WARUM es funktioniert. ich weis nur DAS es funktioniert. Und ich nimm sicher nicht nur 255 Zeichen sondern es sucht in dem ganzen Memo. Ich habe es getestet indem ich extra mal 500 Zeichen reingeschrieben habe und habe nach dem ersten Wort gesucht, und einmal nach dem letzten Wort gesucht. Und es funktioniert. Warum das so ist ist mir eigentlich egal ich bin nur saumäßig Happy DAS es funtioniert. Aber ich hindere niemanden daran herauszufinden WARUM es funktioniert.

Edit:

LOCALSQL.HLP ist das Stichwort :

Suche nach WHERE,

geh nach ganz unten in dem Artikel:

dort steht:

Tip: Bei der Filterung der meisten Spaltentypen genügen die einfachen Vergleichsprädikate. Erfolgt die Filterung jedoch auf der Basis der Inhalte einer MEMO-Spalte, müssen Sie mit dem Prädikat LIKE arbeiten.

mschaefer 27. Okt 2005 12:18

Re: Blob mit SQL nach Teilstring durchsuchen?
 
JaEin,

also, die Tücke liegt im Detail. Paradox speichert einen Teil des Blobfeldes in der Datenbanktabelle und einen Teil im externen Blobbfeld. Der Textteil in der Datenbanktabelle kann bei der Definition mit 1 bis 255 Zeichen angegeben werden.

Eigentlich habe ich angenommen, dass das Like-Statement nur auf die Zeichen in der Tabelle angesetzt wird.
/EDIT/ Bei dem Blobb war ich der Meinung, dass es nicht richtig durchsucht wird. /EDIT/


Grüße // Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.
Seite 4 von 5   « Erste     234 5      

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 by Thomas Breitkreuz