Waldemar Neugerber: Feld in Abfrage berechnen

Hallo zusammen,

ich habe Folgendes kürzlich herausgefunden: in einer ms-access Datenbank kann man z.B. bei der Erstellung einer Abfrage ein Feld aus Werten anderer Felder berechnen und das Ergebnis dort speichern.

Die dazu notwendige Funktion ist in einem globalen Modul der mdb gespeichert. Echt prima Sache.

Kann man so etwas auch mit MySQL? (Version 4.1+)
Wenn ja, wie/wo wird die Funktion notiert und wie wird sie eingebunden?

Tipps zu mir bitte ;-)
Waldemar

  1. Hallo,

    ich habe Folgendes kürzlich herausgefunden: in einer ms-access Datenbank kann man z.B. bei der Erstellung einer Abfrage ein Feld aus Werten anderer Felder berechnen

    Ja, z.B. so:
    Tabelle1:
    Feld1   Feld2
    1       4
    2       5
    3       6

    SELECT Feld1, Feld2, [Feld1]*[Feld2] AS Produkt
    FROM Tabelle1;

    Feld1   Feld2   Produkt
    1       4       4
    2       5       10
    3       6       18

    und das Ergebnis dort speichern.

    Das müsstest Du näher erläutern.

    Die dazu notwendige Funktion ist in einem globalen Modul der mdb gespeichert. Echt prima Sache.

    Das müsstest Du auch näher erläutern.

    Kann man so etwas auch mit MySQL? (Version 4.1+)
    Wenn ja, wie/wo wird die Funktion notiert und wie wird sie eingebunden?

    SELECT Feld1, Feld2, Feld1*Feld2 AS Produkt
    FROM Tabelle1;

    viele Grüße

    Axel

    1. Hallo Axel,

      Die dazu notwendige Funktion ist in einem globalen Modul der mdb gespeichert. Echt prima Sache.

      Das müsstest Du auch näher erläutern.

      Du kannst in einem Modul eine VB-Funktion schreiben, z.B.

      Public Function intMeineSupaDupaFunktion( _
          byVal intIrgendwas As Integer) As Integer

      ' Berechne irgendwie einen Rückgabewert
      End Function

      und diese benutzerdefinierte Funktion bei Views - Du weißt ja, das was Access Auswahlabfragen nennt - verwenden.

      Kann man so etwas auch mit MySQL? (Version 4.1+)

      Ja, kann man.

      Wenn ja, wie/wo wird die Funktion notiert und wie wird sie eingebunden?

      Das steht im Handbuch, siehe Adding New Functions to MySQL

      Freundliche Grüße

      Vinzenz

      1. Hallo,

        Du kannst in einem Modul eine VB-Funktion schreiben, z.B.

        Public Function intMeineSupaDupaFunktion( _
            byVal intIrgendwas As Integer) As Integer

        ' Berechne irgendwie einen Rückgabewert

        intMeineSupaDupaFunktion = 5

        End Function

        und diese benutzerdefinierte Funktion bei Views - Du weißt ja, das was Access Auswahlabfragen nennt - verwenden.

        Tatsächlich:

        SELECT Feld1, Feld1*intMeineSupaDupaFunktion(1) AS Produkt
        FROM Tabelle1;

        Feld1   Produkt
        1       5
        2       10
        3       15

        Nie gebraucht sowas ;-).

        viele Grüße

        Axel

      2. Hallo Vinzenz,

        Du kannst in einem Modul eine VB-Funktion schreiben, z.B.

        und diese benutzerdefinierte Funktion bei Views - Du weißt ja, das was Access Auswahlabfragen nennt - verwenden.

        Aha, Views == Auswahlabfrage. Ok.

        Kann man so etwas auch mit MySQL? (Version 4.1+)

        Ja, kann man.

        Wenn ja, wie/wo wird die Funktion notiert und wie wird sie eingebunden?

        Das steht im Handbuch, siehe Adding New Functions to MySQL

        Hab ich gerade gelesen, hat sich dann auch schon erledigt, leider.
        Ich habe nur einen 'ArmeLeuteWebspace' mit Zugriff auf EineMeineMySQL-DB. Um eine UserFunction in MySQL zu erzeugen usw. muß man Zugriff auf die MySQL-Datenbank haben (also die in denen alle Systemtabellen enthalten sind). Und das ist ja aus gutem Grund nicht möglich für mich.

        Trotzdem komme ich so schon ein Stück weiter als vorher. Ich werde mir zwei bis drei Views anlegen.

        Bisher habe ich die (3) MySQL-Tabellen in der mdb als Verknüpfungen integriert. Ich kann also über ODBC direkt darauf zugreifen und auch Auswahlabfragen/Views damit erstellen. Aber, warum auch immer, die lassen sich nicht nach beliebigen Feldern sortieren.

        Deshalb ist es bestimmt besser, ein View einzubinden, oder es auch dann direkt mit einem PHP-TabellenZeigeScript auf dem Webserver anzuschauen, anstatt den Umweg über die MDB zu gehen.

        Die Sache mit der UserFunction ist/war in sofern praktisch als das ich  die Differenz zweier Datumsfelder in einem lese_freundlichen Format ausgegeben habe. Also wenn die Differenz irgendwas unter einer Stunde ist, gibt es '45 Min' zurück. Bei mehreren Stunden z.B. '7:21 Std' und bei mehreren Tagen dann '4:03 Tage'. Nicht wirklich notwendig, aber in dem Fall sehr praktisch. (Und wenn es mit so geringem Aufwand geht, in msaccess, warum nicht.)

        Vielen Dank für alle Tips und Erklärungen (an alle Poster),
        Waldemar

    2. Hi,

      SELECT Feld1, Feld2, [Feld1]*[Feld2] AS Produkt
      FROM Tabelle1;

      nunja, das ist die halbe Wahrheit (auch wenn es den in der Praxis gangbaren Weg darstellt), SQL:2003 hat da aber noch eine etwas andere Vorstellung. Stell dir vor du machst diese Abfrage in hoher Anzahl, da wäre es effizienter den Wert zu speichern. Der aktuelle Standard bietet daher folgendes Konstrukt innerhalb der Table-Definition an:
      CREATE TABLE x (
         Gehalt DECIMAL(12,2),
         Bonus DECIMAL(12,2),
         Total GENERATED ALWAYS AS (Gehalt + Bonus)
      )

      Aber wie gesagt, da die DB höchstwahrscheinlich Views cachen wird ist deine Variante kombiniert mit einer Viewdefinition wahrscheinlich die praktische Herangehensweise.

      MfG
      Rouven

      --
      -------------------
      When the only tool you've got is a hammer, all problems start to look like nails.
      1. Hallo,

        CREATE TABLE x (
           Gehalt DECIMAL(12,2),
           Bonus DECIMAL(12,2),
           Total GENERATED ALWAYS AS (Gehalt + Bonus)
        )

        Das kann aber bisher weder MS Access noch MySQL, oder? IBM DB2 kann es, wer noch?

        viele Grüße

        Axel