Neuigkeiten:

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

Mobiles Hauptmenü

Datumsfelder in eigenes Ribbon integrieren

Begonnen von SMBR, Februar 09, 2020, 20:22:22

⏪ vorheriges - nächstes ⏩

SMBR

Schönen guten Abend beisammen,
ich würde gerne mal wissen ob es möglich ist, Felder aus einer Tabelle auf ein selbst erstelltes Ribbon zu integrieren.
Konkret geht es um 2 Datumsfelder, welche in einer Tabelle stehen. Im Moment lassen sich diese zwei Felder (Bild Herkunftstabelle) über ein Formular
(Bild Formular)füllen.
Über eine Abfrage wird der Zeitraum der angegeben wurde(Bild Abfrage) auf einem Bericht angewendet.(Bild Bericht).
Wie auf Bild "Ribbon" zu sehen, sollte so das Ergebnis aussehen
Die entsprechenden Callback Prozeduren habe ich ebenfalls.Diese sind jedoch leer. (Bild Callback)
Falls es mögich ist, wie kann ich den Bezug zu den Felder in der Tabelle Stammdaten herstellen?
Über einen zusätzlilchen Button im Ribbon, soll dann die Abfrage aktualisiert werden. Für einen Tip wäre ich sehr dankbar.

PhilS

Grundsätzlich möglich ist das alles sicherlich.
Allerdings ist mir der Zusammenhang zwischen den Datumsfeldern, der Tabelle und der Abfrage noch nicht vollständig klar.

Du möchtest die in die RibbonControls eingetragenen Werte in der Tabelle speichern und dann mit einem Button in Ribbon die Abfrage ausführen lassen? - Ist das soweit richtig?

Zwischen tblStundenzettel und tblStammdaten besteht eigentlich gar keine Beziehung?
Ist es dann so, dass immer nur ein einziger Datensatz in tblStammdaten steht?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

SMBR

Hi,
danke für die Antwort. Ich benötige die beiden Datumsfelder nur als Filter. DatumVon und Datum Bis. Diese Felder werden auch nicht gespeichert sondern dienen wie gesagt als Datumsfilter. Mit dem Button "aktualisieren" übergebe ich der Abfrage die eingetragenen Datumswerte. Wenn ich dann auf den auf den besagten Button klicke und den zugrundeliegenden Bericht öffne, werden genau die Tage angezeigt die angegeben wurden. Deswegen stehen Sie nicht in Beziehung miteinander.
Und eben diesen Prozess (2 Datumsfelder zum aktualisieren, und den Button selbst) würde ich gerne in mein selbst erstelltes Ribbon integrieren. Wenn ich also einen Bericht öffnen möchte, würde ich die beiden Datumsfelder im Ribbon eintragen, und mit einem daneben liegenden Button  den Bericht mit den angegebenen Werten öffnen. Ich scheitere also daran, den Textfeldern in meinem Ribbon beizubringen, was sie für Textfelder....also die aus tblStammdaten und was selbige zu tun haben.

PhilS

Zitat von: SMBR am Februar 10, 2020, 12:54:04
Und eben diesen Prozess (2 Datumsfelder zum aktualisieren, und den Button selbst) würde ich gerne in mein selbst erstelltes Ribbon integrieren. Wenn ich also einen Bericht öffnen möchte, würde ich die beiden Datumsfelder im Ribbon eintragen, und mit einem daneben liegenden Button  den Bericht mit den angegebenen Werten öffnen. Ich scheitere also daran, den Textfeldern in meinem Ribbon beizubringen, was sie für Textfelder....also die aus tblStammdaten und was selbige zu tun haben.
OK, verstehe ich.
Du musst die eingetragenen Werte aus dem Ribbon speichern und dann den Bericht öffnen. - Was ist das konkrete Problem dabei?

Du hast ja schon die Callback-Procs für OnChange der Textbox-Controls. Bei deren Aufruf solltest du den Wert pro Control speichern; z.B. in einer globalen Variable oder TempVar.

Dann ergänzt du im Ribbon noch einen Button, der bei Click die zuletzt übergebenen Werte der Textboxen in der Tabelle speichert und dann den Bericht öffnet.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

SMBR

hallo PhilS,
die Werte werden bei jedem Aufruf neu geschrieben. Damit dir ein bisschen besser vorstellen kannst was ich genau meine, hab ich eine kleine DummyDatenbank erstellt, mit den wesentlichen Tabellen, Abfragen, Berichten, Formulare und eben das besagte Ribbon. Deswegen hat es leider ein bisschen gedauert. Sorry dafür
Ich sollte noch erwähnen, das ich kein VBA-Profi bin. Ich habe die Textboxen mit dem RibbenCreater 2019 von Gunther Avenius erstellen lassen. Die Callback-Prozeduren bezüglich der Textbox stammen von diesem Programm. Leider kann ich damit nicht wirklich was anfangen, außer dass die beiden Textboxen im Ribbon sind. Mein Problem liegt daran, dass ich keine Ahnung habe, wie ich das umsetzen kann. Könntest du mir das in der Dummy-Datenbank mal demonstrieren, mit welchen Angaben die Callback-Prozeduren "GetTextEditBox ; OnChangeEditBox" zu bestücken sind?

Hondo

Eigentlich ein sehr interessantes Thema.
Habe früher auch viel mit dem Ribbon-Creator von Gunter gearbeitet, kann mich aber ad hoc nicht mehr an Einzelheiten erinnern.
Aber ich sehe mir die DB heute Abend gerne mal an. Was noch fehlt bei den beiden Feldern ist die Funktion der Tab-Taste um ins nächste Feld zu kommen und einen Datepicker zur Datumsauswahl. K.A. ob das möglich ist, aber ich finde es spannend.
Gruß Andreas

Hondo

Also,
hab da mal ein bisschen herumgespielt, ist wirklich schon lange her bei mir mit den Ribbons.
im Modul basRibbonCallbacks solltest du zuerst bei der Sub OnActionBottons folgendes ändern:
Case "btnAktualisieren": refreshForm
Dann die Sub OnChangeEditBox ändern:
Sub OnChangeEditBox(control As IRibbonControl, _
                    strText As String)
    If IsNull(strText) Or strText = vbNullString Then Exit Sub

    Select Case control.id
        Case "ebxvonDatum"
            ribDateFrom = CDate(strText)
        Case "ebxbisDatum"
            ribDateTo = CDate(strText & " 23:59:59")
        Case Else
            'nothing
    End Select
End Sub


Danach ein neues Modul erstellen, z.B: modFunctions nennen mit folgendem Inhalt:
Option Compare Database
Option Explicit

Private m_DateFrom As Date
Private m_DateTo As Date

Public Property Get ribDateFrom() As Date
    ribDateFrom = m_DateFrom
End Property

Public Property Let ribDateFrom(ByVal dValue As Date)
    m_DateFrom = dValue
End Property

Public Property Get ribDateTo() As Date
    ribDateTo = m_DateTo
End Property

Public Property Let ribDateTo(ByVal dValue As Date)
    m_DateTo = dValue
End Property

Public Sub refreshForm()
    Dim rpt As Report
   
    If CurrentProject.AllReports("rptZeiterfassung").IsLoaded = True Then
        Set rpt = Reports("rptZeiterfassung")
        rpt.Filter = "stdztSchichtAnfang >=" & Format(ribDateFrom, "\#yyyy\-mm\-dd hh:mm:ss\#") & " AND stdztSchichtEnde <=" & Format(ribDateTo, "\#yyyy\-mm\-dd hh:mm:ss\#")
        rpt.FilterOn = True
      Else
        DoCmd.OpenReport "rptZeiterfassung", , "stdztSchichtAnfang >=" & Format(ribDateFrom, "\#yyyy\-mm\-dd hh:mm:ss\#") & " AND stdztSchichtEnde <=" & Format(ribDateTo, "\#yyyy\-mm\-dd hh:mm:ss\#")
    End If
    With Reports("rptZeiterfassung")
        .Controls("vonDatum") = Format(ribDateFrom, "dd.mm.YYYY")
        .Controls("bisDatum") = Format(ribDateTo, "dd.mm.YYYY")
    End With
End Sub


Das war es auch schon als erstes. Jetzt kann man die Felder befüllen, auf aktualisieren klicken und der Bericht wird geöffnet und gleich gefiltert. Die Datum von/bis Werte werden auch in den Bericht eingetragen.
Und ist der Bericht bereits geöffnet und die Werte werden im Ribbon geändert ändert sich der Bericht bei Klick auf aktualisieren.

Alles andere wie Tab-Taste, Werte nachträglich aus den Textboxen des Ribbons auslesen etc. müsste man wohl händisch im XML-File machen damit man in dem Callback-Modul die Eventhandler zur Verfügung hat. Sehe mir das vieleicht noch an. Aber ich denke das hilft dir jetzt schon mal weiter.

Gruß Andreas

SMBR

Hallo Andreas,
boa, da hast du bestimmt jede Menge Zeit investiert. Danke dafür schon mal. Ich werde mich Morgen oder heute Nacht  :D mal in die Arbeit machen . Ich glaube nicht dass ich das ohne deine Hilfe so umsetzen hätte können. Ich melde mich :). Noch einen schönen Abend.

SMBR

hallo nochmal,
ich habe mal dran gesetzt und des so umgesetzt wie du geschrieben hast. Es wird ein Filter angewendet wenn ich auf den Button aktualisieren drücke. Jedoch bekomme ich den Laufzeitfehler '2451', das Formular ist entweder falsch geschrieben oder nicht geöffnet......Ich habe die Dummydatenbank aktualisiert. Hängt dieser Nachricht an (DummyNeu). Könntest du bei Gelegnheit nochmal kucken ob ich was vergessen oder verkehrt gemacht habe?
Beste Grüße

Hondo

#9
Dein Fehler ist dass du nicht die Sub OnChangeEditBox() geändert hast, sondern statt dessen die Sub GetTextEditBox()
Korrigieren und nochmals probieren :)

Außerdem musst du im Bericht bei den beiden Textfeldern vonDatum und bisDatum die unsinnige Datenherkunft raus nehmen.

Gruß Andreas

Hondo

Hier mal mein geändertes Beispiel.
Gruß Andreas

SMBR

#11
Alles nochmal zurück. Es funktioniert. Dank deiner wunderbaren Hilfe.  :):):).
Ganz Herzlichen Dank. Abschließend bleibt nur ne Frage offen. Und zwar folgende. Wenn ich jetzt noch einen weiteren anderen Bericht ebenfalls mit dieser Funktion filtern will, wo müssten dort die Ergänzungen gemacht werden? Nochmal herzlichen Dank und schönen Abend.

Hondo

Prozedur refreshForm().
Du kannst ja jeden Bericht den du möchtest dort aufrufen, auch mehrere oder in Auswahl, die Variblen Datumvon und Datumbis sind ja in der Property immer abrufbar.
Andreas

SMBR

okay das habe ich verstanden. Gilt selbiges auch für Formulare. Also kann ich Formulare ebenfalls mit dieser Methode einbinden? Oder gilt das nur speziell für Berichte. Das waren jetzt aber wirlich die letzten Unklarheiten ;)
Stefan