Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: datekk am November 14, 2014, 17:15:34

Titel: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 14, 2014, 17:15:34
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?
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: DF6GL am November 14, 2014, 17:20:42
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.
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 14, 2014, 17:29:57

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

??
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: database am November 14, 2014, 18:24:40
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

Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 18, 2014, 14:12:38
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?
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: DF6GL am November 18, 2014, 14:49:03
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


Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 19, 2014, 11:13:07
DF6GL: Welche Erste Variante meinst Du denn? Auf jeden Fall hat es dann mit Deiner Codezeile geklappt.

Besten Dank .)
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 19, 2014, 17:23:42
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"
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: DF6GL am November 19, 2014, 17:45:45
Hallo,

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

desweiteren:

CurrentDB.Execute ....
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 19, 2014, 18:03:54
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.
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 19, 2014, 18:20:12
.. Wenn ich die Variablen-Deklinarition weg lasse... Also.. Dim as String... Funktioniert es..

Hat das irgendwelche negativen Auswirkungen?
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: MzKlMu am November 19, 2014, 19:59:41
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.

Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 20, 2014, 11:37:08
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?
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: MaggieMay am November 20, 2014, 11:46:46
Hi,

dazu schreibst du an der Stelle wo das Datum eingefügt werden soll einfach Date() hin.
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 20, 2014, 11:52:22
Ok. und wenn ein Bestimmter Text in die Zelle soll.. z.B. das Wort "Angebot"?
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: MaggieMay am November 20, 2014, 12:19:29
Dann schreibst du das Wort "Angebot" in die Werteliste. Innerhalb eines Strings kannst du auch Hochkommata anstelle der Gänsefüßchen verwenden.
Titel: Re: Aktualisierungsabfrage via VBA Code
Beitrag von: datekk am November 20, 2014, 13:04:27
Ok super... Mit Hochkomma ging es .. mit den normalen Anführungszeichen nicht... Perfekt..