Hallo,
ich habe ein Ufo umgebaut. Dazu habe ich in der zugrunde liegenden Tabelle 2 FK hinzugefügt, VariantenArtID_F und VarianteID_F. Danach habe ich den Query angepasst für das umgebaute Ufo erweitert. Query vorher:
SELECT tblIdentQuartette.SpielID_F,
tblIdentQuartette.IdentQuartettID_F,
tblSpiele_1.SpielNr,
tblVerlag_1.Verlag,
tblSpiele_1.Ausgabejahr
FROM tblVerlag
INNER JOIN (tblSpiele
INNER JOIN (tblVerlag AS tblVerlag_1
INNER JOIN (tblIdentQuartette
INNER JOIN tblSpiele AS tblSpiele_1 ON tblIdentQuartette.IdentQuartettID_F = tblSpiele_1.SpielID) ON tblVerlag_1.VerlagID = tblSpiele_1.VerlagID_F) ON tblSpiele.SpielID = tblIdentQuartette.SpielID_F) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F;
Nach Integration der beiden FK:
SELECT tblIdentQuartette.SpielID_F,
tblIdentQuartette.IdentQuartettID_F,
tblSpiele_1.SpielNr,
tblVerlag_1.Verlag,
tblSpiele_1.Ausgabejahr,
tblIdentQuartette.VarianteID_F,
tblIdentQuartette.VariantenArtID_F
FROM tblVerlag
INNER JOIN (tblVariante
INNER JOIN (tblVariantenArt
INNER JOIN (tblSpiele
INNER JOIN (tblVerlag AS tblVerlag_1
INNER JOIN (tblIdentQuartette
INNER JOIN tblSpiele AS tblSpiele_1 ON tblIdentQuartette.IdentQuartettID_F = tblSpiele_1.SpielID) ON tblVerlag_1.VerlagID = tblSpiele_1.VerlagID_F) ON tblSpiele.SpielID = tblIdentQuartette.SpielID_F) ON tblVariantenArt.VariantenArtID = tblIdentQuartette.VariantenArtID_F) ON tblVariante.VarianteID = tblIdentQuartette.VarianteID_F) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F;
Die Funktionalität ist gewährleistet, es geht alles, bis auf ein klein wenig VBA, was bei der integration der beiden Kombifelder mitkam.
Private Sub cboVariante_AfterUpdate()
If Me.VarianteID_F = 1 Then
Me.VariantenArtID_F = 1
Else
If Me.VarianteID_F = 2 Then
Me.VariantenArtID_F = 2
End If
End If
End Sub
Genau der Teil geht nicht. Er meckert Me.VarianteID_F Das komische dabei ist, dass ich im VBA das ganze einfach nicht finden kann, sprich, als wenn es nicht aktualisiert und auffindbar ist. All die anderen Felder des query wie Verlag, SpielNr etc. finde ich im VBA sofort. Wo liegt mein Fehler?
PS: Wie formatiert man SQL Code so, damit er hier "anschaulich" gepostet wird :(? Das sieht ja schon böse aus, das muss ich zugeben.
ZitatWie formatiert man SQL Code so, damit er hier "anschaulich" gepostet wird :(? Das sieht ja schon böse aus, das muss ich zugeben.
Gurgel mal nach "SQLFormatter".
ZitatAll die anderen Felder des query wie Verlag, SpielNr etc. finde ich im VBA sofort.
Dein VBA-Code für cboVariante_AfterUpdate hat mit SQL, Query usw. rein gar nichts zu tun. Du verarbeitest schlicht Formularsteuerelemente,
- die als Steuerelementinhalt ein Feld einer Abfrage haben,
- die bei ungeschickter Benennung die gleiche Bezeichnung wie Abfragefelder haben.
Nur im zweiten Fall würden dann auch Bezeichnungen von Abfragefeldern "im VBA zu finden sein". Um sich diese Felder sichtbar zu machen, müsste man sich explizit über ein Recordset die Feldnamen ausgeben lassen (= bewusste Aktion des Entwicklers).
Hallo Eberhard,
dachte eben, dass es was damit zu tun, weil ich eben nach Eingabe vom if me. all die anderen "Feldnamen" die sich in der Query befinden auswählen könnte, außer eben die beiden, die ich wirklich benötige :(. Aus der Warte heraus ist es mir schleierhaft, warum ich die nicht verwenden kann. Muss ich noch irgend etwas aktualisieren oder verknüpfen?
Felder der RecordSource (Datensatzquelle) eines Formulars lassen sich mit Me!Feldname, mit Me("Feldname") oder in der Langform mit Me.Controls("Feldname") adressieren und gehören der versteckten Klasse AccessField mit der Standardeigenschaft Value an, weshalb Value beim Zugriff nicht aufgeführt werden muss - aber darf. Sie lassen sich aber auch in der versteckten Eigenschaft Dynaset unter der Fields-Auflistung, und wie Eberhard schon berichtete unter der Eigenschaft Recordset wiederum in der Fields-Auflistung und auch unter der Eigenschaft RecordsetClone gleichsam in der Fields-Auflistung auffinden.
Das besondere an der Sache ist, dass AccessFields im Gegensatz zu allen Steuerelementen nicht zur Laufzeit im Lokal-Fenster unter Controls sichtbar sind und auch nicht beim Iterieren über die Controls-Auflistung erscheinen. Zum Iterieren muss man sich deshalb auf die Fields-Auflistung einer der drei zuvor genannten Eigenschaften des Formulars beziehen.
Zitatall die anderen "Feldnamen" die sich in der Query befinden auswählen könnte
Wie heißen denn die Formulartextfelder und unterscheiden sich diese Bezeichnungen von jenen der Abfrage?
In einem Formular spricht man, auch per VBA, deren Elemente an. Das sind primär die Steuerelemente, nicht deren Eigenschaften (wie ControlSource).
Hallo Eberhard,
Zitat von: ebs17 am Juli 15, 2017, 07:40:49
ZitatWie heißen denn die Formulartextfelder und unterscheiden sich diese Bezeichnungen von jenen der Abfrage? In einem Formular spricht man, auch per VBA, deren Elemente an. Das sind primär die Steuerelemente, nicht deren Eigenschaften (wie ControlSource).
Also das Ufo mit den deren Steuerelement basiert auf der Query qryIdentQuartette und sieht wie im Bild1 aus. Dazu noch einmal der aktuelle SQL-Code.
SELECT tblIdentQuartette.SpielID_F,
tblIdentQuartette.IdentQuartettID_F,
tblSpiele_1.SpielNr,
tblVerlag_1.Verlag,
tblSpiele_1.Ausgabejahr,
tblIdentQuartette.VarianteID_F,
tblIdentQuartette.VariantenArtID_F
FROM tblVerlag
INNER JOIN (tblVariante
INNER JOIN (tblVariantenArt
INNER JOIN (tblSpiele
INNER JOIN (tblVerlag AS tblVerlag_1
INNER JOIN (tblIdentQuartette
INNER JOIN tblSpiele AS tblSpiele_1 ON tblIdentQuartette.IdentQuartettID_F = tblSpiele_1.SpielID) ON tblVerlag_1.VerlagID = tblSpiele_1.VerlagID_F) ON tblSpiele.SpielID = tblIdentQuartette.SpielID_F) ON tblVariantenArt.VariantenArtID = tblIdentQuartette.VariantenArtID_F) ON tblVariante.VarianteID = tblIdentQuartette.VarianteID_F) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F;
Ich muss noch erwähnen, dass ich im Ufo auf den beiden Problem Feldern unter der Datensatz Herkunft noch einen Select auf dem Feld cboVariante habe:
SELECT tblVariante.VarianteID, tblVariante.Variante
FROM tblVariante;
Select auf dem Feld cboVariantenArt:
SELECT tblVariantenArt.VariantenArtID, tblVariantenArt.VariantenArt FROM tblVariantenArt;
Ich will ja nur wieder die Option haben, dass wenn man im Kombifeld cboVariante "-" (ID1) auswählt in cboVariantenArt ein "-" (ID1) automatisch ausgewählt wird. Ebenso das ganze noch mal mit ID2.
Private Sub cboVariante_AfterUpdate()
If Me.VarianteID_F = 1 Then
Me.VariantenArtID_F = 1
Else
If Me.VarianteID_F = 2 Then
Me.VariantenArtID_F = 2
End If
End If
End Sub
Dass ich hier wieder in so ein Szenario rein laufe ist mir fast schon peinlich, da es sicher wieder an etwas liegt, wo andere sich wahrscheinlich nur wieder die Hand vor die Stirn schlagen.
Andreas,
die Frage von Ebehard war nach dem Namen der beiden Steuerelemente - siehe gleichnamige Eigenschaft im Eigenschaftsfenster (4. Register, 1. Zeile).
Hi,
sorry, hatte ich mal wieder vergessen das wesentliche zu schreiben :(.
Steuerelementinhalt (2. Register (Daten), 1.Zeile) ist bei cboVariante ==> VarianteID_F und bei cboVariantenArt ==> VariantenArtID_F
Private Sub cboVariante_AfterUpdate()
Select Case Me.cboVariante
Case 1, 2: Me.cboVariantenArt = Me.cboVariante
End Select
End Sub
... ebenso sollte es auch so funktionieren.
Private Sub cboVariante_AfterUpdate()
Select Case Me!VarianteID_F
Case 1, 2: Me!VariantenArtID_F = Me!VarianteID_F
End Select
End Sub
Hallo,
ja, beide Varianten gehen, super. Aber wenn ich ehrlich bin, dann verstehe ich es nicht wirklich, dass es über diesen select Case geht und es mit If und then etc. nicht ausführbar war. VBA ist echt ein großes böhmisches Dorf für mich :-[. Aber Vielen Dank nochmal für eure Unterstützung.
Gruß Andreas
Das geht auch mit If - nur fällt der Code dann länger aus.Private Sub cboVariante_AfterUpdate()
If Me.cboVariante = 1 Then
Me.cboVariantenArt = 1
ElseIf Me.cboVariante = 2 then
Me.cboVariantenArt = 2
End If
End Sub
'oder
Private Sub cboVariante_AfterUpdate()
If Me.cboVariante = 1 Or Me.cboVariante = 2 Then
Me.cboVariantenArt = Me.cboVariante
End If
End Sub
Hi,
hmmm, als ich das mit if versucht hatte, da habe ich schon gesehen, dass ich cboVariante und cboVariantenArt auswählen konnte. Aber ich habe es erst gar nicht versucht, weil ich mich eben auch von Aussagen haben leiten lassen, cbofeld wählt man nur Daten aus, aber man muss das darunter liegende Tabellenfeld mit VBA ansprechen, wenn ich Daten schreiben will :(. Okay, sei es drum. Danke für die Klarstellung.
Hallo Lachtaube,
ZitatFelder der RecordSource (Datensatzquelle) eines Formulars lassen sich mit Me!Feldname, mit Me("Feldname") oder in der Langform mit Me.Controls("Feldname") adressieren und gehören der versteckten Klasse AccessField mit der Standardeigenschaft Value an
Aber
nur wenn das Formularfeld einen anderen Namen hat. Dann findest
du auch beide in der Controlsauflistung, mit dem Unterschied, dass das
RecordSource-Feld
nur die Eigenschaft .Value hat, und das Form-Feld alle.
Bei gleichem Namen verweist Me.Feldname auf das Formfeld mit allen
Eigenschaften.
gruss ekkehard
Richtig Ekkehard. Ein Steuerelement überlagert ein gleichnamiges AccessField - sonst wären ja auch Zuweisungen wie Me!Steuerelementname.EigenschaftAusserValue mittels Late Binding ungültig. Aber Interna verrät uns Microsoft dazu wohl nicht.
Ich bin übrigens beim Schreiben davon ausgegangen, dass die beiden Felder an gar kein Steuerelement gebunden sind.