AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Blob mit SQL nach Teilstring durchsuchen?
Thema durchsuchen
Ansicht
Themen-Optionen

Blob mit SQL nach Teilstring durchsuchen?

Ein Thema von Angel4585 · begonnen am 25. Okt 2005 · letzter Beitrag vom 28. Okt 2005
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#31

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 26. Okt 2005, 12:58
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"
Martin Weber
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#32

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 26. Okt 2005, 13:03
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
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#33

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 26. Okt 2005, 13:05
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
Martin Weber
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#34

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 26. Okt 2005, 13:12
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
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#35

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 26. Okt 2005, 13:15
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
Martin Weber
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#36

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 26. Okt 2005, 14:50
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?
Martin Weber
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#37

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

  Alt 27. Okt 2005, 09:59
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 :
WHERE CAST('+Feld+AS CHARACTER(255)) LIKE "%'+SearchPart+'%" ging mit Blobs nicht :

jetzt hab ich gerade irgendwo DAS gesehen:

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



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)
Martin Weber
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#38

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 27. Okt 2005, 10:58
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
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#39

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 27. Okt 2005, 11:28
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.
Martin Weber
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#40

Re: Blob mit SQL nach Teilstring durchsuchen?

  Alt 27. Okt 2005, 12:18
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
Martin Schaefer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr.
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