Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: MB102 am April 29, 2016, 12:13:38

Titel: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MB102 am April 29, 2016, 12:13:38
Hallo liebe VBA Profis,
ich brauch bitte mal Hilfe. Ich habe alles dazu gelesen, was es gibt im Netz, aber trotzdem komme ich nicht weiter:

Ich habe 3 Tabellen: Raum, Nutzung und Abteilung
Ein Raum kann n Nutzungen haben, daher 1:n Verknüpfung von Raum.RaumID nach Nutzung.RaumID
Aus der dritten, nicht verknüpften Tabelle möchte ich einen Datensatz per Combifeld aussuchen und mit dem Ereignis "after update" in die Tabelle Nutzung schreiben.
Ich habe ein Formular "Raum" erstellt mit einem Unterformular "Nutzung". Das klappt, durch die Verknüpfung wird im Datensatz des Unterformulars bereits die Raumnummer angezeigt und wenn ich ein Zeichen eingebe dann auch die neue NutzungID vergeben. Dann habe ich ein Combofeld angelegt welches auf die dritte Tabelle, Abteilungen zugreift. Alles prima.
Ich möchte jetzt den ausgesuchten Datensatz in die Tabelle Nutzung schreiben.
Ich muss also per VBA mit einem Insert Into das Kombinationsfels auslesen und in die Tabelle Nutzung schreiben unter der Beachtung der Verknüpfung. Also wohl einen Inner Join. Und dabei hakt es.
Einen Select in einer normalen Anfügeabfrage habe ich hinbekommen, Als Hilfsgröße erst einmal "Abteilungen, ID=1.


INSERT INTO Nutzung ( AbteilungID2, AbteilungBezkurz, AbteilungBezlang, AbteilungKST, RaumID )
SELECT DISTINCT Abteilungen.AbteilungID, Abteilungen.AbteilungBezkurz, Abteilungen.AbteilungBezlang, Abteilungen.AbteilungKST, Nutzung.RaumID
FROM Abteilungen, Raum INNER JOIN Nutzung ON Raum.RaumID = Nutzung.RaumID
WHERE (((Abteilungen.AbteilungID)=1));

Aber in VBA bekomme ich es nicht hin.

Ich bin bei:

Dim strSQL As String
strSQL = "INSERT INTO Nutzung ([AbteilungBezkurz], [AbteilungID2]" & _
"Select &'"[forms]![Raum]![Kombinationsfeld48].[Column](1)&"'],[Raum].[RaumID])" & _
"FROM Abteilungen, Raum & _
INNER JOIN Nutzung ON Raum.RaumID = Nutzung.RaumID;"
DoCmd.RunSQL

(Der Einfachheit halber auf 2 Felder verkürzt)

Please help
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: Wurliwurm am April 29, 2016, 12:47:40
Gib den strSQL mit Debug.Print auf der Konsole aus und vergleiche ihn mit der Anfügeabfrage
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MaggieMay am April 29, 2016, 13:19:10
Hi,

die Einbeziehung des Formularfeldes und weitere Kleinigkeiten sind syntaktisch falsch.
Versuche es mal hiermit:
strSQL = "INSERT INTO Nutzung (AbteilungBezkurz, AbteilungID2) " & _
"Select '" & Forms!Raum!Kombinationsfeld48.Column(1) & "', [Raum].[RaumID]) " & _
"FROM Abteilungen, Raum " & _
"INNER JOIN Nutzung ON Raum.RaumID = Nutzung.RaumID;"
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MB102 am April 29, 2016, 13:34:49
Vielen Dank für die schnelle Antwort.
Den syntaktischen Fehler habe ich ausgemerzt.
Außerdem habe ich nochmals, auf nur ein Feld verkürzt um es ans Laufen zu kriegen.
Die Fehlermeldung lautet "Argument ist nicht optional" und im Code Fenster markiert er dann das "RunSQL".
Im Direktfenster geht es auch nicht.
Kann es an der From Zeile liegen? Ich müsste ja von dem Kombifeld im Formular abfragen und nicht von den Tabellen, oder?
"INSERT INTO Nutzung (AbteilungBezkurz) " & _
"Select '" & Forms!Form_Raum!Kombinationsfeld48.Column(1) & "',) " & _
"FROM Abteilungen, Raum " & _
"INNER JOIN Nutzung ON Raum.RaumID = Nutzung.RaumID;"
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: Wurliwurm am April 29, 2016, 13:39:08
Wenn der strSQL genau so ist wie die Anfügeabfrage ist, ist er nicht das Problem. So etwas lässt sich immer dadurch prüfen, indem man den strSQL in der Konsole ausgibt und ihn in eine Abfrage einfügt und schaut, ob ein Fehler kommt.

Versuch mal statt RUNSQL
CurrentDB.execute(strSQL)
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MaggieMay am April 29, 2016, 15:21:36
Du musst natürlich auch angeben was RUNSQL ausführen soll.
Wozu sonst setzt du denn den SQL-String zusammen?? ;-)

CurrentDB.Execute strSQL, dbFailOnError ist sicher die bessere Methode, da du damit auch Fehlermeldungen erhältst.

Und wenn du ein Feld aus der Liste nimmst, musst du auch das Komma entfernen.

PS:
Gewöhne dir bitte an, Code in Code-Tags zu verpacken.
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: Beaker s.a. am April 29, 2016, 15:26:12
Moin,
Ist das nicht alles überflüssig?
Wenn ich den OP richtig interpretiere, existiert in der
tblNutzung ein FK (AbteilungID2 ?) zur tblAbteilungen.
Wenn dem so ist, kann man
1. die beiden Tabellen auch verknüpfen
2. sind die zusätzlichen Felder (AbteilungBezkurz,
AbteilungBezlang, AbteilungKST) in der tblNutzung
unnötig, wenn nicht sogar falsch.
3. das Kombi im UFo an das FK-Feld binden, was
den INSERT überflüssig macht.
Falls ich Mal wieder völlig daneben liege, - forget about it.
gruss ekkehard
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MB102 am April 29, 2016, 15:29:26
Hallo und nochmals vielen Dank,
Ich habe jetzt den Select der Anfügeabfrage, Dank Eurer Tipps in VBA zum Laufen bekommen.
ich habe mal ein PDF der Beziehungen angehängt.
(Ich sage Euch, Access macht einen fertig) Es war noch ein fehlendes Leerzeichen.

Private Sub Befehl59_Click()
Dim strSQL As String
strSQL = "INSERT INTO Nutzung ( AbteilungID2, AbteilungBezkurz, AbteilungBezlang, AbteilungKST, RaumID )" & _
"SELECT DISTINCT Abteilungen.AbteilungID, Abteilungen.AbteilungBezkurz, Abteilungen.AbteilungBezlang, Abteilungen.AbteilungKST, Nutzung.RaumID " & _
"FROM Abteilungen, Raum INNER JOIN Nutzung ON Raum.RaumID = Nutzung.RaumID WHERE (((Abteilungen.AbteilungID)=1));"
CurrentDb.Execute (strSQL)
Me.Requery
End Sub

Soweit ist es aber nur die Hilfskrücke. Ich frage damit den Datensatz aus der Quell-Tabelle "Abteilung" ab mit der "ID=1"
Ich möchte aber gerne den gewählten Datensatz aus dem Kombifeld abfragen. Das Kombifeld hat Ebenfalls die Tabelle "Abteilungen" als Datenquelle und ist im Formular "Raum"
Wenn da noch jemand einen Tipp hätte, wäre ich glücklich.
Ich muss jetzt ins Wochenende, kann mich vermutlich erst Montag wieder rühren.
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: Beaker s.a. am April 29, 2016, 15:50:39
Hallo,
Unter der Voraussetzung, dass die AbteilungID die gebundene Spalte des
Kombis ist, und der Code im UFo abläuft, ersetze die "1" durch
Me!NameDesKombis
Der komplette "Objektpfad" zum Kombi würde so aussehen
Forms("NameDesHFo").Controls("NameDesUFoControls").Form("NameDesHerhunftobjekts").Controls("NameDesKombis")
oder in kurz
Forms!NameDesHFo!NameDesUFoControls.Form!NameDesHerhunftobjekts!NameDesKombis[/[code]
hth
gruss ekkehard
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MB102 am Mai 03, 2016, 09:34:24
Guten Morgen zusammen,
da bin ich wieder, dauert bei mir immer ein bisschen. Ich möchte ja die Ratschläge von Euch auch recherchieren und testen.
Vielen Dank Beaker. Ich habe gedacht, dass ist es jetzt. Habs aber nicht hinbekommen. Ich habe alle Kombinationen von runder und eckige klammer ausprobiert; nix. Code Generator sagt immer unzulässige Einklammerung oder unbekanntes Objekt. Immerhin habe ich jetzt schon mal Die Combobox ins UFo genommen. Den Tipp von beaker, die Combobox mit dem UFo zu verknüpfen, habe ich auch nicht geschafft. Im Eigenschaftsfenster wird die "Verknüpfen von, nach" Eigenschaft nicht angezeigt. Außerdem funktioniert mein Select aus der Abfrage wohl auch nicht. Wenn ich im HFo einen DS weitergehe, fügt er den Datensatz wieder bei Raum 1 an. Ich bin wohl wieder ganz am Anfang.

Beaker hatte angemerkt, ob das ganze Konstrukt vielleicht Unsinn ist. Kann sein. Wahrscheinlich bin ich auf dem Holzweg. Ich erzähle mal, worum es geht:

Meine DB soll ein Raumbuch werden (Screenshot hängt an). Die Ebenen "Gebäude, Gebäudeteil, Ebene und Raum" sind jeweils über die ID 1:n verknüpft. Der Einfachheit halber habe ich das in diesem Beitrag zunächst weggelassen.
Nun hat der Raum diverse Attribute und ich möchte am Ende die Flächen auf die Kostenstellen der Abteilungen umlegen. Ein Raum kann auch von mehreren Kollegen unterschiedlicher Abteilungen genutzt werden.

Daher war mein Plan, ein UFo basierend auf einer Tabelle "Nutzung" mit 1:n Verknüpfung. (Ein Raum kann n Nutzungen haben). Die Abteilungen wollte ich in einer extra Tabelle hinterlegen, damit ich dann, über die besagte Combobox die Abteilung auswählen kann und diese dann als neuer Nutzungsdatensatz an die Tabelle Nutzung angefügt wird. Die Nutzung hat dann noch eine leere Spalte "Prozent" die ich dann händisch befülle. So war die Idee..
PS: MaggieMay hatte angemerkt, ich möge beim senden von Code diesen in Tags setzen. Mache ich gerne, aber was sind Tags? <> so vielleicht, und dann in jeder Zeile?

Thanks for Help



Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: Beaker s.a. am Mai 03, 2016, 13:35:19
Hallo,
Au man. Ich fang mal hinten an.
ZitatDaher war mein Plan, ein UFo basierend auf einer Tabelle "Nutzung" mit 1:n Verknüpfung. (Ein Raum kann n Nutzungen haben).
Schon mal richtig.
ZitatDie Abteilungen wollte ich in einer extra Tabelle hinterlegen, damit ich dann, über die besagte Combobox die Abteilung auswählen kann und diese dann als neuer Nutzungsdatensatz an die Tabelle Nutzung angefügt wird.
Auch nicht verkehrt.
Aber die Felder, die mit der Abteilung zu tun haben gehören da raus,
die sind doch schon in der entsprechenden Tabelle.
Den FK "AbteilungID2" musst du natürlich drin lassen!
Über den setzt du die beiden Tabellen in eine 1:n Beziehung; - diese  fehlt bei dir.
Wenn Du nun noch das UFo an die Tabelle "Nutzung" bindest,
es mit dem HFo über die RaumID verknüpfst braucht's den
INSERT nicht. Dann wird automatisch bei einer neuen Nutzung
der richtige Raum angesprochen.
Als Datenherkunft (RowSource) des Kombis nimmst du die Tabelle
"Abteilungen" her.
Spalten: ID, Bezeichnung, ... was du willst
Spaltenbreiten: 0cm; ... weitere auch nach Geschmack
gebundene Spalte: 1

(@regulars: Was vergessen?)

hth
gruss ekkehard

ZitatPS: MaggieMay hatte angemerkt, ich möge beim senden von Code diesen in Tags setzen. Mache ich gerne, aber was sind Tags?
Die erstellst Du über die Icons mit dem #-Zeichen (Code) und der
Sprechblase (Zitat); - oben unter dem Kombi für die Schriftart.
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MaggieMay am Mai 03, 2016, 14:08:19
Hi,

nur zur Ergänzung:
Zitat von: Beaker s.a. am Mai 03, 2016, 13:35:19Die erstellst Du über die Icons mit dem #-Zeichen (Code) und der
Sprechblase (Zitat); - oben unter dem Kombi für die Schriftart.
dazu gehst du über den "Antwort"-Button, nicht in die "Schnellantwort".
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MB102 am Mai 03, 2016, 19:14:42
Vielen Dank für Eure Geduld. Ich werde wieder ne Zeit brauchen, alles nachzuarbeiten.

Melde mich dann
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MB102 am Mai 10, 2016, 09:17:50
Guten Morgen zusammen,
so, es hat geklappt. Habe Beakers Rat befolgt, alle überflüssigen Felder entfernt, Das Kombi ins UFo und einfach den Steuerelementinhalt auf die ID gesetzt. Ist erst einmal ein guter Workaround. Thema gelöst.
Vielen Dank nochmals.
Habe mich im August für eine Woche Bildungsurlaub "VBA Programmierung" bei der VHS Köln angemeldet. Tut Not!
Viele Grüße
Titel: Re: Datensatz mit VBA aus Kombinationsfeld in Tabelle übernehmen
Beitrag von: MaggieMay am Mai 11, 2016, 00:53:09
ZitatHabe mich im August für eine Woche Bildungsurlaub "VBA Programmierung" bei der VHS Köln angemeldet.
Dazu wünsche ich dir viel Erfolg!