Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Aktualisierungsabfrage via VBA Code

Begonnen von datekk, November 14, 2014, 17:15:34

⏪ vorheriges - nächstes ⏩

datekk

Hi. Ich möchte über einen VBA Code in einer Tabelle Informationen aus einer anderen Tabelle ergänzen... also wie eine Aktualisierungsabfrage..

Dabei soll bei einem bestimmten Datensatz in Tabelle A Name und die Anrede aus Tabelle B eingefügt werden. Die ID des Eintrags aus Tabelle B ist in einer Variablen vorgegeben. Ich kenne leider bisher nur eine Art Anfügeabfrage nach dem Beispiel:

CurrendDB.Execute "Insert into TabelleA (AName,AAnrede) Select BName,BAnrede from TabelleB Where IDB=" & p_Variable"

Gibt es sowas auch für Aktualisierungsabfragen?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

DF6GL

Hallo,
abgesehen davon, dass der rechte (letzte) Gänsefuß überflüssig (falsch) ist,  ist dieses "Prinzip" genauso gut für Aktualisierungs-Abfragen  (Insert into ....) anzuwenden.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

datekk


Okay... Aber wie wähle ich in Tabelle A dann den Datensatz aus, welcher aktualisiert werden soll? So in etwa:

CurrendDB.Execute "Insert into TabelleA (AName,AAnrede) Where IDA = Formular.IDFeld Select BName,BAnrede from TabelleB Where IDB=" & p_Variable

??
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

database

Hallo,
versuch mal:

CurrentDB.Execute "UPDATE TabelleA SET AName='" & DLookup("BName","TabelleB","IDB=" & p_variable & "'), AAnrede='" & DLookup("BAnrede","TabelleB","IDB=" & p_variable & "') WHERE IDA=" & Me.IDFeld , dbFailOnError

oder

Dim strBName as String, strBAnrede as String

strBName = DLookup("BName","TabelleB","IDB=" & p_variable)
strBAnrede = DLookup("BAnrede","TabelleB","IDB=" & p_variable)

CurrentDB.Execute "UPDATE TabelleA SET AName='" & strBName & "', AAnrede='" & strBAnrede & "' WHERE IDA=" & Me.IDFeld , dbFailOnError


datekk

Hallo Peter, besten Dank. Habe mich für erste Variante entschieden. Angepasst auf meine tatsächlichen Tabellen müsste der Code wie folgt aussehen:

CurrentDB.Execute "UPDATE Verkaufschancen SET Kunden_ID='" & DLookup("ID_Kunde","Kundenliste","ID_Kunde=" & p_ClientID & "'), AP_Anrede='" & DLookup("Anrede","Kundenliste","ID_Kunde=" & p_ClientID & "') WHERE IDVerkaufschance=" & Me.ID_Verkaufschancen, dbFailonError



Leider erhalte ich den Fehler:

"Fehler beim Kompilieren: Erwartet: Listentrennzeichen oder )"

Hier fehlt sicher irgend ein kleines " oder ein '... oder?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

DF6GL

Hallo,

nimm doch die erste Variante, die wäre übersichtlicher..

Ansonsten:

CurrentDB.Execute "UPDATE Verkaufschancen SET Kunden_ID=" & DLookup("ID_Kunde","Kundenliste","ID_Kunde=" & p_ClientID ) & ", AP_Anrede='" & DLookup("Anrede","Kundenliste","ID_Kunde=" & p_ClientID ) & "'  WHERE IDVerkaufschance=" & Me.ID_Verkaufschancen, dbFailonError


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

datekk

DF6GL: Welche Erste Variante meinst Du denn? Auf jeden Fall hat es dann mit Deiner Codezeile geklappt.

Besten Dank .)
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

datekk

Falls Du meine "erste Variante" meinst, so habe ich den Code nun so umgesetzt:

CurrendDB.Execute "Insert into Verkaufschancen (Kunden_ID,AP_Anrede,AP_Vorname) Select ID_Kunde,Anrede,Vorname from Kundenliste Where ID_Kunde=" & p_ClientID

erhalte hier aber einen "Laufzeitfehler 424 Objekt erforderlich"
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

DF6GL

Hallo,

ich meinte eigentlich die "oder"-Variante von Database....

desweiteren:

CurrentDB.Execute ....
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

datekk

Ok.... verstanden..

Dim strBName as String, strBAnrede as String

strBName = DLookup("BName","TabelleB","IDB=" & p_variable)
strBAnrede = DLookup("BAnrede","TabelleB","IDB=" & p_variable)

Die o.g. Variante mit den Variablen funktioniert leider nicht, wenn ein Tabellenfeld leer ist. Hier bekomme ich den Laufzeitfehler 94 - unzulässige Verwendung von NULL. Wie lässt sich dies vermeiden? Es ist normal, dass mal nicht alle Felder ausgefüllt sind.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

datekk

.. Wenn ich die Variablen-Deklinarition weg lasse... Also.. Dim as String... Funktioniert es..

Hat das irgendwelche negativen Auswirkungen?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MzKlMu

Hallo,
Variablen sollte man immer deklarieren. Erstens ist das Datentyp sicher und zweitens führen undeklarierte Variablen wenn unbekannt zu Laufzeitfehlern.
Man sollte auch unbedingt in den Optionen Variablendeklaration erforderlich setzen, das heißt, OPTOION EXPLICIT in jedem Modulkopf.

In deinem Fall ist es so, wenn DLookup nichts findet wird NULL zurückgegeben. Aber ein String kann nicht NULL sein. Du muss entweder als Variant deklarieren (DIM strBName as Variant)
oder als String lassen, aber dann NZ verwenden.

strBName = Nz(DLookup("BName","TabelleB","IDB=" & p_variable),"")

Also, in jedem Modul unbedingt OPTION EXPLICIT setzen und alle Variablen grundsätzlich deklarieren.

Gruß Klaus

datekk

Ok danke. Dann noch eine Frage dazu.

Die Insert Into Funktion übergibt ja Daten von Tabelle A zu Tabelle B.. Nun soll aber bei einem Feld in Tabelle B nur das aktuelle Datum eingefügt werden. Eine Datenquelle gibt es da nicht. Wie ist dies in diese Funktion noch unterzubringen?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

MaggieMay

Hi,

dazu schreibst du an der Stelle wo das Datum eingefügt werden soll einfach Date() hin.
Freundliche Grüße
MaggieMay

datekk

Ok. und wenn ein Bestimmter Text in die Zelle soll.. z.B. das Wort "Angebot"?
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps