Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Access VBA Werte verrechnen

Frage Microsoft Microsoft Office

Mitglied: Eifeladmin

Eifeladmin (Level 1) - Jetzt verbinden

20.08.2008, aktualisiert 04.09.2008, 7260 Aufrufe, 14 Kommentare

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:
01.
Dim db As DAO.Database 
02.
Dim rs As DAO.Recordset 
03.
Dim strSQL As String 
04.
 
05.
Dim anzahl1 As Integer 
06.
Dim anzahl2 As Integer 
07.
Dim ergebnis As Integer 
08.
 
09.
Set Dbs = CurrentDb 
10.
strSQL = "SELECT * FROM Toner" 
11.
Set rs = db.OpenRecordset(strSQL) 
12.
 
13.
If Not rs.EOF Then rs.MoveFirst 
14.
 
15.
Do While Not rs.EOF 
16.
  anzahl1 = rs!Feldname 
17.
Loop 
18.
 
19.
rs.Close 
20.
Set rs = Nothing 
21.
Set db = Nothing 
22.
 
23.
Set Dbs = CurrentDb 
24.
strSQL = "SELECT * FROM Tonerausgabe" 
25.
Set rs = db.OpenRecordset(strSQL) 
26.
 
27.
If Not rs.EOF Then rs.MoveFirst 
28.
 
29.
Do While Not rs.EOF 
30.
  anzahl2 = rs!Feldname 
31.
Loop 
32.
 
33.
ergebnis = anzahl11 - anzahl2 
34.
DoCmd.RunSQL ("update toner set anzahl=ergebnis ;") 
35.
 
36.
rs.Close 
37.
Set rs = Nothing 
38.
Set db = Nothing
Aber ich wage zu bezweifeln das dies richtig ist.

Ich wäre für Hilfe sehr Dankebar.

Gruß
Nemo
Mitglied: Logan000
21.08.2008 um 08:46 Uhr
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 <code> Tag (siehe Formatierungshilfe).

Gruß L.
Bitte warten ..
Mitglied: Eifeladmin
21.08.2008 um 11:55 Uhr
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.
Bitte warten ..
Mitglied: Logan000
21.08.2008 um 12:17 Uhr
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.

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

Gruß L.
Bitte warten ..
Mitglied: Eifeladmin
21.08.2008 um 13:03 Uhr
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?
Bitte warten ..
Mitglied: Logan000
21.08.2008 um 13:38 Uhr
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.
Bitte warten ..
Mitglied: Eifeladmin
21.08.2008 um 19:51 Uhr
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
Bitte warten ..
Mitglied: Logan000
22.08.2008 um 11:22 Uhr
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):
01.
Dim db As DAO.Database  
02.
Dim rs As DAO.Recordset  
03.
Dim strSQL As String  
04.
 
05.
Set Dbs = CurrentDb        
06.
strSQL = "SELECT * FROM Toner WHERE Tonertyp = '" & Me.Tonertyp & "'" 
07.
Set rs = db.OpenRecordset(strSQL)  
08.
If Not rs.EOF Then  
09.
   rs.MoveFirst  
10.
   ' Bestand um Anzahl veringern 
11.
   strSQL = "UPDATE Toner Set Anzahl = " & _ 
12.
   (rs!Anzahl - Me.Anzahl )  & _ 
13.
   & " WHERE Tonertyp = '" & Me.Tonertyp & "';" 
14.
   DoCmd.RunSQL(strSQL) 
15.
end if 
16.
 
17.
StrSQL = "SELECT * FROM Tonerausgabe WHERE Abteilung = '" _ 
18.
& Me.Abteilung & "' AND Tonertyp = '" Me.Tonertyp & "';" 
19.
Set rs = db.OpenRecordset(strSQL)  
20.
If Not rs.EOF Then  
21.
   rs.MoveFirst  
22.
   ' Abteilungszähler um Anzahl erhöhen 
23.
   strSQL = "UPDATE Tonerausgabe Set Anzahl = " &  _ 
24.
   rs!Anzahl - Me.Anzahl ) & _ 
25.
   " WHERE Abteilung = '" & Me.Abteilung & "' AND Tonertyp = '" Me.Tonertyp & "'" 
26.
   DoCmd.RunSQL(strSQL) 
27.
Else ' neuen Zahler anlegen 
28.
   strSQL = "Insert Into Tonerausgabe (Abteilung, Tonertyp, Anzahl) Values ('" _ 
29.
   & Me.Abteilung & "','" Me.Tonertyp & "', " & (rs!Anzahl - Me.Anzahl ) & ");" 
30.
   DoCmd.RunSQL(strSQL) 
31.
end if 
32.
 
33.
rs.Close  
34.
Set rs = Nothing 
35.
Set db = Nothing
Gruß L.
Bitte warten ..
Mitglied: Eifeladmin
24.08.2008 um 22:03 Uhr
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.
Bitte warten ..
Mitglied: Logan000
26.08.2008 um 08:34 Uhr
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.
Bitte warten ..
Mitglied: Eifeladmin
26.08.2008 um 09:00 Uhr
Hi,

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

Gruß
Nemo
Bitte warten ..
Mitglied: Logan000
26.08.2008 um 09:23 Uhr
Moin
Sorry, diese "Zeilenbrüche" sind in VB zulässig in VBA offensichtlich nicht.
Wie geschrieben: ungetestet.

Lass sie weg. Etwa so:
01.
... 
02.
strSQL = "SELECT * FROM Toner WHERE Tonertyp = '" &  Me.Tonertyp & "'" 
03.
...
Gruß L.
Bitte warten ..
Mitglied: Eifeladmin
27.08.2008 um 17:26 Uhr
Hi,

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

01.
Set rs = db.OpenRecordset(strSQL)
ich habe nur die Namen der Felder des Fomrulares an meines angepasst.

Hier nochmal das gesamte Skript:
01.
Dim db As DAO.Database 
02.
Dim rs As DAO.Recordset 
03.
Dim strSQL As String 
04.
 
05.
Set Dbs = CurrentDb 
06.
strSQL = "SELECT * FROM Toner WHERE ID_Toner = '" & Me.ID_Toner & "'" 
07.
Set rs = db.OpenRecordset(strSQL) 
08.
If Not rs.EOF Then 
09.
   rs.MoveFirst 
10.
   ' Bestand um Anzahl veringern 
11.
   strSQL = "UPDATE Toner Set Anzahl = '" & (rs!Anzahl - Me.Anzahl) & "' WHERE ID_Toner = '" & Me.ID_Toner & "';" 
12.
   DoCmd.RunSQL (strSQL) 
13.
End If 
14.
 
15.
strSQL = "SELECT * FROM Tonerausgabe WHERE Bereich = '" & Me.ID_Bereich & "' AND ID_Toner = '" & Me.ID_Toner & "';" 
16.
Set rs = db.OpenRecordset(strSQL) 
17.
If Not rs.EOF Then 
18.
   rs.MoveFirst 
19.
   ' Abteilungszähler um Anzahl erhöhen 
20.
   strSQL = "UPDATE Tonerausgabe Set Anzahl = '" & (rs!Anzahl - Me.Anzahl) & "' WHERE ID_Bereich = '" & Me.ID_Bereich & "' AND ID_Toner = '" & Me.ID_Toner & "';" 
21.
   DoCmd.RunSQL (strSQL) 
22.
Else ' neuen Zahler anlegen 
23.
   strSQL = "Insert Into Tonerausgabe (ID_Toner, ID_Bereich, Anzahl) Values ('" & Me.ID_Bereich & "','" & Me.ID_Toner & "','" & (rs!Anzahl - Me.Anzahl) & ");" 
24.
   DoCmd.RunSQL (strSQL) 
25.
End If 
26.
 
27.
rs.Close 
28.
Set rs = Nothing 
29.
Set db = Nothing
Danke für deine Hilfe

Gruß
Nemo
Bitte warten ..
Mitglied: Logan000
28.08.2008 um 08:39 Uhr
Moin moin

Auf die schnelle sehe ich einen Fehler in Zeile 5.
Besser so:
01.
Set db = CurrentDb
Das würde auch deinen Fehler erklären (obwohl ich habe gerade fürchterlichen Nebel in meiner Kristallkugel ).


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
01.
Option Explicit
falls das noch nicht der Fall ist.

Gruß L.
Bitte warten ..
Mitglied: Eifeladmin
04.09.2008 um 21:42 Uhr
Hi,

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

Gruß
Nemo
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
VB for Applications
gelöst Excel VBA Werte von 2 verschiedenen Sheets vergleichen und aktualisieren (4)

Frage von drimrim zum Thema VB for Applications ...

Microsoft Office
Kreuztabelle Access + VBA Code (7)

Frage von Dr.Cornwallis zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...