Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: KonradR am Dezember 17, 2023, 11:09:56

Titel: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 17, 2023, 11:09:56
Hallo liebe Accessfreunde,

ich möchte die Eingabe in ein von mir erstelltes Kombinationsfeld auf einem Formular erzwingen. Dazu habe ich folgende Prozedur erstellt:
Private Sub cboLadenTextIDRef_BeforeUpdate(Cancel As Integer)
    If IsNull(Me!cboeinkaVersiIDRef.Text) Then
       MsgBox "bitte eine Versionsbezeichnung eingeben"
       Cancel = True
'Fokus auf cboeinkaVersiIDRef setzen
'        Me!cboeinkaVersiIDRef.SetFocus
    Else
    End If
End Sub

Wenn ich das Formular auf dem das Kombinationsfeld cboLadenTextIDRef positioniert ist starte, dann erscheint folgende Fehlermeldung:
Screenshot 2023-12-17 111626.png

Wie kann ich denn dann den Fokus auf das Kombinationsfeld cboeinkaVersiIDRef setzen und den Wert von dessen Texteigenschaft auslesen?

Schon im Voraus vielen Dank.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: MzKlMu am Dezember 17, 2023, 12:22:08
Hallo,
lasse mal das .Text weg, versuchsweise.
Ich glaube nicht, dass das an der Stelle benötigt wird (bin aber nicht 100% sicher).

Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 17, 2023, 12:47:20
Hallo MzKIMu,

Zitat von: MzKlMu am Dezember 17, 2023, 12:22:08lasse mal das .Text weg, versuchsweise.
Ich glaube nicht, dass das an der Stelle benötigt wird (bin aber nicht 100% sicher).

Dann ist der Wert NULL. Vielen Dank. Damit ist er erste Teil meines Problems gelöst. Weist du auch, wie ich den Fokus auf das Kombinationsfeld cboeinkaVersiIDRef setzen kann, wenn dieser gerade auf dem Kombinationsfeld cboLadenTextIDRef ist?
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: PhilS am Dezember 17, 2023, 13:48:25
Zitat von: MzKlMu am Dezember 17, 2023, 12:22:08lasse mal das .Text weg, versuchsweise.
Ergänzung zum Verständnis: Das bedeutet eigentlich: Ersetze .Text durch .Value.
Da .Value die Standardeigenschaft der meisten Steuerelemente ist, kann es dann auch weggelassen werden.


Zitat von: KonradR am Dezember 17, 2023, 12:47:20wie ich den Fokus auf das Kombinationsfeld cboeinkaVersiIDRef setzen kann, wenn dieser gerade auf dem Kombinationsfeld cboLadenTextIDRef ist?
Eigentlich genau so, wie du es versucht hast, mit .SetFocus.
Probleme hattest du vermutlich, weil du dies im BeforeUpdate-Ereignis versucht hast. Das BeforeUpdate-Ereignis tritt ein, wenn überprüft wird, ob der geänderte Inhalt eines Steuerelements so gespeichert werden kann. In diesem Moment kann der Focus nicht von dem jeweils aktuellen Steuerelement auf ein anderes verschoben werden, weil der Speichern-Vorgang erst abgeschlossen werden muss.

Generell scheint für diesen Prozess in deiner Anwendung noch ein konzeptionelles Problem zu bestehen. Es ist eher ungewöhnlich (=i.d.R. falsch) bei der Aktualisierung eines Steuerelementes zu überprüfen, ob ein komplett anderes Steuerelement richtig ausgefüllt wurde.
Das sollte bereits bei der Eingabe in cboeinkaVersiIDRef geprüft werden (cboeinkaVersiIDRef_BeforeUpdate) und/oder dein zweites Steuerelement cboLadenTextIDRef sollte erst dann aktiv (Enabled) werden, wenn die Voraussetzungen für die Eingabe darin erfüllt sind.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 17, 2023, 16:33:33
Zitat von: PhilS am Dezember 17, 2023, 13:48:25Ergänzung zum Verständnis: Das bedeutet eigentlich: Ersetze .Text durch .Value.
Da .Value die Standardeigenschaft der meisten Steuerelemente ist, kann es dann auch weggelassen werden.
Danke, PhilS. Da habe ich wieder was gelernt.


Zitat von: PhilS am Dezember 17, 2023, 13:48:25Eigentlich genau so, wie du es versucht hast, mit .SetFocus.
Probleme hattest du vermutlich, weil du dies im BeforeUpdate-Ereignis versucht hast. Das BeforeUpdate-Ereignis tritt ein, wenn überprüft wird, ob der geänderte Inhalt eines Steuerelements so gespeichert werden kann. In diesem Moment kann der Focus nicht von dem jeweils aktuellen Steuerelement auf ein anderes verschoben werden, weil der Speichern-Vorgang erst abgeschlossen werden muss.

Generell scheint für diesen Prozess in deiner Anwendung noch ein konzeptionelles Problem zu bestehen. Es ist eher ungewöhnlich (=i.d.R. falsch) bei der Aktualisierung eines Steuerelementes zu überprüfen, ob ein komplett anderes Steuerelement richtig ausgefüllt wurde.
Das sollte bereits bei der Eingabe in cboeinkaVersiIDRef geprüft werden (cboeinkaVersiIDRef_BeforeUpdate) und/oder dein zweites Steuerelement cboLadenTextIDRef sollte erst dann aktiv (Enabled) werden, wenn die Voraussetzungen für die Eingabe darin erfüllt sind.
Hier hatte ich eine andere Denkweise, weil ich die Grundlagen nicht wusste, wann das Ereignis "BeforeUpdate" ausgelöst wird, was an Aktionen darauf folgt und warum es überhaupt ausgelöst wird.

Dadurch habe ich festgestellt, dass das Ereignis "BeforeUpdate" ungeeignet für meine Zwecke zu sein scheint und mit dem Ereignis "LostFocus" die gewünschte Prüfung an der richtigen Stelle durchgeführt werden kann. Ich habe jetzt meinen Code entsprechend angepasst. Allerdings wird die Enabled Eigenschaft vom Kombinationsfeld cboLadenTextIDRef von false nicht auf true umgeschalten, wie ich es im Code vorgeschrieben habe. Kannst du mir da Hilfestellung geben, wie ich das noch ereiche? Hier mein Code:
Private Sub cboeinkaVersiIDRef_LostFocus()
    If IsNull(cboeinkaVersiIDRef) Then
        MsgBox "Der Inhalt von cboeinkaVersiIDRef ist: Null " & vbCrLf & "bitte eine Versionsbezeichnung eingeben"
'Fokus auf cboeinkaVersiIDRef setzen
        Me!cboeinkaVersiIDRef.SetFocus
        Me!cboLadenTextIDRef.Enabled = False
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboLadenTextIDRef.Enabled = False
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboProduProNaIDRef.Enabled = False
        Me!cboProduvepckArtIDRef.Enabled = False
        Me!cboProduInhaltGewicht.Enabled = False
        Me!cboProduVerpaEinheitIDRef.Enabled = False
        Me!cboProduPreis.Enabled = False
    Else
        Me!cboLadenTextIDRef.Enabled = True
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboLadenTextIDRef.Enabled = False
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboProduProNaIDRef.Enabled = False
        Me!cboProduvepckArtIDRef.Enabled = False
        Me!cboProduInhaltGewicht.Enabled = False
        Me!cboProduVerpaEinheitIDRef.Enabled = False
        Me!cboProduPreis.Enabled = False
    End If
End Sub
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: PhilS am Dezember 17, 2023, 17:09:15
Zitat von: KonradR am Dezember 17, 2023, 16:33:33Allerdings wird die Enabled Eigenschaft vom Kombinationsfeld cboLadenTextIDRef von false nicht auf true umgeschalten, wie ich es im Code vorgeschrieben habe.
Schau dir den Code nochmal genau an. Die Aussage "wie ich es im Code vorgeschrieben habe." ist nicht korrekt.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 17, 2023, 18:30:49
Zitat von: PhilS am Dezember 17, 2023, 17:09:15Schau dir den Code nochmal genau an. Die Aussage "wie ich es im Code vorgeschrieben habe." ist nicht korrekt.

Danke für deinen Hinweis. Ich habe mir den Code nochmal genau angeschaut und folgendes festgestellt:
Im Then-Teil der If-Anweisung habe ich die Enabled-Eigenschaft vom Kombinationsfeld cboLadenTextIDRef mit dem Code Me!cboLadenTextIDRef.Enabled = False auf false gesetzt, was funktionert.
Im Else-Teil der If-Anweisung habe ich die Enabled-Eigenschaft vom Kombinationsfeld cboLadenTextIDRef mit dem Code Me!cboLadenTextIDRef.Enabled = True auf True , was nicht funktioniert.

Der Then-Teil tritt ein, wenn der Wert vom Kombinationsfeld cboLadenTextIDRef = 0 ist und das ist ja auch der Fall, wenn nichts drin steht und ich das Kombinationsfeld verlasse.
Der Else-Teil tritt ein, wenn der Wert vom Kombinationsfeld cboLadenTextIDRef nicht Null ist, also wenn was drin steht. Wenn ich im Kombinationsfeld etwas auswähle, dann steht ja etwas drin, aber die Eigenschaft .Enabled des Kombinationsfeldes cboLadenTextIDRef, die ich im Else-Anteil definiert habe (True) der If Anweisung wird nicht ausgeführt. Wenn ich im Else-Anteil aber zur Probe eine Msgbox mit einer Meldung "es steht was drin" platziere, wird diese aufgerufen. Warum wird also die Msg-Box aufgerufen, aber die Enabled-Eigenschaft nicht auf True gesetzt?
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: PhilS am Dezember 17, 2023, 19:09:05
Zitat von: KonradR am Dezember 17, 2023, 16:33:33Else
        Me!cboLadenTextIDRef.Enabled = True
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboLadenTextIDRef.Enabled = False
Schau dir den Code bitte nochmal an. - Der zitierte Ausschnitt oben enthält das Problem.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 17, 2023, 19:26:15
Zitat von: PhilS am Dezember 17, 2023, 19:09:05
Zitat von: KonradR am Dezember 17, 2023, 16:33:33Else
        Me!cboLadenTextIDRef.Enabled = True
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboLadenTextIDRef.Enabled = False
Schau dir den Code bitte nochmal an. - Der zitierte Ausschnitt oben enthält das Problem.

Danke für deinen Tip. Jetzt habe ich es noch mal genauer angeschaut und herausgefunden, dass ich Me!cboLadenTextIDRef.Enabled = True einmal auf true und beim 2.ten mal auf false gesetzt habe. Also ist der letzte Befehl bindend und es bleibt bei false. Das gleiche Problem war auch bei Me!cboMarkeTextIDRef.Enabled. Das hat mir geholfen. Vielen Dank.

Jetzt habe nur noch die Herausforderung, dass ich den Fokus mit Me!cboeinkaVersiIDRef.SetFocus auf das Kombinationsfeld cboeinkaVersiIDRef setzen will, wenn der Then Zweig der IF-Anweisung erfüllt ist. Leider klappt das nicht. Woran könnte das liegen. Hast du da eine Idee?
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 17, 2023, 20:35:19
Hallo PhilS,

ich habe jetzt noch mal recherschiert und den Code angepasst:
Private Sub cboeinkaVersiIDRef_LostFocus()
    If IsNull(cboeinkaVersiIDRef) Then
        MsgBox "Der Inhalt von cboeinkaVersiIDRef ist: Null " & vbCrLf & "bitte eine Versionsbezeichnung eingeben"
        Me!cboeinkaVersiIDRef.Enabled = True
        Me!cboLadenTextIDRef.Enabled = False
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboProduProNaIDRef.Enabled = False
        Me!cboProduvepckArtIDRef.Enabled = False
        Me!cboProduInhaltGewicht.Enabled = False
        Me!cboProduVerpaEinheitIDRef.Enabled = False
        Me!cboProduPreis.Enabled = False
        Me.Repaint
        Me!cboeinkaVersiIDRef.SetFocus
    Else
        Me!cboLadenTextIDRef.Enabled = True
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboProduProNaIDRef.Enabled = False
        Me!cboProduvepckArtIDRef.Enabled = False
        Me!cboProduInhaltGewicht.Enabled = False
        Me!cboProduVerpaEinheitIDRef.Enabled = False
        Me!cboProduPreis.Enabled = False
        Me.Repaint
        Me!cboProduProNaIDRef.SetFocus
    End If
End Sub
Die SetFocus-Methode funktioniert für alle Kombinationsfelder super. Nur beim Feld cboeinkaVersiIDRef funktioniert sie nicht. Wenn ich also im Kombinationsfeld cboeinkaVersiIDRef drin stehe und das verlasse, soll das ja wieder das Kombinationsfeld cboeinkaVersiIDRef aufrufen. Warum funktioniert hier die SetFocus-Methode für alle Felder, nur nicht für das Feld, in dem ich gerade drin stehe?
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: ebs17 am Dezember 17, 2023, 20:51:31
Unabhängig von internen konkreten Abläufen:
LostFocus => SetFocus - wie würdest Du diesen Wunsch anders als planlos und verwirrt bewerten?
(Manche Probleme schafft man sich erst.)
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 17, 2023, 21:17:44
Zitat von: ebs17 am Dezember 17, 2023, 20:51:31Unabhängig von internen konkreten Abläufen:
LostFocus => SetFocus - wie würdest Du diesen Wunsch anders als planlos und verwirrt bewerten?
(Manche Probleme schafft man sich erst.)

Ich lese deine Antwort und verstehe, dass du auf meine Frage mit einer Frage antwortest und mit: "wie würdest Du diesen Wunsch anders als planlos und verwirrt bewerten?" Meinst du damit, dass mein Vorgehen in diesem Fall planlos und verwirrt ist? Ich kann dir da leider nicht ganz folgen. Vielleicht kannst du etwas konkreter werden.

Im übrigen habe ich den letzten Schritt der Herausforderung gelöst auch und nur durch die Hilfe von PhilS und MzKIMu war das möglich. Hier mein Code:
Private Sub cboeinkaVersiIDRef_LostFocus()
    If IsNull(cboeinkaVersiIDRef) Then
        Me!cboeinkaVersiIDRef.Enabled = True
        Me!cboLadenTextIDRef.Enabled = False
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboProduProNaIDRef.Enabled = False
        Me!cboProduvepckArtIDRef.Enabled = False
        Me!cboProduInhaltGewicht.Enabled = False
        Me!cboProduVerpaEinheitIDRef.Enabled = False
        Me!cboProduPreis.Enabled = False
    Else
        Me!cboLadenTextIDRef.Enabled = True
        Me!cboMarkeTextIDRef.Enabled = False
        Me!cboProduProNaIDRef.Enabled = False
        Me!cboProduvepckArtIDRef.Enabled = False
        Me!cboProduInhaltGewicht.Enabled = False
        Me!cboProduVerpaEinheitIDRef.Enabled = False
        Me!cboProduPreis.Enabled = False
        Me.Repaint
        Me!cboLadenTextIDRef.SetFocus
    End If
End Sub


Mein letztes Anliegen bestand ja darin, den Focus auf dem Kombinationsfeld cboeinkaVersiIDRef zu halten, wenn dieser Wert NULL ist. Da ja bei der BeforeUpdate-Methode immer eine Änderung im Wert des Steuerelemnts erfolgen muss, hilft mir dieses Ereignis nicht weiter, wenn das Formular gestartet wurde und noch keine Eintragung erfolgt ist. Es ist also noch keine Änderung erfolgt und damit greift das Ereignis auch nicht. Dann habe ich noch mal recherschiert und herausgefunden, dass ich mit dem Ereignis EXIT die Prüfung auf NULL durchführen kann, weil EXIT nicht differenziert, ob eine Datenänderung stattgefunden hat. Und hier das Ergebnis:
Private Sub cboeinkaVersiIDRef_Exit(Cancel As Integer)
'Den Cursor zwingen im Kombinationsfeld zu bleiben, bis der Inhalt <> 0 ist.
    If IsNull(Me!cboeinkaVersiIDRef) Then
        MsgBox "Der Inhalt von cboeinkaVersiIDRef ist: Null " & vbCrLf & "bitte eine Versionsbezeichnung eingeben"
        Cancel = True
    End If
   
    If IsNull(Me!txtVersiID) Then
        Cancel = False
    End If
End Sub

Im letzen Teil gebe ich noch vor, dass mit Cancel = False ermöglicht werden soll den Datensatz zu verlassen, wenn noch keine txtVersiID erstellt und damit kein neuer Datensatz angelegt wurde, wenn ich einmal zu viel auf die Tab-Taste gedrückt habe und wieder zurück in den vorhergehenden Datensatz will. Danke MzKIMu und PhilS.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: ebs17 am Dezember 17, 2023, 22:09:01
ZitatVielleicht kannst du etwas konkreter werden.
LostFocus auf ein Control, darauf unmittelbar SetFocus auf dieses Control: Als was würdest Du das beschreiben?

Ich würde für mich sagen, wenn ich einen Platz nicht verlassen will, bleibe ich stehen. Drei Schritte vor und drei Schritte zurück entspricht nicht Effizienz-Ansprüchen.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 23, 2023, 06:16:23
Hallo ebs17,

Zitat von: ebs17 am Dezember 17, 2023, 22:09:01LostFocus auf ein Control, darauf unmittelbar SetFocus auf dieses Control: Als was würdest Du das beschreiben?
Ich würde es so beschreiben:
Ich will das nächste Feld eingeben, habe aber im Kombinationsfeld cboeinkaVersiIDRef ist noch nichts eingegeben, weil ich es vergessen habe. Da beim nächsten Aufruf des Formulars der gerade eingegeben Datensatz nicht sichtbar ist, darf ich absichern, dass im Kombinationsfeld cboeinkaVersiIDRef auch was eingegeben wird. Die Tabulatortaste setzt den Cursor in das nächste Datenfeld. Folglich darf ich diesen am Weitergehen bzw. am Verlassen des Kombinationsfeldes cboeinkaVersiIDRef hindern, wenn im Kombinationsfeld cboeinkaVersiIDRef der Wert NULL ist. Alles was ich ausprobiert habe, führt dazu, dass der Cursor weitergeht. Also deaktiviere ich alle Felder und probiere mit dem Ereignis EXIT, den Cursor am Weitergehen zu hindern.

Zitat von: ebs17 am Dezember 17, 2023, 22:09:01Ich würde für mich sagen, wenn ich einen Platz nicht verlassen will, bleibe ich stehen. Drei Schritte vor und drei Schritte zurück entspricht nicht Effizienz-Ansprü
Das macht für mich absolut Sinn. Wie bleibst du denn stehen?

Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: ebs17 am Dezember 23, 2023, 10:08:43
Gegenseitige Abhängigkeiten von Feldern im Datensatz sind zu vermeiden. Daher spielt eine Reihenfolge und letztendlich solch ein Exit-Event keine Rolle.
Wenn Eingaben in Felder eines Datensatzes notwendig sind, sind das Pflichtfelder. Solche prüft man geeignet alle im Zusammenhang im Form_BeforeUpdate, so dass ein Datensatz nur vollständig in die Speicherung geht.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: Beaker s.a. am Dezember 23, 2023, 13:12:40
Hallo,

Also meine Erfahrung ist, dass ein Cancel = True in der "BeforeUpdate"-Prozedur eines Feldes einen Wechsel zu einem anderen Control sicher
verhindert.
Das Problem hier wird sein, dass dieses Ereignis ja nur eintritt, wenn im Kombi was geändert
wurde. D.h. ein einfaches "Übergehen" (leer lassen des Feldes) löst das Ereignis nicht aus.
Deshalb wohl auch der Versuch mit "LostFocus".
Da das Feld wohl ein Pflichtfeld ist, muss man dessen Inhalt in "Form_BeforeUpdate" prüfen.
Da kann man dem Feld dann auch wieder den Focus zuweisen.

gruss ekkehard
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 27, 2023, 09:19:19
Zitat von: ebs17 am Dezember 23, 2023, 10:08:43Gegenseitige Abhängigkeiten von Feldern im Datensatz sind zu vermeiden.

Danke für deine Antwort. Warum sollen denn gegenseitige Abhängikeiten von Feldern im Datensatz vermieden werden? Was ist denn die ungünstigste Konsequenz?
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 27, 2023, 09:21:21
Zitat von: Beaker s.a. am Dezember 23, 2023, 13:12:40Da kann man dem Feld dann auch wieder den Focus zuweisen.

Danke, wieder was gelernt.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: ebs17 am Dezember 27, 2023, 09:41:44
ZitatWas ist denn die ungünstigste Konsequenz?
Unlösbarkeit einer Aufgabe.
Dass Du Dir mit Deiner Vorgehensweise selber ein Problem eingehandelst hast, hast Du sicherlich bemerkt, bei zwei Feldern.
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: KonradR am Dezember 27, 2023, 13:03:37
Zitat von: ebs17 am Dezember 27, 2023, 09:41:44Dass Du Dir mit Deiner Vorgehensweise selber ein Problem eingehandelst hast, hast Du sicherlich bemerkt, bei zwei Feldern.

Ja, das habe ich gemerkt. Also die Steuerelemente lieber übergeordnet vom Formular aus ansprechen. Z.B. mit Form_BeforeUpdate().
Titel: Re: Wie kann ich auf die Texteigenschafte eines Kombinationsfeldes zugreifen?
Beitrag von: Beaker s.a. am Dezember 28, 2023, 16:53:15
Zitatlieber
Kommt m.E. auf die Anforderung an ein Feld an, - z.B. falsche Werte
direkt abzuweisen.