Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Im Query 2 neue Tabellenfelder integriert, über VBA nicht ansprechbar

Begonnen von derilzemer, Juli 14, 2017, 19:39:29

⏪ vorheriges - nächstes ⏩

derilzemer

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.

Grüße und Dank im voraus
Andreas

Beaker s.a.

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".
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

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).
Mit freundlichem Glück Auf!

Eberhard

derilzemer

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?

Grüße und Dank im voraus
Andreas

Lachtaube

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.
Grüße von der (⌒▽⌒)

ebs17

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).
Mit freundlichem Glück Auf!

Eberhard

derilzemer

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.




Grüße und Dank im voraus
Andreas

Lachtaube

Andreas,

die Frage von Ebehard war nach dem Namen der beiden Steuerelemente - siehe gleichnamige Eigenschaft im Eigenschaftsfenster (4. Register, 1. Zeile).
Grüße von der (⌒▽⌒)

derilzemer

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
Grüße und Dank im voraus
Andreas

Lachtaube

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
Grüße von der (⌒▽⌒)

derilzemer

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
Grüße und Dank im voraus
Andreas

Lachtaube

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
Grüße von der (⌒▽⌒)

derilzemer

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.
Grüße und Dank im voraus
Andreas

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

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.
Grüße von der (⌒▽⌒)