Supportnet / Forum / Datenbanken
wenn-funktionen in access
Frage
Hallo, ich habe ein großes Problem.
Ich habe eine komplette Access datenbank erstellt und möchte nun mehrere wenn-funktionen in einem Textfeld eingeben. Wie kann ich das realisieren?
Zum Beispiel habe ich ein Formular mit den Daten:
Stunden gesamt, Ist- Menge( Was produziert wurde) die Erfüllung( Was geschafft werden musste) und den zuschlag.
Der zuschlag berechnet sich aus mehreren wenn-funktionen. Z.Bsp. wenn Erfüllung >= 2,5 dann 0,29
wenn Erfüllung >=2,56 dann 0,45 wenn Erfüllung >= 2,61 dann 0,61 usw.
Kann mir hier vielleicht jemand helfen?
Antwort 1 von Springmaus
Also in einem Textfeld soll dann diese Zahl stehen?? Oder muss damit weitergerechnet werden?????
Antwort 2 von sjunga
Nein, mit dem Textfeld muss nicht weiter gerechnet werden. Ich glaub ich hab es auch schon hin bekommen, nur jetzt zeigt dieses Fing mir gar nichts mehr an in dem textfeld "zuschlag". Es hat einmal kurz funktioniert und ich hab keine Ahnung mehr woran es liegen könnte. Kannst Du mir vielleicht sagen, warum es nur einmal funktioniert hat? Bzw wie dein Lösungsvorschlag wäre?
Antwort 3 von erik
Mit Wenn-Funktionen begehst du hier einen völlig falschen Ansatz. Solche Daten gehören in eine Tabelle, aus der du dann später - abhängig von der Erfüllung - den richtigen Wert ausliest. Andernfalls müsstest du unangenehmen Wartungsaufwand betreigen, wenn sich Werte ändern oder gar neue Zuschläge hinzugefügt werden.
Probiere meinen Lösungsansatz aus, indem du folgende Schritte durchführst:
1. Direktfenster öffnen mit Tastenkombination Alt+F11
2. Die folgenden zwei Zeilen nacheinander in das Direktfenster kopieren und dort mit ausführen:
Zeile 1 (Tabelle anlegen):
CurrentDb.Execute "CREATE TABLE tblZuschlaege (ZUS_ID COUNTER CONSTRAINT ZUS_ID PRIMARY KEY, ZUS_Erfuellung DOUBLE, ZUS_Zuschlag DOUBLE);"
Zeile 2 (Abfrage anlegen):
CurrentDb.CreateQueryDef "qryZuschlagErmitteln","PARAMETERS FilterErfuellung DOUBLE;SELECT TOP 1 ZUS_Zuschlag FROM tblZuschlaege WHERE ZUS_Erfuellung < [FilterErfuellung] ORDER BY ZUS_Erfuellung DESC;"
In ein neues oder vorhandenes Modul folgende Funktion einfügen:
Public Function ZuschlagErmitteln(Erfuellung As Variant) As Variant
Dim db As Database
Dim qdf As QueryDef
Dim rec As Recordset
If Not IsNull(Erfuellung) Then
Set db = CurrentDb
Set qdf = db.QueryDefs("qryZuschlagErmitteln")
With qdf
.Parameters("FilterErfuellung").Value = Erfuellung
Set rec = .OpenRecordset(dbOpenSnapshot)
.Close
End With
With rec
If Not .EOF Then
ZuschlagErmitteln = .Fields(0).Value
Else
ZuschlagErmitteln = Null
End If
.Close
End With
Else
ZuschlagErmitteln = Null
End If
Set rec = Nothing
Set qdf = Nothing
Set db = Nothing
End Function
Wenn du das erledigt hast, dann kannst du mit dem Aufruf der Funktion deine Werte abrufen, z.b. in der Steuerelementinhalt-Eigenschaft eines Textfeldes im Formular oder auch direkt in VBA:
=ZuschlagErmitteln([ErfüllungFeld])
Zuvor solltest du die Tabelle mit sinnvollen Daten füllen. Falls sie sich ändern sollten, dann machst du das NUR in der Tabelle, sonst nirgends.
Probiere meinen Lösungsansatz aus, indem du folgende Schritte durchführst:
1. Direktfenster öffnen mit Tastenkombination Alt+F11
2. Die folgenden zwei Zeilen nacheinander in das Direktfenster kopieren und dort mit ausführen:
Zeile 1 (Tabelle anlegen):
CurrentDb.Execute "CREATE TABLE tblZuschlaege (ZUS_ID COUNTER CONSTRAINT ZUS_ID PRIMARY KEY, ZUS_Erfuellung DOUBLE, ZUS_Zuschlag DOUBLE);"
Zeile 2 (Abfrage anlegen):
CurrentDb.CreateQueryDef "qryZuschlagErmitteln","PARAMETERS FilterErfuellung DOUBLE;SELECT TOP 1 ZUS_Zuschlag FROM tblZuschlaege WHERE ZUS_Erfuellung < [FilterErfuellung] ORDER BY ZUS_Erfuellung DESC;"
In ein neues oder vorhandenes Modul folgende Funktion einfügen:
Public Function ZuschlagErmitteln(Erfuellung As Variant) As Variant
Dim db As Database
Dim qdf As QueryDef
Dim rec As Recordset
If Not IsNull(Erfuellung) Then
Set db = CurrentDb
Set qdf = db.QueryDefs("qryZuschlagErmitteln")
With qdf
.Parameters("FilterErfuellung").Value = Erfuellung
Set rec = .OpenRecordset(dbOpenSnapshot)
.Close
End With
With rec
If Not .EOF Then
ZuschlagErmitteln = .Fields(0).Value
Else
ZuschlagErmitteln = Null
End If
.Close
End With
Else
ZuschlagErmitteln = Null
End If
Set rec = Nothing
Set qdf = Nothing
Set db = Nothing
End Function
Wenn du das erledigt hast, dann kannst du mit dem Aufruf der Funktion deine Werte abrufen, z.b. in der Steuerelementinhalt-Eigenschaft eines Textfeldes im Formular oder auch direkt in VBA:
=ZuschlagErmitteln([ErfüllungFeld])
Zuvor solltest du die Tabelle mit sinnvollen Daten füllen. Falls sie sich ändern sollten, dann machst du das NUR in der Tabelle, sonst nirgends.
Antwort 4 von sjunga
Hallo Erik!
Wo muss ich diese ellenlange Funktion in access eintragen? In meinem Textfeld Zuschlag, direkt in dem Formular oder wo? Deine Idee war wirklich gut aber ich habe keine Ahnung wie ich das Ding zum laufen kriege. Muss es vor dem Laden als Ereignisprozedur rein oder wie? Mfg Steffi
Wo muss ich diese ellenlange Funktion in access eintragen? In meinem Textfeld Zuschlag, direkt in dem Formular oder wo? Deine Idee war wirklich gut aber ich habe keine Ahnung wie ich das Ding zum laufen kriege. Muss es vor dem Laden als Ereignisprozedur rein oder wie? Mfg Steffi
Antwort 5 von erik
Die Funktion muss in ein VBA-Modul kopiert werden. Klicke auf das Datenbankfenster und dann im Menü "Einfügen" auf "Modul". Dort wo der Cursor dann blinkt, fügst du den o.g. Code ein. Speichere das Modul unter einem beliebigen Namen, z.B. "basZuschlaege"
Wo die Funktion aufgerufen wird, hängt von den Umständen ab, wann du es ausgeführt haben willst. Nach Änderung einer Erfüllung? Soll der Wert in einer Tabelle gespeichert werden? Oder nur im Formular angezeigt werden?
Wo die Funktion aufgerufen wird, hängt von den Umständen ab, wann du es ausgeführt haben willst. Nach Änderung einer Erfüllung? Soll der Wert in einer Tabelle gespeichert werden? Oder nur im Formular angezeigt werden?
Antwort 6 von sjunga
Es reicht wenn der Wert nur ausgegeben wird. Ich habe die Prozedur in ein Modul eingefügt aber er meckert jetzt rum und gibt mir den Fehler "Benutzerdefinierter Teyp nicht defioniert und verweist auf :
Public Function ZuschlagErmitteln(Erfuellung As Variant) As Variant
Dim db As Database
Hast du eine Ahnung woran es leigen könnte?
Public Function ZuschlagErmitteln(Erfuellung As Variant) As Variant
Dim db As Database
Hast du eine Ahnung woran es leigen könnte?
Antwort 7 von erik
Ja, du verwendest Access 2000 oder höher und hast keinen Verweise auf DAO eingerichtet. Siehe FAQ 7.1

