![]() |
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" |
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 |
Re: Blob mit SQL nach Teilstring durchsuchen?
Delphi-Quellcode:
so siehts bei mir aus
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; Edit Ob 'int' oder '"int.db"' macht keinen Unterschied |
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 |
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 |
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:
Weis jemand wo ich diesmal den Fehler hab?
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; |
[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:
ging mit Blobs nicht :
WHERE CAST('+Feld+' AS CHARACTER(255)) LIKE "%'+SearchPart+'%"
jetzt hab ich gerade irgendwo DAS gesehen:
SQL-Code:
und was soll ich sagen: ES FUNKTIONIERT!!!!
WHERE '+Feld+' LIKE "%'+SearchPart+'%"
: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 : ![]() da unter 5. e) (Resttext ist ein Blob) |
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 |
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. |
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. |
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