Announcement

Collapse
No announcement yet.

Mehrere Access Abfragen in eine SQL Abfrage packen

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

  • Mehrere Access Abfragen in eine SQL Abfrage packen

    Hello

    In Access ist es relative einfach, in eine Abfrage nicht nur Tabellen sondern auch andere Abfragen zu packen.

    Ich habe unten so ein Beispiel: Ich habe ein Personentabelle und je eine
    Einnahmen- und Ausgaben-Tabelle.

    Ich möchte nun eine Abfrage erstellen, die mir alle Personen mit dem Total Einnahmen und Total Ausgaben anzeigt, plus die Differenz zwischen Einnahmen und Ausgaben.

    Dazu habe ich drei Abfragen in Access 97 erstellt:

    Je eine, die die Summen für Einnahmen und Augaben berechnen, und die dritte
    verbindet die Summen dann mit der Person.
    Die Abfragen sehen wie folgt aus:

    SELECT a_person, Sum(a_preis) AS a_total
    FROM ausgang
    GROUP BY a_person;

    SELECT e_person, Sum(e_preis) AS e_total
    FROM eingang
    GROUP BY e_person;

    SELECT name, [a_total]*1 AS ein, [e_total]*1 AS aus, [e_total]-[a_total] AS saldo
    FROM (person LEFT JOIN atotal ON person.nr = atotal.a_person) LEFT JOIN etotal ON person.nr = etotal.e_person;

    Da ich das ganze nicht in Access machen will, sondern mit Delphi5 und ADO,
    möchte ich die gleiche Lösung in nur einer einzigen Abfrage (SQL Befehl) erreichen. Geht das?

    Wenn ich es so probiere,

    SELECT person.name, Sum(ausgang.a_preis) AS [Summe von a_preis], Sum(eingang.e_preis) AS [Summe von e_preis]
    FROM (person LEFT JOIN ausgang ON person.nr = ausgang.a_person) LEFT JOIN eingang ON person.nr = eingang.e_person
    GROUP BY person.name;

    dann werden die Summen falsch berechnet.

    Bin für jeden Lösungsansatz sehr dankbar
    MfG
    Markus Welten

    P.S: Ausserdem gibt es noch das Problem, wenn bei einer Person keine Einnahmen oder Ausgaben vorhanden sind. Da das ein NULL Wert ist, kann man
    keine Differenz ausrechnen. Access hat dafür die Funktion NZ(), um einen NULL Wert in ein 0 umzuwandeln. Aber Delphi (ADO) kennt diese Function nicht.

  • #2
    Hallo,

    hinter ADO verbirgt sich keine Datenbank, sondern nur Zugriffsobjekte für den Datenzugriff auf eine Datenbank. Je nach verwendeten OLE DB-Provider kann man über ADO auf ACCESS, dBASE, Paradox, ORACLE, InterBase, MS SQL Server oder auf jede andere Datenbank zugreifen, für die ein <i>OLE DB Provider</i> bzw. <i>ODBC-Treiber</i> zur Verfügung steht. Somit kann ADO automatisch alles das, was die verwendete Datenbank kann. Der Microsoft SQL Server 7/2000 kennt zum Beispiel die Funktion ISNULL, um bei NULL-Werten einen alternativen Wert zurückliefern zu können.

    Wenn keine ACCESS-Datenbank verwendet werden soll, <b>welche</b> Datenbank wird denn dann genutzt, um über ADO darauf zuzugreifen

    Comment


    • #3
      Ich greife mit Delphi über 'Jet 4.0 OLE DB Privider' auf eine Access 97 DB zu.

      ISNULL liefert da ja nur ein Boolean zurück.

      Ich habe auch folgende Select Anweisung ausprobiert:
      (Damit bin ich bis jetzt am weitesten gekommen)

      SELECT Person.name,
      (Select iif(isnull(Sum(Einnahmen)),0,Sum(Einnahmen)) from Einnahmen where aPerson=Person.Nr) AS Ein,
      (Select iif(isnull(Sum(Ausgaben)),0,Sum(Ausgaben)) from Ausgaben where aPerson=Person.Nr) AS Aus,
      [Aus]-[Ein] AS Differenz
      FROM Person;

      Soweit wäre alles okay (es sieht nur ziemlich kompliziert aus; gibt es keine einfachere Möglichkeit?).
      Was aber nicht funktioniert ist das sortieren. Ich will es dem Benutzer überlassen nach welcher Spalte er sortiert haben will.
      Und 'Order by Aus' funktioniert nicht. Und 'Order by (sum(ausgaben))'
      oder 'Order By 2' leider auch nicht.
      &#10

      Comment


      • #4
        Hallo,

        wenn als Datenbank nur ACCESS verwendet wird, gibt es doch keinen Grund, nach Alternativen zu suchen.

        Was das Sortieren angeht, kann diese Aufgabe das RecordSet-Objekt von ADO automatisch erledigen. Das folgende Beispiel zeigt, wie ein Anklicken der Spaltenbeschriftung im TDBGrid die Sortierreihenfolge aufsteigend/absteigend umschaltet, ohne dass eine erneute Abfrage der Daten notwendig wird:
        <pre>
        procedure TForm1.DBGrid1TitleClick(Column: TColumn);
        begin
        with TADODataSet(Column.Field.DataSet) do
        begin
        if Sort = Column.Field.FieldName then
        Sort := Column.Field.FieldName + ' DESC'
        else
        Sort := Column.Field.FieldName;
        StatusBar1.Panels[1].Text := Format('Sortiert nach %s', [Sort]);
        end;
        end;
        </pre&gt

        Comment


        • #5
          Hallo

          Vielen Dank für den Filter Hinweis.

          Trotzdem noch zwei Fragen:

          1. Wieso funktioniert NZ(SUM(wert),0) nicht von Delphi aus (nur Access intern). Ist Iff(IsNull(SUM(wert)),0,SUM(wert)) wirklich die einzige Möglichkeit um der NZ Funktion gleichzukommen?

          2. Wie packt man mehrere Select Anweisungen in eine?
          Zum Beispiel: Die Summen aus zwei Tabellen mit einer Namenstabelle zu verknüpfen (siehe meine erste Mail oben)

          Comment


          • #6
            Macht es beim Filtern genau so viel Sinn wie beim Sortieren?

            Ich meine, wo findet der Filterprozess statt. Beim Client (Anwendungsprogramm/Delphi) oder beim Server (Access DB)

            Comment


            • #7
              Hallo Markus,

              bei Desktop-Datenbanken wie Access findet der Filterprocess immer auf dem Client statt.

              Tschüß

              Torste

              Comment

              Working...
              X