Januar 19, 2021, 05:57:13

Neuigkeiten:

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


Textfarbe ändern wenn Bedingung erfüllt

Begonnen von SMBR, Dezember 13, 2020, 18:31:57

⏪ vorheriges - nächstes ⏩

SMBR

Hallo Beisammen,
ich benötige für einen Bericht folgende Funktion:
Wenn eine Bedingung erfüllt ist, bspw. ein Autowert mit der Nummer 1
soll für die betreffende Datensätze die die Referenz ID 1 haben auf die Textfarbe mehrerer Textfelder weiß geändert werden.
Private Sub btnFarbeWeiss_Click()
     If Me.stdztObjekIDRef = 2 Then
        Me.stdztSchichtAnfang.ForeColor = vbWhite
        Me.stdztSchichtEnde.ForeColor = vbWhite
        Me.stdztTagstunden.ForeColor = vbWhite
        Me.stdztNachtstunden.ForeColor = vbWhite
        Me.stdztSonntagsstunden.ForeColor = vbWhite
        Me.stdztFeiertagsstunden.ForeColor = vbWhite
        Me.stdztSonstiges.ForeColor = vbWhite
     End If
End Sub

den Code möchte ich mit dem Button btnFarbeWeiss ausführen.
Irgendwas scheint trotzdem net zu klappen?
Mach ich was falsch?
Schöne Grüße

DF6GL

Hallo,

ein Bericht besitzt in der Seitenansicht keinen Button, allenfalls kann in der Berichtsansicht auf einen solchen geklickt werden.


Eine praktikable Lösung wäre hier die Nutzung der "Bedingten Formatierung" für jedes der betroffenen Felder.

Ausdruck ist :  [stdztObjekIDRef] =1
für Autowert 1 und die Einstellung des gewünschten Formates.

Dein Beispiel zeigt (sinnigerweise?)  den Wert 2


Alternativ wäre der Code im Detailbereich_Format-Ereignis einzusetzen.


SMBR

Zitat von: DF6GL am Dezember 13, 2020, 18:42:42Hallo,

ein Bericht besitzt in der Seitenansicht keinen Button, allenfalls kann in der Berichtsansicht auf einen solchen geklickt werden.


Eine praktikable Lösung wäre hier die Nutzung der "Bedingten Formatierung" für jedes der betroffenen Felder.

Ausdruck ist :  [stdztObjekIDRef] =1
für Autowert 1 und die Einstellung des gewünschten Formates.

Dein Beispiel zeigt (sinnigerweise?)  den Wert 2


Alternativ wäre der Code im Detailbereich_Format-Ereignis einzusetzen.


Ich habe das mal so umgesetzt, aber es tut sich leider nichts. Die Daten mit dem Schlüssel 2 erhaten leider keine neue Farbe. Auch wenn ich es in den bedingten Formatierungen per Hand eingebe, ändert sich ebenfalls nicht? Gibts da noch irgendwo ne Stolperfalle die mein Vorhaben verhindert? Ich möchte das deswegen über VBA regeln, damit das ganze flexibler ist. Ich brauche einmal die Daten mit dem ID-Wert 1 und einmal den ID-Wert 2. Filtern im klassischen Sinn, ist in meinem Fall nicht möglich, da die Daten auf einen Stundenzettel übertragen werden müssen. Filter ich die anderen DS weg, stehen die DS im Ergebnis nicht an der richtigen Stelle. Zum auslösen, würde ich mir eine Schaltfläche für ein benutzerdefiniertes Ribben basteln und die Prozedur zum ausblenden der Datensätze über den Callback OnAction erledigen möchte. Geht das?

DF6GL

Hallo,

ZitatDie Daten mit dem Schlüssel 2 erhaten leider keine neue Farbe

das ist doch klar... der gezeigte Ausdruck greift auch nur für Werte =1

Wenn ein anderer Wert zusätzlich berücksichtigt werden, muss das eben in die Bedingung einfließen:

Ausdruck ist :  [stdztObjekIDRef] =1 or [stdztObjekIDRef] =2


Was und wie willst Du das über einen Ribbon (aus)lösen?



ZitatAlternativ wäre der Code im Detailbereich_Format-Ereignis einzusetzen.



SMBR

Januar 04, 2021, 14:47:56 #4 Letzte Bearbeitung: Januar 04, 2021, 14:55:16 von SMBR
Erst mal ein schönes Neues. Ich bin zur Zeit, nicht zuletzt wegen der andauernden Covid-Krise echt sehr unter Zeitnot. Ich hoffe man sehe es mir nach. Ich habe die Hängepartie mit den Farben ändern per Knopfdruck nochmal verworfen und lediglich einen zweiten identischen Bericht erstellt bei denen ich über die bedingte Formatierung die nicht benötigten Datensätze weiß eingefärbt habe. Viel einfacher. Zu der Frage wie ich das mit den Callbacks aufrufen will hab ich mir das so vorgestellt. In dem Report welcher der Stundenzettel ist, würde ich eine Sub einbauen ungefähr so. Sub FarbeAendern()
    If Me.stdztObjekIDRef = 2 Then
        Me.stdztTagstunden.ForeColor = vbWhite
        'hier weiter Felder
    End If
End Sub
und den Aufruf dann von den Callbacks so     Case "btnFarbeAendern": Report_rptArbeit_StundenzettelGFK.FarbeAendern
Auch wenn ich das Problem nun auf eine andere Weise gelöst habe, müsste sowas doch generell möglich sein eine Prozedur über die Callback so aufzurufen?

DF6GL

Hallo,

was willst Du mit Callback?

Wenn die Textfeld-Farben in einem Bericht in Abhängigkeit eines Feldwertes der angezeigten DS eingestellt werden sollen, dann nutze die Ereignisprozudur für "Beim Formatieren" des Detailbereichs.


"den Code möchte ich mit dem Button btnFarbeWeiss ausführen. "

Wozu??  Das Ereignis ist das oben angesprochene und nicht das Klick-Ereignis eines Buttons, den es sowieso nur in der "Berichts"-Ansicht des Report gibt und nicht in der "Seiten"-Ansicht.

Wenn unbedingt eine Farbauswahl ermöglicht werden soll, dann übergib die Farbe(n) per Openargs-Argument oder per globaler Variable (bzw. TempVars-Auflistung oder Collection).

PhilS

Zitat von: SMBR am Januar 04, 2021, 14:47:56Auch wenn ich das Problem nun auf eine andere Weise gelöst habe, müsste sowas doch generell möglich sein eine Prozedur über die Callback so aufzurufen?
(D)Eine Prozedur aufzurufen sollte schon möglich sein. Allerdings vermute, dass sich am Layout des Berichts in der Druckvorschau nichts mehr ändern lässt, wenn diese erstmal vollständig aufgebaut ist. In der Berichtsansicht könnte das aber funktionieren.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

SMBR

Das mit den OpenArgs-Argument ist eine wirklich gute Idee. Würde trotzdem noch gerne auf deine Frage eingehen, warum manche Felder ausgeblendet bzw durch Farbe "weiß" unsichtbar gemacht werden soll. Dies hat den Grund weil das Ergebnis ein fertiger Stundenzettel ist, für den es ein entsprechendes Formblatt gibt. Ein Wachmann ist in 2 verschiedenen Objekte eingesetzt. Für jedes Objekt an dem er beschäftigt ist, benötigt er einen separaten Stundenzettel. Das Problem besteht nun darin, dass das Formblatt im Detailbereich exakt 31 Spalten hat. Das eine Objekt wegfiltern geht nicht, weil sonst die Spalten nicht mehr stimmen. Sondern die Datensätze ohne Leerzeilen nicht an der Stelle stehen wo sie stehen sollten. Deswegen die Idee, die Datensätze von einem Objekt unsichtbar zu machen und nach dem Drucken entsprechend das andere Objekt. Dazu kommt aber das Problem dass so aber noch lange nicht unten die Gesamtstunden "richtig" zusammen gezählt werden sondern die Stunden beider Objekte. Deswegen der 2te Bericht.  Klar gibts in der Seitenansicht keine Schaltfläche, aber für das Menüband gilt dies ja nicht oder? Aber wie PhilS schon etwas weiter unten eingeworfen hat, ist ein Bericht nachdem er geöffnet wurde nur sehr schwer zu aktualisieren.
Zitat von: DF6GL am Januar 04, 2021, 15:19:38Hallo,

was willst Du mit Callback?

Wenn die Textfeld-Farben in einem Bericht in Abhängigkeit eines Feldwertes der angezeigten DS eingestellt werden sollen, dann nutze die Ereignisprozudur für "Beim Formatieren" des Detailbereichs.


"den Code möchte ich mit dem Button btnFarbeWeiss ausführen. "

Wozu??  Das Ereignis ist das oben angesprochene und nicht das Klick-Ereignis eines Buttons, den es sowieso nur in der "Berichts"-Ansicht des Report gibt und nicht in der "Seiten"-Ansicht.

Wenn unbedingt eine Farbauswahl ermöglicht werden soll, dann übergib die Farbe(n) per Openargs-Argument oder per globaler Variable (bzw. TempVars-Auflistung oder Collection).


DF6GL

Hallo,

ich denke mal, da ist noch am Konzept zu feilen..



Zitat...dass das Formblatt im Detailbereich exakt 31 Spalten hat

hierzu könnte https://www.ms-office-forum.net/forum/showthread.php?t=298414 helfen.


SMBR

Zitat von: DF6GL am Januar 05, 2021, 21:46:43Hallo,

ich denke mal, da ist noch am Konzept zu feilen..



Zitat...dass das Formblatt im Detailbereich exakt 31 Spalten hat

hierzu könnte https://www.ms-office-forum.net/forum/showthread.php?t=298414 helfen.

Hallo,
ja, ich habe zu diesem Problem schon mal einen Beitrag erstellt, wegen genau eben diesem Thema. Ich hab dieses auch schon vor einiger Zeit versucht, umzusetzen. Was mir bis vor kurzem aber leider nicht gelang. Es ist mir zwar gelungen, das Ergebnis so darzustellen wie ich es brauche, offen bleibt aber noch eine Kleinigkeit.
Ich habe zunächst die Kalendertabelle erstellt und mit den Datums (Daten?!?!) bis einschließlich des letzten Tages in diesem Jahr. Die Tabelle habe ich dann in ner Abfrage für den Stundenzettel hinzugefügt und mit mit meiner Tabelle für den Stundenzettel in Beziehung gesetzt. Diese als Verknüpfung mit einem Outer-Join. Auf den Bildern habe ich das mal versucht darzustellen. Das gleiche Problem hatte ich nämlich auch beim letzten Mal. Wenn ich jetzt das Datum aus der Kalendertabelle mit dem Original-Feld stdztSchichtAnfang verknüpfe funktioniert es nicht. Meine Vermutung ist das Datumsformat. Denn in der Kalendertabelle ist das Datumsformat Datum kurz und mein Feld "stdztSchichtAnfang" ist in dem Format "tt.mm.jj hh:nn". Es hat erst funktioniert, nachdem ich in der Tabelle tblArbeit_Stundenzettel ein zusätzliches Feld hinzugefügt habe, dass das gleiche Datumsformat besitzt wie die Kalendertabelle. Ich habe zwar auch schon versucht mit der "Format-Funktion" mein Datum aufzuspalten und so formatiert dass nur das Datum angezeigt wird, dies brachte aber keine Veränderung. Da das zusätzliche Feld eigentlich gegen die Normalform verstößt wäre ich schon froh wenn ich das so hinbekommen kann dass es auch mit meinem richtigen Feld stdztSchichtAnfang funktioniert. Warum geht das so nicht? Woran kann das liegen?
 

DF6GL

Hallo,

habe jetzt Dein genaues Problem nicht (mehr) im Blick..

Allgemein:  Du kannst nur Felder mit dem selben Datentyp verknüfen, also nicht eine Tageszahl (bzw. Tagesname) mit einem Datumsfeld, das ein gültiges Datum enthält (Double).

Füge also in die Kalendertabelle ein Datumsfeld ein, das alle Daten im interessierenden Zeitbereich enthält. Daneben dann die Jahres- und Wochen-Tageszahl, die Monatszahl und die jeweiligen Namen (Tagesname, Monatsname).


Verknüpfe dann das Datum aus dieser Tabelle mit dem Datum der anderen.


SMBR

Januar 12, 2021, 22:29:53 #11 Letzte Bearbeitung: Januar 12, 2021, 22:48:24 von SMBR
HI, in der Kalendertabelle habe ich ein Datumsfeld im Format "tt.mm.jjjj".
in meiner Tabelle um die es geht habe ich auch ein Datumsfeld. Dieses ist jedoch im Format "tt.mm.jjjj hh:nn".
Wenn ich das Datumfeld der Kalendertabelle [KTag] mit dem oben genannten Datumsfeld [tblArbeit_Stundenzettel.stdztSchichtAnfang] verknüpfe funktioniert die Sache nicht. Nun hab ich versuchsweise ein zusätzliches Datumsfeld [Filterdatum] in der tblArbeit_Stundenzettel eingefügt und mit dem Feld in der Kalendertabelle [KTag] verknüpft. Da gehts. Ich würde aber natürlich gerne auf Redundante Daten verzichten. Ich habe die Angaben ja schon in dem anderen Feld. Liegt es daran dass das Feld in der Kalendertabelle ein anderes Format hat als in der verknüpften Tabelle. Obwohl es nur ein anderes Format ist. An dem eigentlichen Datum oder an der eigentlichen Zahl die dahinter steckt, dürfte es aber dennoch nichts ändern?



Zitat von: DF6GL am Januar 12, 2021, 19:49:24Hallo,

habe jetzt Dein genaues Problem nicht (mehr) im Blick..

Allgemein:  Du kannst nur Felder mit dem selben Datentyp verknüfen, also nicht eine Tageszahl (bzw. Tagesname) mit einem Datumsfeld, das ein gültiges Datum enthält (Double).

Füge also in die Kalendertabelle ein Datumsfeld ein, das alle Daten im interessierenden Zeitbereich enthält. Daneben dann die Jahres- und Wochen-Tageszahl, die Monatszahl und die jeweiligen Namen (Tagesname, Monatsname).


Verknüpfe dann das Datum aus dieser Tabelle mit dem Datum der anderen.



MzKlMu

Hallo,
das "tt.mm.jjjj hh:nn" ist mit Uhrzeit.
Formatiere das Feld "stdztSchichtAnfang" auch mal so (mit der Zeit) und schaue dann was zu sehen ist.

Der Datentyp Datum/Uhrzeit ist im Hintergrund eine Zahl des Typs Double, das ist eine Fließkommazahl, die für Verknüpfungen ungeeignet ist.
Du musst sicherstellen, dass in beiden Datumsfeldern kein Zeitanteil enthalten ist, dann ist es das reine Datum als ganze Zahl, dann müsste es klappen.
Gruß
Klaus

SMBR

Hi,
ja sowas in der Art habe ich mir auch gedacht. Das doofe ist nur, dass ich das Feld stdztSchichtAnfang ungern aufteilen würde. Deswegen habe ich mal versucht die Tabelle tblArbeitStundenzettel in meiner Abfrage durch eine Abfrage ersetzt die Diese Tabelle als Datengrundlage hat. Dort habe ich wie in dem Bild unten zu sehen ist, das feld stdztSchichtAnfang mit der Formatfunktion in ein Datum ohne Zeit "darstellt". und... was soll ich sagen so gehts nicht. Wird das Datum mit dieser Methode nur anders angezeigt, ist aber intern nach wie vor noch die gleiche Zahl wie vor dem Formatieren? Umgekehrt habe ich es auch schon versucht. Indem ich in der Haupttabelle das Feld stdztSchichtAnfang in einem berechneten Feld in das entsprechende Format umgewandelt habe. und... negativ... Nur wenn ich das Feld von vorne herein in dem Format abspeichere funktioniert es.

Hab ich noch wo nen Fehler drin?

DF6GL

Hallo,



Klaus hat es doch deutlich gemacht:   Ein Format ist etwas Schönes zum Anzeigen auf dem Monitor und ändert nichts am Wert des Feldes. Es hat nichts mit einem Datentyp eines Tabellenfeldes zu tun. 


Der DatenTyp "Datum/Uhrzeit" besteht aus einer (und bleibt bestehen als eine) Double-Zahl.  Dabei bedeuten die Vorziffern die Anzahl Tage seit 31.12.1899 und die Nachkommaziffern die Uhrzeit (des Tages).

Ein reines Datum (also ohne Uhrzeit)  hat "0" als Nachziffer, soll heißen, keine Nachziffer(n).

Vergiss das "Format" der Datumswerte und konzentriere Dich auf die Datentypen, wenn mathematische Berechnungen auszuführen sind.