Announcement

Collapse
No announcement yet.

Memo-Felder und OnFilterRecord DRINGEND/HILFE!!!!!!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Memo-Felder und OnFilterRecord DRINGEND/HILFE!!!!!!

    Hallo!

    Ich habe Probleme beim Auslesen von Memo-Feldern bei gefilterten DataSets.

    Umgebung:
    - Delphi 5
    - MS SQLSRV 7.0
    - TQuery (Filtered := true; Event: OnFilterRecord)
    - Verwendung von TQuery.Filter nicht möglich!

    Im unteren Beispiel wird beim Auslesen des ersten nicht leeren MemoFeldes
    folgende Exception ausgelöst:
    Ungültiges BLOB-Handle im Datnsatzpuffer
    Ohne den Event OnFilterRecord - kein Problem!

    procedure TForm.ButtonClick(Sender: TObject);
    begin
    with Query do
    begin
    SQL.Text := 'SELECT * FROM Tabelle1';
    Open;
    while not Eof do
    begin
    Memo.Lines.Text := FieldByName('memofeld'). AsString;
    Next;
    end;
    Close;
    end;
    end;

    procedure TForm1.QueryFilterRecord(DataSet: TDataSet; var Accept: Boolean);
    begin
    Accept := true/false;
    end;

    Mit diesem Beispiel kann das Problem nachvolzogen werden.
    Eigentlich passiert mir das in einer Klasse die von TQuery abgeleitet ist.
    Dazu leite ich im Constructor den Event um (andere Lösung habe ich nicht gefunden): OnFilterRecord := DoFilterRecord;
    Vieleicht gibt es ja hierfür eine andere Lösung!

    Bitte um schnelle Hilfe!!!

    Mir steht das Wasser bis zum Hals (öh Nase) - wir haben bald eine Messe!

    Ciao Herbert

  • #2
    Hallo,

    im Gegensatz zu TTable führt ein Filter bei TQuery dazu, das alle Datensätze der Ergebnismenge der SELECT-Abfrage vom Server zum Client transportiert werden und dort <b>lokal</b> "gefiltert" werden. Bei TTable wird ein Filter von der VCL automatisch in eine WHERE-Bedingung umgesetzt, so das der SQL-Server die Datensätze gleich beim Erzeugen der Ergebnismenge einschränken kann. Bei TQuery hält sich die VCL allerdings völlig heraus, da der Entwickler die SELECT-Anweisung ja von Hand definiert.

    Dies führt unter anderem dazu, das NULL-Werte bei einem Filter mit TTable anderes gehandhabt werden als bei einem Filter mit TQuery. Bei einem TTable-Filter kommen diese Datensätze niemals beim Client an, beim TQuery-Filter schon (da hier der Client lokal und somit an SQL vorbei filtert).

    Ich würde daher TQuery.Filter durch eine eigene WHERE-Einschränkung der SELECT-Abfrage ersetzen. Zumal wenn in der WHILE-Schleife sowieso alle Datensätze "von Hand angefasst" werden:
    <pre>
    procedure TForm.ButtonClick(Sender: TObject);
    begin
    with Query do
    begin
    SQL.Text := 'SELECT * FROM Tabelle1 WHERE Feld1 = Filterkriterium';
    Open;
    while not Eof do
    begin
    // hier "Filter"-Prüfung vornehmen
    if x = y then
    Memo.Lines.Text := FieldByName('memofeld'). AsString;
    Next;
    end;
    Close;
    end;
    end;
    </pre&gt

    Comment


    • #3
      Hallo!

      Ja, danke. Aber dies ist mir alles bekannt. In meinem Fall ist die Bedingung genau so wie ich sie schon formuliert habe.

      Bedingung:
      - Delphi 5
      - MS SQLSRV 7.0
      - TQuery mit OnFilterRecord
      - Es kann keine Where-Bedingung angegeben werden
      - "x = y" funktioniert auch nicht bei datensensitiven Controls (TDBGrid)

      Das angegebene Beispiel wurde von mir nur zum Nachvollziehen angegeben.
      Das eigentliche Anwendungsgebiet wäre wesentlich komplizierter zu beschreiben.

      Aber ich versuch's:
      Ich habe TQuery abgeleitet und verwende die neue Komponente als eine Art TTable mit Chached Updates und Update Object. Da bei Tabelle-Links (über TQuery.DataSource) in der 3. Ebene immer ein Neuladen der Query verursacht und ich aber mit Chached Updates arbeite ist diese Konstellation unbrauchbar!
      Ich habe meine eigenen Tabellen-Links implementiert, die auch wunderbar funktionieren (aber über OnFilterRecord laufen). Jedoch habe ich jetzt diese Probleme mit den Memo-Feldern.

      Mit dem Beispiel-Code lässt sich dieses Verhalten sehr einfach nachvollziehen (Wichtig MS SQLSRV 7.0).

      Meiner Meinung nach ist dies ein Fehler von Delphi 5.0

      Gibt es eine Möglichkeit dies zu umgehen???????

      Ciao Herbert

      P.S.: Ich sitze immer noch auf Nadeln und sie werden spitzer und spitze

      Comment


      • #4
        Hallo,

        um zu prüfen, ob das tatsächlich ein Fehler der VCL ist, würde ich das Projekt mit <b>Debug-DCU</b> compilieren und das Programm schrittweise in der VCL bis zur fehlerauslösenden Stelle ausführen lassen.

        Aber in jedem Fall würde ich das Design noch einmal gründlich überdenken

        Comment

        Working...
        X