Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

VBA-Code funktioniert nicht

Begonnen von ChemSim, Januar 26, 2025, 13:00:38

⏪ vorheriges - nächstes ⏩

ChemSim

Hallo zusammen,

ich habe ein Problem, bei dem ich nicht weiterkomme. In meiner DB habe ich ein Formular frmAnlagenverwaltung, welches mit der Tabelle tblAnlagen verknüpft ist. Das Formular frmAnlagenverwaltung besitzt zudem noch ein Unterformular ufrmKapazitäten, welches wiederum mit der Tabelle tblKapazitäten verknüpft ist. Auf dem Formular frmAnlagenverwaltung gibt es ein Textfeld txtGesamtKapazität, welches für jede AnlageID die Gesamtkapazität aus den Einzelkapazitäten im Unterformular ufrmKapazitäten berechnet. Das Textfeld txtGesamtKapazität nutzt dabei den folgenden Code als Steuerelementinhalt:

=Wenn(IstNull(DomWert("Kapazität";"tblKapazitäten";"AnlageID_F = " & [AnlageID]));"n.a.";Wenn(DomSumme("Kapazität";"tblKapazitäten";"AnlageID_F = " & [AnlageID])=0;"stillgelegt";DomSumme("Kapazität";"tblKapazitäten";"AnlageID_F = " & [AnlageID])))

Hier wird im Textfeld txtGesamtKapazität der Wert "n.a." ausgegeben, wenn keine Kapazitäten im ufrmKapazitäten eingetragen wurden. Der Wert "stillgelegt" wird ausgegeben, wenn der Berechnung auf den Wert 0 hinausläuft. In allen anderen Fällen, wird einfach die Summe der Einzelkapazitäten ausgegeben. Dies funktioniert auch so primar.

Um den Wert der Gesamtkapazität später noch weiterzuverarbeiten, habe ich in der Tabelle tblAnlagen ein zusätzliches Feld "Gesamtkapazität" eingefügt, welches als "Kurzer Text" formatiert ist. Nun möchte ich die berechnete Gesamtkapazität im Textfeld txtGesamtKapazität für jede AnlageID in die Tabelle tblAnlagen in das Feld "Gesamtkapazität" schreiben. Dazu habe ich im Formular frmAnlagenverwaltung den folgenden VBA-Code eingefügt. Dieser funktioniert auch soweit, dass nach Aktualisierung des Formulars die entsprechende Gesamtkapazität in der Feld der Tabelle tblAnlagen geschrieben wird, allerdings werden die Wörter "n.a" und "stillgelegt" nicht hineingeschrieben, sondern es steht dann einfach nichts drin. Ich möchte aber gerne auch diese Wörter im Feld "Gesamtkapazität" schreiben, da ich dieses ja extra mit dem Felddatentyp "Kurzer Text" ausgestattet habe.

Private Sub Form_AfterUpdate()
    ' Berechnung und Speicherung der GesamtKapazität, falls der Wert im Hauptformular verändert wird
    Dim Gesamtkapazität As Variant
    If IsNull(DLookup("Kapazität", "tblKapazitäten", "AnlageID_F = " & Me.AnlageID)) Then
        Gesamtkapazität = "n.a."
    ElseIf DSum("Kapazität", "tblKapazitäten", "AnlageID_F = " & Me.AnlageID) = 0 Then
        Gesamtkapazität = "stillgelegt"
    Else
        Gesamtkapazität = DSum("Kapazität", "tblKapazitäten", "AnlageID_F = " & Me.AnlageID)
    End If

    ' Speichern des berechneten Wertes in die Tabelle tblAnlagen
    If Gesamtkapazität <> "n.a." And Gesamtkapazität <> "stillgelegt" Then
    ' Wenn Gesamtkapazität eine gültige Zahl ist, als Text speichern
        CurrentDb.Execute "UPDATE tblAnlagen SET Gesamtkapazität = '" & CStr(Gesamtkapazität) & "' WHERE AnlageID = " & Me.AnlageID
    Else
    ' Wenn Gesamtkapazität "n.a." oder "stillgelegt" ist, als Text speichern
        CurrentDb.Execute "UPDATE tblAnlagen SET Gesamtkapazität = '" & Gesamtkapazität & "' WHERE AnlageID = " & Me.AnlageID
    End If
   
    'AMV-Explorer
    Call SetPath
End Sub

Hat jemand eine Idee, wie ich das hinbekomme?

Gruß
Simon

MzKlMu

Hallo,
das Vorhaben dürfte nicht notwendig sein. In einer Datenbank speichert man nur in seltenen Sonderfällen berechnete Werte.
So wie Du im Formular rechnest, kannst Du auch in eine Abfrage rechen und diese verwenden, wenn die Gesamtkapazität benötigt wird. Außerdem würde ich eine Zahl immer als Zahl errechen und den Text "Stillgelegt" nur beim Anzeigen hinzufügen, aber neimals so speichern.
Gruß Klaus

ChemSim

Hallo,

ich habe ein zweites Formular frmAnlagen, welches ich als Endlosformular eingestellt habe und tabellenförmig angeordnert habe. Ich nutze es, um die Anlagen zu filtern und "schön" in Tabellenform auszugeben. Auf diesem Formular habe ich auch ein Textfeld txtGesamtkapazität, um die Gesamtkapazität anzuzeigen. Wenn ich allerdings nicht "Kurzer Text" als Felddatentyp hinterlegt habe, sondern nur "Integer", so kann ich keine Texte wie "n.a." oder "stillgelegt" in dem gleichen Textfeld anzeigen und müsste ein extra Textfeld erstellen, nur um gelegentlich diesen "Hinweis" anzuzeigen. Daher möchte ich es gerne so wie oben beschrieben lösen. Geht das?

Knobbi38

Sicherlich kannst du einen Datentyp Long (Integer nimmt man eigentlich nicht mehr) verwenden, denn "n.a." ist ja gleichbedeutend mit NULL und "Stillgelegt" mit 0. Das kann man auch mit einem Ausdruck bei der Anzeige oder in der Abfrage abfangen. Ansonsten gilt natürlich das, was Klaus schon angemerkt hat.

Gruß Knobbi38

 

MzKlMu

Hallo,
der Felddatentyp bleibt Zahl. Das Feld zur Anzeige kannst Du mit einer einfachen Wenn Funktion auf dem Formular (oder besser in einer Abfrage) erzeugen.
GesKap: Wenn(Gesamtkapazität = 0;"Stillgelegt;Gesamtkapazität)Es wird dann nur das Abfragefeld GesKap angezeigt, das eigentliche Feld "Gesamtkapazität" wird nicht angezeigt.
Und das Speichern der Gesamtkapazität in der Tabelle ist wie gesagt überflüssig. Nur wenn Du nicht speicherst, sondern immer berechnest wenn es benötigt wird, kannst Du sicher sein dass der Wert stimmt.
Gruß Klaus

ChemSim

Das verstehe ich nicht, oben schreibst du, dass ich keine berechneten Werte in der Tabelle speichern soll, dann gibt es aber auch das Feld "Gesamtkapazität", welches du in dem Code

GesKap: Wenn(Gesamtkapazität = 0;"Stillgelegt;Gesamtkapazität)
nutzt, nicht. Wie bereits beschrieben berechne ich die Gesamtkapazität in dem Textfeld txtGesamtKapazität (ungebunden!) im Formular frmAnlageverwaltung. Beim Filtern der Anlagen und Übergabe auf das Darstellungsformular frmAnlagen kann ich den berechneten Wert nicht einfach übergeben, weil sich damit nicht weiterrechnen lässt (z. B. Summe bilden). Daher bin ich den Zwischenschritt gegangen und habe den berechneten Wert erstmals in das Feld "Gesamtkapazität" der Tabelle tblAnlagen gespeichert. Im übrigen wird dieser immer aktualisiert, sobald sich die Gesamtkapazität im Textfeld txtGesamtKapazität im Formular frmAnlageverwaltung ändert.

MzKlMu

Hallo,
ich bin davon ausgegangen, dass das ein berechnetes Feld in einer Abfrage oder Formular ist.
Gruß Klaus

ChemSim

#7
Ich habe es bereits mit dem Code

Private Sub Form_AfterUpdate()
    ' Berechnung und Speicherung der GesamtKapazität in die Tabelle tblAnlagen
    Dim Gesamtkapazität As Variant
   
    If IsNull(DLookup("Kapazität", "tblKapazitäten", "AnlageID_F = " & Me.AnlageID)) Then
        Gesamtkapazität = "n.a."
    ElseIf DSum("Kapazität", "tblKapazitäten", "AnlageID_F = " & Me.AnlageID) = 0 Then
        Gesamtkapazität = "stillgelegt"
    Else
        Gesamtkapazität = DSum("Kapazität", "tblKapazitäten", "AnlageID_F = " & Me.AnlageID)
    End If

    ' Speichern des berechneten Wertes in die Tabelle tblAnlagen
    If Gesamtkapazität <> "n.a." And Gesamtkapazität <> "stillgelegt" Then
        CurrentDb.Execute "UPDATE tblAnlagen SET Gesamtkapazität = " & Gesamtkapazität & _
            " WHERE AnlageID = " & Me.AnlageID
    Else
        ' Wenn Summe Kapa = 0, dann "stillgelegt" in Tabelle tblAnlagen schreiben
        CurrentDb.Execute "UPDATE tblAnlagen SET Gesamtkapazität = 'stillgelegt' WHERE AnlageID = " & Me.AnlageID
    End If
   
    'AMV-Explorer
    Call SetPath
End Sub

hinbekommen und das Ergebnis ist für mich zufriedenstellend.