eifeladmin
Goto Top

Access VBA Werte verrechnen

VBA Werte von Formular mit Werte in Tabelle verechnen

Hallo Community,

ich hatte vor einiger Zeit schon mal einen Beitrag über eine Tonerverwaltung in Access gemacht.
Dabei will ich den Toner auswählen und eine Anzahl eingeben. Die Anzahl soll dann mit dem Wert in der Tabelle verrechnet werden.
Ich habe da mit VBA beim Schließen des Formulares schon mal was pobiert aber irgendwie funktioniert das nicht:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

Dim anzahl1 As Integer
Dim anzahl2 As Integer
Dim ergebnis As Integer

Set Dbs = CurrentDb
strSQL = "SELECT * FROM Toner"  
Set rs = db.OpenRecordset(strSQL)

If Not rs.EOF Then rs.MoveFirst

Do While Not rs.EOF
  anzahl1 = rs!Feldname
Loop

rs.Close
Set rs = Nothing
Set db = Nothing

Set Dbs = CurrentDb
strSQL = "SELECT * FROM Tonerausgabe"  
Set rs = db.OpenRecordset(strSQL)

If Not rs.EOF Then rs.MoveFirst

Do While Not rs.EOF
  anzahl2 = rs!Feldname
Loop

ergebnis = anzahl11 - anzahl2
DoCmd.RunSQL ("update toner set anzahl=ergebnis ;")  

rs.Close
Set rs = Nothing
Set db = Nothing

Aber ich wage zu bezweifeln das dies richtig ist.

Ich wäre für Hilfe sehr Dankebar.

Gruß
Nemo

Content-Key: 94932

Url: https://administrator.de/contentid/94932

Printed on: April 23, 2024 at 23:04 o'clock

Member: Logan000
Logan000 Aug 21, 2008 at 06:46:48 (UTC)
Goto Top
Moin Moin

Ich hab n paar Fragen dazu:
Die Tabellen Toner und Tonerausgabe enthalten nur einen Datensatz?

ergebnis = anzahl11 - anzahl2
Wo kommpt plötzlich die Variable anzahl11 her? Tippfehler?

Ich habe da mit VBA beim Schließen des Formulares schon mal was pobiert aber irgendwie funktioniert das nicht:
Bekommst du Fehlermeldungen?

Ein paar Anmerkungen
Set Dbs = CurrentDb
Ist doppelt gemoppelt. Reicht einmal. genauso wie:
Set rs = Nothing
Set db = Nothing

Wenn du Code postet verwende bitte das Tag (siehe Formatierungshilfe).

Gruß L.
Member: Eifeladmin
Eifeladmin Aug 21, 2008 at 09:55:21 (UTC)
Goto Top
Hi,

1. die beiden Tabellen sollen mehrere Datensätze enthalten.

2. Ja das war wohl ein Tippfehler von mir.

3. Da kommt eine Meldung mit Debuggen.

Danke.
Member: Logan000
Logan000 Aug 21, 2008 at 10:17:02 (UTC)
Goto Top
1. die beiden Tabellen sollen mehrere Datensätze enthalten.
Und da fängt es schon an. Welche Datensätze sollen den Addiert werden?

3. Da kommt eine Meldung mit Debuggen.
Nee die kenn ich nicht. face-wink

Im folgenden Code läuft sich deine Funktion auch tot.
If Not rs.EOF Then rs.MoveFirst 
Do While Not rs.EOF
    anzahl1 = rs!Feldname
Loop
Da du kein rs.movenext machst stehst du immer auf dem gleichen Datensatz. Da kommt er nicht mehr raus.

Gruß L.
Member: Eifeladmin
Eifeladmin Aug 21, 2008 at 11:03:58 (UTC)
Goto Top
Hi,

also ich möchte das dann so realisieren das wenn ich das Formular auf mache er einen neuen Datensatz öffnet.
Könnte man dan nicht zum letzten Datensatz springen?
Member: Logan000
Logan000 Aug 21, 2008 at 11:38:30 (UTC)
Goto Top
also ich möchte das dann so realisieren das wenn ich das Formular auf mache er einen neuen Datensatz öffnet.
Das kann man wohl machen.

Könnte man dan nicht zum letzten Datensatz springen?
Klar, aber warum sind dann überhaupt mehrere Datensätze in der Tabelle wenn du nur den letzen nimmst.

Aber zurück zu Deiner Funktion:
Mir ist überhaupt nicht klar was die machen soll,
was für informationen in den Tabellen "Toner" und "Tonerauswahl" stehen,
und was das Ziel dieser addition sein/werden soll.

Du schreibst du willst eine "Tonerverwaltung" realisieren. OK, aber das einzige was man mit Toner machen kann ist verbrauchen. Also soll das ein Bestandszähler werden?
Wenn das so ist, wozu dein die 2 tabellen?
Warum nicht nur eine mit den Feldern "Tonertyp" und "Anzahl".

Gib mal ein bisschen mehr konzeptionelle Info.

Gruß L.
Member: Eifeladmin
Eifeladmin Aug 21, 2008 at 17:51:14 (UTC)
Goto Top
Hi

also der kurz zur Erklärung:
Ich möchte in der Tabelle "Toner" alle Toner erfassen (mit Bezeichnung, Hersteller und der Anzahl wieviele noch auf Lager sind)
In der Tabelle "Tonerausgabe" muss ich erfassen welche Abteilung welchen Toner von uns bekommen hat, da ich am Ende vom Monat dem Controlling eine Liste zur Verfügung stelle welcher Toner an welche Abteilung gegeangen ist.
Nun möchte ich je nachdem wieviele Toner von der Bezeichnung an die Abteilung gegangen sind die Anzahl in der Tabelle "Toner" verringern, um immer einen Überblick zu haben wieviele Toner sind noch im Lager.

Gruß
Nemo
Member: Logan000
Logan000 Aug 22, 2008 at 09:22:41 (UTC)
Goto Top
Moin
Ok, du brauchst ein Formular in dem 3 Eingaben erfolgen.
1. Tonertyp, 2. TonerAnzahl 3. Abteilung.

Ich tu mal so als würden deine Tabellen so aussehen:
Toner:
TonertypAnzahl

Tonerausgabe:
AbteilungTonertypAnzahl

Dann könnte der Code so aussehen (ungetestet):
Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Dim strSQL As String 

Set Dbs = CurrentDb       
strSQL = "SELECT * FROM Toner WHERE Tonertyp = '" & Me.Tonertyp & "'"  
Set rs = db.OpenRecordset(strSQL) 
If Not rs.EOF Then 
   rs.MoveFirst 
   ' Bestand um Anzahl veringern  
   strSQL = "UPDATE Toner Set Anzahl = " & _  
   (rs!Anzahl - Me.Anzahl )  & _
   & " WHERE Tonertyp = '" & Me.Tonertyp & "';"  
   DoCmd.RunSQL(strSQL)
end if

StrSQL = "SELECT * FROM Tonerausgabe WHERE Abteilung = '" _  
& Me.Abteilung & "' AND Tonertyp = '" Me.Tonertyp & "';"  
Set rs = db.OpenRecordset(strSQL) 
If Not rs.EOF Then 
   rs.MoveFirst 
   ' Abteilungszähler um Anzahl erhöhen  
   strSQL = "UPDATE Tonerausgabe Set Anzahl = " &  _  
   rs!Anzahl - Me.Anzahl ) & _
   " WHERE Abteilung = '" & Me.Abteilung & "' AND Tonertyp = '" Me.Tonertyp & "'"  
   DoCmd.RunSQL(strSQL)
Else ' neuen Zahler anlegen  
   strSQL = "Insert Into Tonerausgabe (Abteilung, Tonertyp, Anzahl) Values ('" _  
   & Me.Abteilung & "','" Me.Tonertyp & "', " & (rs!Anzahl - Me.Anzahl ) & ");"  
   DoCmd.RunSQL(strSQL)
end if

rs.Close 
Set rs = Nothing
Set db = Nothing

Gruß L.
Member: Eifeladmin
Eifeladmin Aug 24, 2008 at 20:03:54 (UTC)
Goto Top
Hi,

irgendwie hat er da noch ein Problem mit ungültigen Zeichen?
Hier mal meine Tabellen struktur:
Toner:
ID:Autowert | Bezeichnung: Text | Hersteller: Text | Anzahl: Zahl | Drucker: Text
Über das Feld Drucker möchte später eine Verknüpfung mit den Drucker herstellen um zu wissen welcher Drucker welchen Toner braucht.
Tonerausgabe:
ID_Toner: Zahl | ID_Bereich : Zahl | Ausgabedatum : Datum | Anzahl : Zahl
Die Tabellen sind mit einander verknüpft, die Namen der Abteilungen kommen aus einer anderen Tabelle die auch mit der Tabelle Tonerausgabe verknüpft ist.

Das Formular ist so aufgebaut das man den Toner und den Bereich über ein Dropdown Feld auswählt und die IDs werden dann in der Tabelle Tonerausgabe in den beiden Feldern gespeichert.

Danke für deine Hilfe.
Member: Logan000
Logan000 Aug 26, 2008 at 06:34:52 (UTC)
Goto Top
Moin Moin

irgendwie hat er da noch ein Problem mit ungültigen Zeichen?
Was soll irgendwer mit dieser Aussage anfangen.
Du hast den Code an deine Tabelle / dein Foprmular angepasst.
Welche Zeile wird beanstandet?
Lässt sich der Code kompilieren?

Noch ein Tipp:
Füge an die Tabelle "Tonerausgabe" ebenfalls ein ID: Autowert Feld an und erkläre dies zum Primerschlüssel.

Gruß L.
Member: Eifeladmin
Eifeladmin Aug 26, 2008 at 07:00:54 (UTC)
Goto Top
Hi,

das Problem kommt ab Zeile 11 bei dem Unterstrich und bei jedem weiteren.

Gruß
Nemo
Member: Logan000
Logan000 Aug 26, 2008 at 07:23:38 (UTC)
Goto Top
Moin
Sorry, diese "Zeilenbrüche" sind in VB zulässig in VBA offensichtlich nicht.
Wie geschrieben: ungetestet.

Lass sie weg. Etwa so:
...
strSQL = "SELECT * FROM Toner WHERE Tonertyp = '" &  Me.Tonertyp & "'"  
...

Gruß L.
Member: Eifeladmin
Eifeladmin Aug 27, 2008 at 15:26:35 (UTC)
Goto Top
Hi,

hab die Fehler beseitigt, jetzt kommt wieder ein Fehler bei der Zeile

Set rs = db.OpenRecordset(strSQL)

ich habe nur die Namen der Felder des Fomrulares an meines angepasst.

Hier nochmal das gesamte Skript:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

Set Dbs = CurrentDb
strSQL = "SELECT * FROM Toner WHERE ID_Toner = '" & Me.ID_Toner & "'"  
Set rs = db.OpenRecordset(strSQL)
If Not rs.EOF Then
   rs.MoveFirst
   ' Bestand um Anzahl veringern  
   strSQL = "UPDATE Toner Set Anzahl = '" & (rs!Anzahl - Me.Anzahl) & "' WHERE ID_Toner = '" & Me.ID_Toner & "';"  
   DoCmd.RunSQL (strSQL)
End If

strSQL = "SELECT * FROM Tonerausgabe WHERE Bereich = '" & Me.ID_Bereich & "' AND ID_Toner = '" & Me.ID_Toner & "';"  
Set rs = db.OpenRecordset(strSQL)
If Not rs.EOF Then
   rs.MoveFirst
   ' Abteilungszähler um Anzahl erhöhen  
   strSQL = "UPDATE Tonerausgabe Set Anzahl = '" & (rs!Anzahl - Me.Anzahl) & "' WHERE ID_Bereich = '" & Me.ID_Bereich & "' AND ID_Toner = '" & Me.ID_Toner & "';"  
   DoCmd.RunSQL (strSQL)
Else ' neuen Zahler anlegen  
   strSQL = "Insert Into Tonerausgabe (ID_Toner, ID_Bereich, Anzahl) Values ('" & Me.ID_Bereich & "','" & Me.ID_Toner & "','" & (rs!Anzahl - Me.Anzahl) & ");"  
   DoCmd.RunSQL (strSQL)
End If

rs.Close
Set rs = Nothing
Set db = Nothing

Danke für deine Hilfe

Gruß
Nemo
Member: Logan000
Logan000 Aug 28, 2008 at 06:39:02 (UTC)
Goto Top
Moin moin

Auf die schnelle sehe ich einen Fehler in Zeile 5.
Besser so:
Set db = CurrentDb

Das würde auch deinen Fehler erklären (obwohl ich habe gerade fürchterlichen Nebel in meiner Kristallkugel ).
face-wink

Sollte der Fehler immernoch auftreten kannst du versuchen die Abfragen direkt auszuführen, um festzustellen ob Sie korrekt sind.
Dazu setzt Du dir einen Haltepunkt hinter eine "strSQL=..." Zeile.
Wenn der Code dort stoppt lässt du Dir das SQL statement ausgeben, nachst eine Neue Abfrage und gibst das Statement in der SQL ansicht direkt ein. Und ausführen.

Noch ein Tipp:
Schreibe (immer) oben in deinem Modul
Option Explicit
falls das noch nicht der Fall ist.

Gruß L.
Member: Eifeladmin
Eifeladmin Sep 04, 2008 at 19:42:04 (UTC)
Goto Top
Hi,

DANKE für deine Hilfe nochmals.
Ich habe meine Tabellen ein bisschen umgestellt aber es funktioniert jetzt.

Gruß
Nemo