Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Register in Abhängigkeit ein-/ausblenden

Begonnen von mad, Januar 13, 2024, 11:12:41

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

habe in ein Forlmular ein Registersteuerelement mit zwei Register eingefügt.
Nun möchte in in Abhängigkeit des Tabellenfeldes "optuser1" bzw. "optuser2" aus der Datenherkunft für dies Formular "tabPWUsergruppe_Allg" die Register "frmAusw1" bzw. "frmAusw2" ein- od. ausblenden.

Wenn z.B. im Tabellenfeld "optuser2" eine 1 steht soll das Register "frmAusw2" ausgeblendet bleiben. Bei einer 2 eingeblendet werden. Selbest gilt natürlich für "optuser1" u. "frmAusw1".

aktueller Code:

Private Sub Form_Load()

                Me!frmAusw1.Visible = Nz(Me!optuser1, 2)
                Me!frmAusw2.Visible = Nz(Me!optuser2, 1)

End Sub

Standardmäßig habe ich die Register im eigenschaftsblatt unter Format - Sichtbar auf nein gestellt.

Leider bleiben das Register "frmAusw2" sichtbar, obwohl in "optuser2" eine 1 eingetragen ist.

Hätte jemand eine Idee an was das liegen könnte?


Gruss
mad

MzKlMu

Hallo,
lasse Dir mit einer MsgBox den jeweilgen Wert von optuser1 und optuse2 anzeigen.

Gruß Klaus

mad

Ich hoffe ich dabe das jetzt richtig gemacht!

MsgBox (optuser1)
MsgBox (optuser2)

Für optuser1 wird die 2 ausgegeben, für optuser2 leider nichts.

Habe nun die zweite Codezeile wie folgt geändert:
Me!frmAusw2.Visible = Nz(Me!optuser2, 2)
Die MsgBox optuser2 zeigt aber immer noch keinen Wert an. Warum kann ich mir aktuell leider nicht erklären.


Gruss
mad

mad

Hab's jetzt mal ausführlicher versucht,

            If Me.optuser1.Value = 2 Then
                Me.frmAusw1.Visible = True
            End If
            If Me.optuser2.Value = 2 Then
                Me.frmAusw2.Visible = True
            End If
so funktionierts.

Aber funktionierts nicht auch kürzer?

Gruss
mad

PhilS

Zitat von: mad am Januar 14, 2024, 09:54:44Aber funktionierts nicht auch kürzer?
Ja.
Me!frmAusw1.Visible = CBool(Nz(Me!optuser1, 0)=2)
Me!frmAusw2.Visible = CBool(Nz(Me!optuser2, 0)=2)
Das ist in diesem Fall sogar auch besser, weil du in deiner ausführlichen Schreibweise, die Möglichkeit dass eine Registerkarte ausgeblendet werden soll nicht berücksichtigt hattest.

Die explizite Konvertierung mit CBool könntest du oben sogar weglassen, weil sie dann auch implizit automatisch passieren würde. In diesem konkreten Fall ist das Geschmackssache.

Generell ist kürzer nicht unbedingt besser. Schreib deinen Code so, dass du ihn ohne viel geistige Anstrengung lesen und verstehen kannst. Im Durchschnitt wird eine Codezeile (unverändert) nach dem Schreiben mehr als 10 mal gelesen. Die Idee, dass man Zeit sparen würden, wenn man Code kürzer formuliert und daher weniger zu tippen hat, ist ein weit verbreiterter Irrglaube.

Vor diesem Hintergrund sind deine 1/2-Nummerierungen suboptimal. Besser wäre es, die Steuerelemente so zu benennen, dass sofort ersichtlich ist, was frmAusw1/2 und Optuser1/2 eigentlich sind.

Nur mal als Beispiel, wie dein Code dann aussehen könnte (den Kontext habe ich natürlich frei erfunden):
Me!frmZusatzinfoGeschaeftskunde.Visible = CBool(Nz(Me!Kundenart, 0)=Geschaeftskunde)
Me!frmZusatzinfoAusland.Visible = CBool(Nz(Me!Kundenregion, 0)=Ausland)

In diesem Kontext vielleicht interessant: Better VBA - Besseren VBA Code schreiben
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Warum nicht einfach
Me!frmAusw1.Visible = CBool(Nz(Me!optuser1, 0)=2)
Me!frmAusw2.Visible = Not Me!frmAusw1.Visible
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)

PhilS

Zitat von: Beaker s.a. am Januar 14, 2024, 12:37:09Warum nicht einfach
Du hast übersehen, dass Optuser1 und Optuser2 verschiedene Felder in der Datenherkunft sind, und daher deine Entweder/Oder-Logik so nicht den Anforderungen entspricht.

PS: Danke übrigens, dass du direkt meine Anmerkungen zur Lesbarkeit von Code und der (fehlenden) Aussagefähigkeit der Steuerelementnamen bestätigst. :-)
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mad

#7
Hallo ,

jetzt müsste ich mich doch nochmals melden.

Habe jetzt einen erweiterten Fall von einem Bottun in Abhängigkeit ein-/ausblenden.

Ich habe ein Formular "UG_frm_Formauswahl_Allg" das immer geöffnet ist und je nach dem wer eingeloggt ist wird ein entsprechender Name im Feld "UsernameGlobal" angezeigt.

Nun möchte ich auf meinen Formularen jeweils einen Botton zum Datensatzhinzufügen "btn_DS_neu1" und einen zum Datensatzlöschen "btn_DS_del1" hinzufügen. So wie oben sollen die beiden Bottons je nachdem wer eingeloggt ist ein-/ausblenden.

aktueller Code:
Private Sub Form_Load()

    Me!btn_DS_neu1.Visible = CBool(Nz(Me!btnuserAusw101, 0) = 3 Or 4)
    Me!btn_DS_del1.Visible = CBool(Nz(Me!btnuserAusw101, 0) = 4)

End Sub

Das funktioniert aber nur solange es in der Tabelle "tabPWUsergruppe_Allg" nur eine Zeile gibt. Es gibt aber mehrere User.
Nun reicht derCBool(Nz(Me!btnuserAusw101, 0) nicht aus.

Das ganze müsste sich noch auf das oben genannte Formular "UG_frm_Formauswahl_Allg" mit dem Feld "UsernameGlobal" und der Datensatzquelle "tabPWUsergruppe_Allg" für diese Formular mit dem Feld "Klarname" beziehen.

Hätte nun diesen Ansatz verfolgt:

...(Me!Forms!UG_frm_Formauswahl_Allg!UsernameGlobal = [tabPWUsergruppe_Allg]![Klarname]) And...
gesamt:
Private Sub Form_Load()

    Me!btn_DS_neu1.Visible = (Me!Forms!UG_frm_Formauswahl_Allg!UsernameGlobal = [tabPWUsergruppe_Allg]![Klarname]) And CBool(Nz(Me!btnuserAusw101, 0) = 3 Or 4)
    Me!btn_DS_del1.Visible = (Me!Forms!UG_frm_Formauswahl_Allg!UsernameGlobal = [tabPWUsergruppe_Allg]![Klarname]) And CBool(Nz(Me!btnuserAusw101, 0) = 4)
     
End Sub

da bekomme ich aber die LZF-Meldung 2465 (MS kann das in Ihrem Ausdruck angesprochene Feld 'Forms' nicht finden.

Was mache ich mal wieder falsch?.


Gruss
mad

mad

Hallo Zusammen,

habe etwas in diversen Foren nachgelesen.
Habe dazu mal eine sehr kleine TestDB erstellt, die das was ich erreichen möchte nachstellen soll.

Folgenden Code habe ich beim laden der "frmDoku" erstellt:

Private Sub Form_Load()
    Me!btn_neu_1.Visible = Nz(DLookup("ID", "tbluser", "ID = " & Forms!frmstart!userID) = 3 Or 4)
End Sub

Was soll eigentlich passieren:
Wenn "userID" im "frmStart" gleich ist mit "ID" in der Tabelle "tbluser" dann soll abgeglichen werden ob der Wert in "aususer1" der jeweiligen Zeile einer 3 oder 4 entspricht, wenn ja dann soll der Botton "btn_neu_1" im Form "frm Doku" sichtbar werden, sonst nicht.

Aktuell kommt keine Fehlermeldung, allerdings bleibt der Botton "btn_neu_1" im "frmDoku" immer sichtbar, auch wenn ich im Form "frmstart" unter "userID" eine 1 eintrage.

Ich befürchte in bin mal wieder total auf dem Holzweg!

Noch eine Frage an die Profis. Sollte ich eventuell zu diesem Thema einen neuen Beitrag einstellen?


Gruss
mad

mad

Habe den Code überarbeitet, hatte das Tabellenfeld "aususer1" komplett vergessen.

aktueller Code sieht nun wie folgt aus:

Private Sub Form_Load()
 
        If DLookup("aususer1" = 3 Or 4, "tbluser", "ID = " & Forms!frmstart!userID) = True Then
        Me!btn_neu_1.Visible = True
        End If

End Sub

Allerdings bekomme ich nun die Fehlermeldung "LZF 13, Typen unverträglich".

Was ist mein Fehler?


Gruss
mad

PhilS

Zitat von: mad am Januar 16, 2024, 08:43:11       If DLookup("aususer1" = 3 Or 4, "tbluser", "ID = " & Forms!frmstart!userID) = True Then
Das erste Argument für DLookup is der Feldname der Tabellenspalte. Das "= 3 Or 4" hat dort nichts verloren.

Generell verknüpfst du mit OR ganze Ausdrücke. Der Teil "OR 4" sorgt dafür, dass jedes Ergebnis als True betrachtet wird, weil allein schon 4 True ist.

Ich würde die Prüfung der Bedingungen der Domänen-Funktion überlassen und entsprechende Kriterien definieren; dann allerdings für DCount:

 
If DCount("*", "tbluser", "ID = " & Forms!frmstart!userID & " AND aususer1 IN (3, 4) ) > 0 Then
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

mad

Hallo Phils,

herzlichen Dank für die Unterstützung:
Habe im Code ...aususer1 IN (3, 4)") > 0... noch ein " Zeichen zwischen den beiden Klammer ergänzt, so funktioniert der Code jetzt.


Danke
mad