Neuigkeiten:

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

Mobiles Hauptmenü

Hilfe: Tabs im Menüband einblenden

Begonnen von KrummiTill, November 11, 2024, 21:51:10

⏪ vorheriges - nächstes ⏩

KrummiTill

Hallo zusammen,

ich bastel aktuell eine Datenbank und bin schon echt Happy was ich erreicht habe. Ich muss zugeben u.a mit ChatGPT als Hilfe.
Nun ja , komme ich zu meinem Problem welches ich bisher auch mit Online Hilfe nicht lösen konnte.

Ich habe ein benutzerdefiniertes Menüband erstellt und in den Einstellungen hinterlegt. Dieses wird auch soweit angezeigt.
Jetzt habe ich einen Tab ,,Administration" welcher getVisible nutzen soll.
Ich möchte nach einem Loginfenster die Benutzergruppe auslesen von dem eingeloggten Benutzer und anhand derer Tabs einblenden.
Zusätzlich habe ich das Problem das beim Start der Datenbank eine Fehlermeldung kommt das er die Makro- oder Rückruffunktion ,,TabGetVisibleAdmin" nicht ausführen konnte.

Bin so ziemlich am Ende mit dem Rumprobieren.
Zum Testen habe ich eine neue Datenbank angelegt bevor ich mir meine derzeitige komplett zerschieße.

Bei Bedarf und wenn es hier möglich ist, kann ich gerne das ein oder andere noch hochladen / schreiben.

Bitsqueezer

Hallo,

Du kannst die Callbacks des Ribbons jederzeit mit "Invalidate" des RibbonUI-Objektes neu anstoßen.
Alle definierten Callbacks werden dabei durchlaufen. In Deiner Prozedur, die Du für getVisible hinterlegt hast, kannst Du dann die Bedingungen festlegen. Der Prozedur wird der Name jedes einzelnen Ribbon-Elementes bzw. dessen Id übermittelt, so daß Du prüfen kannst, welches gerade ein- oder ausgeschaltet werden soll.

Näheres findest Du auf der Seite:
https://www.accessribbon.de/?search=getVisible&function=search

Gruß

Christian

KrummiTill

Danke, schaue ich mir mal an. Wäre es möglich das du mal in die Datei reinschaust ? Da ist aktuell ein bisschen Code gewusel, welches ich noch in Ordnung bringen wollte nach dem ich das Problem behoben habe. Da ist jetzt auch Code drin, der so leider nicht klappt.
Allerdings habe ich schon gesehen das da die Rede von Buttons ist. Ich muss es mir mal anschauen ob es auch ohne Buttons geht.

Leider kann ich dir die Datei nicht hochladen. Scheinbar ist das Dateiformat nicht gestattet.

Debus

Guten Morgen,

versuche die Datei mal zu komprimieren und dann zu zu packen. (z.B.: 7-Zip). Dann sollte das hochladen auch klappen

Gruß
Holger

Bitsqueezer

Hallo,

vor dem Hochladen darauf achten, daß Daten anonymisiert sind.
Das Aktualisieren mit Invalidate kannst Du anstoßen, so wie Du es brauchst.
Buttons sind nur eine Art von Ribbon-Elementen, Du kannst da alles einbauen, was Du willst und sichtbar/unsichtbar schalten.
Gunter Avenius hat auf der o.g. Seite auch einen Ribbon-Editor, wenn Du nicht weißt, wie Du das Ribbon bearbeiten mußt oder Callbacks schreibst.

Gruß

Christian

KrummiTill

#5
Zitat von: Debus am November 12, 2024, 07:30:13versuche die Datei mal zu komprimieren und dann zu zu packen. ...

Danke. Hier die aktuelle Datei. Wie gesagt, da ist auch Code drin der so nicht funktioniert mit dem Ribbon. Daten waren keine realen vorhanden von den Namen her. Wäre sehr dankbar wenn jemand mal reinschauen könnte. Vllt gibt es ja auch eine andere Alternative Lösung für mein anliegen.

KrummiTill

#6
Zitat von: Bitsqueezer am November 12, 2024, 09:27:42Gunter Avenius hat auf der o.g. Seite auch einen Ribbon-Editor, ....
Hab ich Probiert zu Installieren. Klappt leider nicht. Laut der Installation hab ich nicht die SystemVorraussetzungen für die Installation des RibbonCreators.

Bitsqueezer

Hallo,

laut der Website für Office 2010 und 2016. Ansonsten würde ich den Autor mal anschreiben.

Deine Datei habe ich mir kurz angesehen, abgesehen davon, daß es einen Null-Fehler gibt, wenn man beim Login nichts eingibt und "Anmelden" klickt (böse für einen Login....), müßtest Du schon mal näher beschreiben, wie man vorgehen soll, um Dein Problem nachzustellen.

Gruß

Christian

KrummiTill

Zitat von: Bitsqueezer am November 13, 2024, 00:24:19Hallo,

laut der Website für Office 2010 und 2016. Ansonsten würde ich den Autor mal anschreiben.

Deine Datei habe ich mir kurz angesehen, abgesehen davon, daß es einen Null-Fehler gibt, wenn man beim Login nichts eingibt und "Anmelden" klickt (böse für einen Login....), müßtest Du schon mal näher beschreiben, wie man vorgehen soll, um Dein Problem nachzustellen.

Gruß

Christian


Ich schaue es mir nochmal an bzgl dem Programm. Zu deiner Frage: Erstmal danke das du schon einmal reingeschaut hast. Den Nullfehler habe ich behoben.  Ich möchte im Endeffekt nach dem Login, abhängig der Benutzergruppe das Tabs im Ribbon eingeblendet oder ausgeblendet sind. Dafür habe ich in der XML getVisible jedem Tab zugeordnet mit entsprechend ="XYZ". Was vor dem Login zu sehen ist, ist mir egal. Solange man dann später nichts außerhalb vom Loginfenster klicken bzw aktivieren kann. Da könnte von mir aus auch das Standard Ribbon und nach dem Login das benutzerdefinierte Ribbon zu sehen sein.

Mein Problem ist eigentlich , dass egal was ich bisher getestet habe es nie mit der Veränderung des Ribbon geklappt hat oder / und zu beginn der Anwendung, wie es auch jetzt der Fall ist, ein Fehler kommt.

Ich lade dir die Datei ohne Nullfehler nochmal hoch. Du brauchst dich nicht anmelden aktuell um auf etwas zugreifen zu können.

Bitsqueezer

Hallo,

OK, die Datei kann ich mit A2013 nicht öffnen, eine neuere habe ich z.Zt. nicht verfügbar (Deine vorherige Datei ging).

Weiterer Fehler: Bitte in ALLE Module "Option Explicit" hinzufügen. Das kannst Du mit Find/Replace erledigen, indem Du nach "Option Compare Database" suchst und gegen beide Zeilen austauschst.
In den Optionen dann "Variablendeklaration erforderlich" anhaken, dann wird das in Zukunft in jedem neuen Modul automatisch erledigt.

Wenn Du dann "Kompilieren" durchführst, stellst Du fest, daß Du jede Menge Variablen in Deinem Code nicht deklariert hast, was dann leicht zu Fehlern führen kann. Ein Tippfehler im Namen und Du erzeugst eine neue Variable und wunderst Dich, warum nicht das drin ist, was Du erwartest.

Dein Ribbon hat keine Load-Initialisierung. Somit werden nur die Callbacks einmalig ausgeführt, danach nie wieder.
Sie werden richtig ausgeführt, das kannst Du feststellen, indem Du in Deine Prozedur einfach "Stop" einfügst, dann gibt es einen Break, wenn Du das nächste Mal Deine Datenbank ausführst.
Du siehst dann, daß Deine Prozedur "getTabVisibleAdministrator" ausgeführt wird, aber eben nur genau einmal.
Dazu sollte man außerdem die Callback-Funktionen nicht nach Gutdünken anpassen. Die richtige Definition sieht so aus:
https://www.accessribbon.de/index.php?Access_-_Ribbons:Callbacks:getVisible
Also:
control As IRibbonControl, ByRef visible
Somit hast Du in "control" auch IntelliSense-Unterstützung und der Name "visible" sagt in Deinem Code auch, was denn hier zurückgegeben wird. "returnedVal" ist nichtssagend.

CurrentUser ist auch nicht geeignet, um den Benutzernamen des Windows-Benutzers herauszufinden. Eine Benutzerverwaltung gibt es in Access schon seit mind. A2013 nicht mehr.
Die (unsichere) Methode ist "Environ("USERNAME")" abzufragen, das gibt Dir die Variable von Windows zurück, die den Benutzernamen enthält. Diese kann aber vom Benutzer geändert werden. Daher verwendet man am besten die API-Methode von Windows, die nicht manipulierbar ist:
https://support.microsoft.com/de-de/topic/visual-basic-procedure-to-get-current-user-name-3f08ee91-5cef-18aa-b7e4-232e0cc56fa8

Ansonsten, da Du ja anscheinend eine eigene Login-Methode verwendest, den Benutzernamen nach dem Login von hier beziehen.

Solange der noch nicht eingegeben wurde, also während Du noch im Login-Fenster stehst, sollte Deine getVisible-Methode natürlich "false" liefern als Rückgabewert.

Man kann natürlich für jedes Control im Ribbon eine eigene Sub definieren mit eigenem Namen. Ist aber nicht notwendig, dafür ist ja die "control"-Eigenschaft da. Die gibt Dir die Info zurück, welches Control (Tab, Group, Button usw.) mit welcher Id/Namen gerade abgearbeitet wird, und entsprechend kannst Du mit einer einzigen "getVisible"-Prozedur und einem Select Case alle abarbeiten und entsprechend reagieren. Das macht Dein XML deutlich einfacher, besonders bei Copy/Paste (z.B. einen neuen Tab einfügen).

Um in der Anwendung Änderungen am Ribbon durchführen zu können, brauchst Du unbedingt onLoad:
https://www.accessribbon.de/index.php?Access_-_Ribbons:Callbacks:customUI_-_onLoad

Damit speicherst Du die Referenz zum Ribbon-Objekt in einer globalen Variable und darüber kannst Du mit Invalidate erneut alle Ribbon-Objekte aktualisieren, was dann alle Callbacks erneut ausführt (auch mit einzelnen Menübereichen über InvalidateControl).

Zu beachten: Nicht abgefangene Fehler löschen alle globalen Variablen, danach kommst Du an Dein Ribbon nicht mehr ran, mußt die Anwendung neu starten. Es gibt aber Lösungen dazu, wie man die Referenz permanent in TempVars speichern und die Referenz wieder zurückholen kann.
https://www.accessribbon.de/index.php?Downloads:33

Die Seite solltest Du auf jeden Fall durcharbeiten und Dir auch die Demodatenbanken herunterladen, die es auf fast jeder Seite gibt, die zeigen Dir die grundsätzlichen Vorgehensweisen.

Gruß

Christian

KrummiTill

Wow. Danke für deinen ausführlichen Text  :o . Ich werde die angesprochenen Sachen mal angehen, ändern und mich weiter Probieren. Nur komisch das du jetzt die Datei nicht mehr öffnen kannst  :-\ merkwürdig. Hatte nur den NullFehler behoben in dem er die Felder txt-Benutzername und Passwort quasi kontrolliert und eine Meldung rausgiebt. Siehe:
Private Sub btn_LoginAnmelden_Click()
    ' Werte aus dem Login-Formular holen
    Dim strBenutzername As String
    Dim strPasswort As String
   
    ' Prüfen, ob Eingaben vorhanden sind
    If IsNull(Me!txt_Benutzername.Value) Or Me!txt_Benutzername.Value = "" Then
        MsgBox "Bitte geben Sie einen Benutzernamen ein.", vbExclamation, "Eingabefehler"
        Exit Sub
    End If
   
    If IsNull(Me!txt_Passwort.Value) Or Me!txt_Passwort.Value = "" Then
        MsgBox "Bitte geben Sie ein Passwort ein.", vbExclamation, "Eingabefehler"
        Exit Sub
    End If
   
    ' Werte zuweisen, da Eingaben vorhanden sind
    strBenutzername = Me!txt_Benutzername.Value
    strPasswort = Me!txt_Passwort.Value
   
    ' Login-Prozess starten
    Call BenutzerLogin(strBenutzername, strPasswort)
End Sub


Bezüglich dem Benutzername. Tatsächlich geht es gar nicht um den Benutzernamen in Windows. Sondern um den, in der Tabelle tbl_BenutzerLogin. Den Benutzername von Windows will ich gar nicht benutzen, ist auch gar nicht nötig.
Wie ich oben erwähnte, habe ich teils mit Online Hilfe wie ChatGpt oder co. gearbeitet. Vielleicht rührt daher der Fehler mit CurrentUser sowie so manch anderer Fehler.

Bitsqueezer

Hallo,

auch hier ein paar Anmerkungen:

Für Null gibt es einfach Nz, also
If Nz(Me.txtPasswort) = "" ThenDamit prüfst Du beides. Nz hat als Ersetzung standardmäßig "", ".Value" ist der Default bei Controls, außerdem empfehle ich, grundsätzlich immer "." statt "!" zu verwenden, denn nur so kann der Compiler testen, ob es den Controlnamen im Formular auch gibt, was Schreibfehler vermeidet. Ansonsten merkst Du es erst zur Runtime.

"Call" ist ebenfalls unnötig.
Einfach:
BenutzerLogin strBenutzername, strPasswort
Gruß

Christian

KrummiTill

#12
Danke für die Tipps.

Ich habe jetzt den RibbonCreator und auch da ein wenig getestet. Deine vorherigen Tipps / Hinweise habe ich auch einfließen lassen.
Allerdings aktualisiert sich das Ribbon nicht wie gewollt bzw. das Tab wird nicht wie gewollt sichtbar.

Code für die Anmeldung:
Private Sub btn_Anmelden_Click()
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim strBenutzername As String
    Dim strPasswort As String
   
    If Nz(Me.txt_Benutzername) = "" Then
            MsgBox "Bitte geben Sie einen Benutzernamen ein.", vbExclamation, "Eingabefehler"
        Exit Sub
    End If
   
    If Nz(Me.txt_Passwort) = "" Then
            MsgBox "Bitte geben Sie ein Passwort ein.", vbExclamation, "Eingabefehler"
        Exit Sub
    End If
   
     ' Werte aus den Textfeldern holen
    strBenutzername = Me.txt_Benutzername.Value
    strPasswort = Me.txt_Passwort.Value

    ' SQL-Abfrage, um den Benutzer zu finden
    strSQL = "SELECT * FROM tbl_Benutzer WHERE Benutzername = '" & strBenutzername & "' AND Passwort = '" & strPasswort & "'"
    Set rs = CurrentDb.OpenRecordset(strSQL)

    If Not rs.EOF Then
        ' Benutzer gefunden, Benutzergruppe speichern
        gBenutzergruppe = rs!Benutzergruppe  ' Benutzergruppe in die globale Variable speichern
        MsgBox "Login erfolgreich. Willkommen, " & strBenutzername & "!", vbInformation

        ' Formular schließen oder zum Hauptformular wechseln
        DoCmd.Close acForm, Me.Name
    Else

Callback Code:
Public Function GetVisible(control As IRibbonControl, ByRef visible)
    ' Diese Funktion steuert die Sichtbarkeit von Ribbon-Tabs basierend auf der Benutzergruppe

    Select Case gBenutzergruppe
        Case "Administrator"
            ' Für Administratoren sind alle Tabs sichtbar
            Select Case control.id
                Case "Administrator"
                    GetVisible = True  ' Tab für Administrator sichtbar
                Case Else
                    GetVisible = False ' Andere Tabs unsichtbar
            End Select
    End Select
End Function

Zusätzlich kommt beim Start der Datenbank ein Fenster mit dem Hinweis:
Access kann die Makro- oder Rückruffunktion 'GetTabVisibleAdministrator' nicht ausführen
Stellen Sie sicher, dass das Makro oder die Funktion vorhanden ist und die richtigen Parameter verwendet.

Oder muss ich aufgrund der Callback Funktion auch in der XML das getVisible Attribut verändern ?
Aktuell ist es ja wie folgt: getVisible="GetVisible"

Knobbi38

Hallo,

über deinen Code für die Anmeldung könnte man nochmal reden, aber woher sollte dein Ribbon wissen, daß es sich aktualisieren soll?  ;)

Lies doch bitte nochmal #1 durch.


KrummiTill

Zitat von: knobbi38 am November 13, 2024, 15:24:41Hallo,

über deinen Code für die Anmeldung könnte man nochmal reden, aber woher sollte dein Ribbon wissen, daß es sich aktualisieren soll?  ;)

Lies doch bitte nochmal #1 durch.



Blöde Frage was genau soll ich mir ansehen ?
Die Sub OnRibbonLoad habe ich bereits. In die Login Prozedur hab ich noch hinzugefügt:
        ' Das gesamte Ribbon nach der Anmeldung aktualisieren
        If Not gobjRibbon Is Nothing Then
            gobjRibbon.Invalidate ' Das gesamte Ribbon neu rendern, alle Callbacks werden ausgeführt
        End If
Damit sollte sich doch normalerweise das Ribbon aktualisieren, oder ?

Dennoch wird der Tab nicht sichtbar. Fehlermeldungen kommen keine