Announcement

Collapse
No announcement yet.

SQL - Dynamische Parameter

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

  • SQL - Dynamische Parameter

    Hallo alle Miteinander,
    mein erstes Posting in diesem Forum.
    Wenn ich in Delphi 2.01 (bitte nicht lachen) in einer SQL-Abfrage einen Parameter habe der aus einer Datasource ermittelt wird

    Beispiel:
    <pre>
    Select *
    From Kunden
    Where Name >= :NameAusTable1
    </pre>

    dann wird das Ergebnis recht zügig in einem DbGrid angezeigt sobald ein anderer Datensatz in Table1 gewählt wird.

    Möchte ich nun eine Abfrage generieren ohne eine Datensource

    Beispiel:
    <pre>
    Select *
    From Kunden
    Where Name >= :SuchName
    </pre>

    den Parameter also über Query1.ParamByName('SuchName').AsString := 'Irgendwas' setze, bleibt mir nichts anderes übrig als das Query zu schliessen und neu zu öffnen. Dies dauert mir einfach zu lange. In "DBTables.pas" finde ich leider nicht (mittlerweile habe ich wohl ein Brett vor dem Kopf) wie Borland es schafft das Query wenn es mit einer DataSource verbunden so schnell zu aktualisieren.

    Enable- und DisableControls bzw. Prepare führen leider nicht zum erfolg.

    Falls jemand weiss wie ich die gleiche Geschwindigkeit wie mit einer DataSource hinbekomme wäre ich für einen Hinweis sehr dankbar.

    Vielen Dank im voraus
    Bernd

  • #2
    Hallo,

    &gt;..bleibt mir nichts anderes übrig als das Query zu schliessen und neu zu öffnen

    etwas anderes macht auch Delphi nicht, wenn eine Master-/Detail-Datenmenge über <i>DataSource</i> verbunden wird. Immer dann, wenn die Position in der Master-Datenmenge geändert wird, sorgt Delphi im Hintergrund dafür, dass die SELECT-Abfrage der Detail-Datenmenge neu ausgeführt wird. Wenn es keine Ankopplung via DataSource gibt, muss man selbst diesen Schritt ausführen

    Comment


    • #3
      Hallo Andreas,

      vorab vielen Dank das Du Dir über mein Problem Gedanken gemacht hast.
      In DBTables.pas habe auch eine Methode gefunden, wo ich der Meinung war das über DisableControls -> CloseQuery -> ParamByName... -> OpenQuery -> EnableControls das Query aktualisiert wurd. Als das dann Manuel in das Programm einbaute dauerte das öffnen des Query fast genau so lange wie ohne Disable/EnableControls. Borland muss vermutlich also noch etwas anders machen um diese hohe geschwindigkeit mittels DataSource hinzubekommen.
      Ich könnte natürlich einen Workaround über eine Dummy-Table machen aber der wäre nicht elegant und später für die Wartung der Software auch nicht so einfach nach zu vollziehen.
      Vielleicht hat ja jemand schon mal diese Problem gelöst.

      Nochmals vielen dank und ein schönes Wochenende und
      viele grüsse
      Bern

      Comment


      • #4
        Hallo,

        &gt;..dauerte das öffnen des Query fast genau so lange ...

        wie sieht diese SELECT-Abfrage aus, wobei es auf die WHERE-Einschränkung ankommt

        Comment


        • #5
          Hallo Andreas,

          es hat mit der Where Anweisung nichts zu tun. Sie ist in beiden Fällen gleich.

          Beispiel Normfall Query1:

          Select * From KundenDB
          Where KdNr = :SuchKdNr

          Abfrage:
          Query1.Close;
          ParamByName('SuchKdnr').AsInteger := 1234;
          Query1.Open;

          Beispiel Parameter aus DataSource:

          Es existiert eine Table1 (zb. eine RechnungsTable) mit einem Feld "KundenNr".
          Im Objektinspektor wird die Eigenschaft DataSource von QUERY1 auf die DataSource von Table1 gesetzt (in der das Feld "KundenNr" vorhanden sein muss).

          Select * From KundenDB
          Where KdNr = :KundenNr

          Abfrage:
          Das Query muss nur einmal geöffnet werden. Delphi holt sich den Parameter aus Table1.
          Und immer wenn in Table1 (RechnungTable) ein anderer Datensatz gewählt wird, wird das Query sehr schnell von Delphi aktualisiert.
          Der Vorteil gegenüber einem Filter ist das über die Where-Abfrage auch mit "Like %KundenNr%" ausgeführt werden kann, was mit einem Filter nicht zu realisieren ist (soweit ich weiss).

          Hoffentlich habe ich diesmal mein Problem etwas genauer erklärt. Ich frage mich nämlich wie Borland es schafft die Aktualisierung so schnell auch über mehrere tausend Datensätze auszuführen, während der herkömmliche Weg „Close/Open“-Query immer mit einer entsprechenden Verzögerung ausgeführt was uU. bei einem DAU (Dümmster anzunehmender User) die Vermutung aufkommen lässt das Programm ist „abgestürzt“ wenn nicht sofort was passiert.

          Viele Grüsse Bern

          Comment

          Working...
          X