Announcement

Collapse
No announcement yet.

ADO und Access97

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

  • ADO und Access97

    Hallo,<BR><BR>Hoffentlich drücke ich mich verständlich aus:<BR>Für unser Projekt müssen wir (leider) auf Access97 zurück greifen, da es der Kunde so will. Unser Daten liegen in einer Vielzahl von Tabellen vor, die zusätzlich noch über Zeitraumintervalle selektiert werden müssen. Das bedeutet für uns, dass wir auf diese Tabellen zuerst Unterabfragen erstellen müssen, die die Datensätze über den Zeitpunkt einschränken. Anschließend wird die finale Abfrage gestellt, die die Unterabfragen über left join (weil es können dort auch keine Werte vorliegen) miteinander verbindet. Das Datum zur Erstellung der Unterabfragen ist natürlich variabel, so dass die dynamisch erstellt werden müssen. Und genau das ist das Problem!<BR>Soviel ich weiß, ist es in Access innerhalb einer Abfrage nicht möglich Klammern für Unterabfragen in der Form:<PRE>
    select ... from x left join
    (select ... from y where VonDatum <= ... and BisDatum >= ...)</PRE>
    zu stellen. Diese Möglichkeit keine Unterabfragen zu schreiben, sondern gleich alles in einer Abfrage zu verknüpfen, scheidet also aus. Das Select innerhalb der Klammer muss in eine separate Abfrage.<BR>Nun, da wir bis jetzt keine Möglichkeit gefunden haben direkt aus Delphi heraus eine neue Abfrage zu generieren, sind wir den Umweg über eine Procedure direkt in Access gegangen. Dazu sprechen wir Access als COM-Object an, und steuern es fern, sprich wir rufen die Procedure mit dem Datum als Parameter auf. Diese erstellt uns sehr brav die Unterabfragen. Das klappt auch alles! Aber, wenn wir anschließend die finale Abfrage öffnen wollen, dann erhalten wir eine Fehlermeldung, dass eine der gerade neu erstellten Abfragen nicht existiert. Der Witz ist natürlich, dass es genau zu diesem Zeitpunkt sehr wohl diese Abfrage gibt!<BR>Wir haben nun vermutet, dass dadurch bedingt, dass wir einerseits die ADOConnection offen halten, und andererseits Access fernsteuern, die Connection nicht automatisch den Datenbankkatalog aktualisiert, und genau das scheint auch das Problem zu sein. Wenn wir die ADOConnection abbauen und wieder neu erstellen, klappt alles - aber - das dauert doch ziemlich lange, zu lange!<BR>Nun meine Frage: Gibt es eine Möglichkeit direkt über ADO Abfragen in Access97 zu erstellen? Dann könnte man sich das Fernsteuern sparen. Oder gibt es eine schnellere Möglichkeit den Katalog zu refreshen? Jeder Tip wäre Klasse!!!<BR>Vielen Dank für die Mühen, schon jetzt.<BR><BR>Olaf

  • #2
    Hallöchen,

    ich habe das mal so gemacht, daß ich die (Sub-) Queries in eine Datenbanktabelle gestellt habe und dann zur Laufzeit zusammengewurstelt habe (und die zur Querybildung benötigten Werte anschließend aus der DB gelöscht habe).
    Übrigens habe ich auch schon mit Subqueries gearbeitet. Ich bin aber kein Fan von Joins (finde ich unübersichtlicher) und kann deshalb definitiv nur sagen, daß Abfragen der form

    SELECT x, y FROM z
    WHERE (Select a,b FROM c WHERE c.x = x) (x hier evtl. mit ":" als Parameter)

    funktionieren

    Grüzzlis von
    Thoma

    Comment


    • #3
      Hallo Olaf,

      ich bin mir nicht so recht im klaren was Access alles kann und was nicht, aber wie sieht es z.B. mit Views aus? Diese könntest due ja zur Not per SQL direkt über die ADO-Connection erstellen (create view viewname as select...) und anschließend wieder löschen (drop view viewname).
      Vielleicht hilft aber auch schon eine Abfrage in der Form:<pre>
      select x, y
      from a
      where a.fk in (
      select b.pk
      from b
      where b.datum between VonDatum and BisDatum)</pre>

      Gruß Fal
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo Thomas, hallo Falk,<BR><BR>
        vielen Dank für eure Wortmeldungen. CREATE VIEW schied für uns von vorn herein aus, weil Access selbst diesen Befehl nicht unterstützt. Um so größer war nun mein Erstaunen, als ich den Befehl erfolgreich über eine ADO-Connection absetzen konnte. Auch das Löschen funktioniert (der Laie staunt, der Fachmann wundert sich :-) ).<BR>
        Na ja, wir haben aber auch noch eine andere Lösung gefunden, denn das merkwürdige Zeitverhalten von Access bleibt. So haben wir die Unterabfragen statisch in der Accessdatenbank erstellt und dabei jeweils unter die Datumsfelder einen Parameter geschrieben. Das geht mit Access über einen Ausdruck in Klammern, der anders heißen muss als die Felder der beteiligten Tabellen, z.B. [Datumsangabe]. Da die Teilabfragen nun schon vorliegen, konnten wir auch die Endergebnisabfrage mit unseren LEFT JOIN fertigstellen (die Select-Vorschläge von euch funktionieren hier leider nicht). Wird diese aktiviert, öffnet sich in Access ein Eingabefenster und fordert den User auf ein Datum einzugeben. Da der Parametername in allen Unterabfragen gleich ist, reicht ihm also eine Eingabe.<BR>In Delphi über ein ADODataSet stellt sich das nun so dar, dass man im Commandtext einfach schreiben kann: <B>select * from [Endergebnis] where ...</B>, wobei das Datum als ein Parameter übergeben werden kann (ADODataSet1.Parameters[0].Value = ...). Und das funktioniert prächtig, und auch recht schnell!<BR><BR>Trotzdem nochmal vielen Dank für die Meldungen!<BR><BR>Ola

        Comment

        Working...
        X