Neuigkeiten:

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

Mobiles Hauptmenü

Textfeld in der Tabellenansicht sperren, wenn unsichtbar

Begonnen von AccessNewbieNoob, Juni 11, 2024, 07:07:54

⏪ vorheriges - nächstes ⏩

AccessNewbieNoob

Hallo zusammen!

Ich habe da mal wieder ein (für mich) unlösbares Problem:

Ein Formular, welches oben die Datenfelder anzeigt und unten die gesamte Tabelle.
Jetzt habe ich eine Funktion eingebaut, die bestimmte Felder unsichtbar macht, wenn diese für den aktiven Datensatz nicht gebraucht werden.
Aber da kommt das Problem:
Ich befinde mich in einem Datensatz, der die unsichtbaren Felder hat. Also werden diese angezeigt.
Jemand aktualisiert ein "unsichtbar"-Feld und klickt dann unten in der Tabellenansicht auf einen anderen Datensatz. Dummerweise klickt diese Person genau auf ein Feld, welches beim Anzeigen dieser Person ausgeblendet werden soll.
Ergo: Debuff-Meldung "Feld darf nicht den Fokus haben" (Verstehe ich).

Jetzt aber die Frage: Wie kann ich verhindern, dass jemand nach dem aktualisieren eines Feldes (das geht nur in der oberen Formular-Ansicht) in der Tabellenansicht auf ein Feld klickt, welches im kommenden Schritt ausgeblendet werden soll?

Dass das Textfeld in der Tabellenansicht sichtbar ist, ist kein Problem. Es soll nur in der oberen Formularansicht ausgeblendet sein um den aktuellen DS übersichtlicher zu machen.
~Joe~

Starr mich nicht so an, ich bin auch nur eine Signatur.

Josef P.

Hallo!

Mittlerweile kann man in Access das Steuerelement zuerst auf Enabled = False setzen, dann kann es ausgeblendet werden - auch wenn es den Fokus hatte.

Hilfsprozedur:
Public Sub HideControl(ByVal ControlToHide As Control)
 
  Dim EnableCtl As Boolean
 
  With ControlToHide
    If .Enabled Then
      EnableCtl = True
      .Enabled = False
    End If
    .Visible = False
    If EnableCtl Then
      .Enabled = True
    End If
  End With
 
End Sub

In älteren Access-Versionen musste man zuerst den Fokus mit SetFocus auf ein anderes Steuerelement legen.

Gruß
Josef

AccessNewbieNoob

Hallo Josef!

Zuerst mal vielen Dank für deine Hilfe.

Ich verstehe den Code aber noch nicht so ganz:

Es werden beim Eintrag "Peter Müller" z.B. das Feld "Kunst", "Französisch", und "Literatur" (alles einfache Textfelder mit Datum) für den aktuellen DS benötigt, das wird über ein KK-Feld Namens "Anzeigen" gesteuert, welches bei ihm aktiviert ist.  - Jetzt wird in "Literatur" das Datum aktualisiert. Direkt danach klicke ich unten in der Tabellenansicht bei einem anderen Teilnehmer der diese Felder nicht braucht auf das Feld "Kunst" (hier ist das Feld "Anzeigen" nicht aktiviert). Somit kommt es zu dem Debugging.

Der Code von dir ist Public, also eine Funktion für alle.
Muss ich jetzt also den Aufruf des Codes (HideControl) bei den entsprechenden Feldern in den Fokuserhalt setzen, oder wo sollte der hin?
Hier ist der Code für das Anzeigen:

Private Sub Form_Current()

If Me!Anzeigen = True Then
Me!Kunst.Visible = True
Me!Französisch.Visible = True
Me!Literatur.Visible = True
Else
Me!Kunst.Visible = False
Me!Französisch.Visible = False
Me!Literatur.Visible = False
End If

Wie müsste ich jetzt deinen Code abändern, um zuerst abzufragen, ob ausgeblendet werden soll oder nicht?

Einfach: ".Visible = False" in "If Me!Anzeigen = False Then .Visible = False" ändern?

~Joe~

Starr mich nicht so an, ich bin auch nur eine Signatur.

Josef P.

#3
z. B.:
If Me!Anzeigen = True Then
   Me!Kunst.Visible = True
   Me!Französisch.Visible = True
   Me!Literatur.Visible = True
Else
   HideControl Me!Kunst
   HideControl Me!Französisch
   HideControl Me!Literatur
End If
Das "gesicherte" Ausblenden übernimmt dann die Funktion von #1.

Anm.:
Optisch könnte auch ein inaktiv Schalten statt Ausblenden für den User übersichtlicher sein.
Dann verschwinden die Steuerelemente nicht, es ist aber trotzdem klar, dass diese nicht verwendbar sind.

Gruß
Josef

AccessNewbieNoob

Ganz vielen Dank!

Es funktioniert, also werde ich es so lassen.

Aber da du das erwähnt hast:
Angenommen, ich würde die betroffenen Felder inaktiv schalten:
würde z.B. bei Me!Kunst.Enabled = False nicht der selbe Fehler auftauchen? - Wenn auch hier gerade das Feld "aktiv" ist (weil jemand da hingeklickt hat), dann müsste ja vba das aktivierte Feld mit aktuellem Fokus inaktiv setzen?
~Joe~

Starr mich nicht so an, ich bin auch nur eine Signatur.

MzKlMu

Hallo,
solche Aktionen sind oftmals ein Hinweis auf ein suboptimales Datenmodel.
Solche Zusammenhänge sollte man versuchen über die Beziehungen zu gestalten, damit man diese sichtbar/unsichtbar Schaltungen gar nicht erst braucht.

Kannst du bitte mal ein Bild des Beziehungsfensters hier zeigen?
Gruß Klaus

Josef P.

Zitatwürde z.B. bei Me!Kunst.Enabled = False nicht der selbe Fehler auftauchen? - Wenn auch hier gerade das Feld "aktiv" ist (weil jemand da hingeklickt hat)
Enabled = False ist ab Access Version "keine Ahnung" (bei 365 auf jeden Fall) auch möglich, wenn das Steuerelement den Fokus hat.
Genau das nutze ich in in der Prozedur HideControl aus, um das Steuerelement unsichtbar zu machen.

AccessNewbieNoob

Jetzt habe ich es verstanden, Danke Josef P.

@MzKlMu In dem Formular existiert nur eine einzige Beziehung, die sich aber auf ein anderes Feld bezieht. Das Formular zeigt lediglich eine Person an, die bestimmte Schulungen absolviert hat.
Darum habe ich einfach alles in eine Tabelle gelegt.
Klar könnte ich alle Schulungen über Auswahlfelder eintragen, aber das entscheidende in dem Formular ist lediglich ob und wann die Leute ihre Schulung gemacht haben.
Das Ausblenden von einigen Feldern ist lediglich eine extra-Funktion um bei Personen, die diese Schulungen nicht brauchen diese auch nicht anzuzeigen.
~Joe~

Starr mich nicht so an, ich bin auch nur eine Signatur.

MzKlMu

#8
Hallo,
das ist alles viel einfacher wenn Du eine n:m Beziehung anlegst. Dazu wird eine Tabelle benötigt mit allen Schulungen.
Und eine weitee Tabelle in der nur die für eine Person zutreffenden Schulungen erfasst werden, per Kombifeld.

In einer weiteren Tabelle erfasst Du erfolgte Schulungen. Durch die n:m Tabelle werden zum Eintragen des Datums nur die zutreffenden Personen ausgewählt (automatisch)
Es sind somit automatisch nur die Schulungen zu sehen, die für eine Person zutreffend sind. Die sichtbar/unsichtbar Schaltungen entfallen ersatzlos.

Du solltest über den Aufbau noch mal nachdenken.

PS:
ZitatIn dem Formular existiert nur eine einzige Beziehung, die sich aber auf ein anderes Feld bezieht.
Ein Formular hat keine Beziehungen, das sind Verknüpfungen. Beziehungen sind ein Datenbankobjekt und werden im Beziehungsfenster angelegt. Und nur im Beziehungsfenster gibt es Beziehungen. Auch in Abfragen sind das Verknüpfungen.

Daher noch mal die Bitte das Beziehungsfenster mal als Bild hier zu zeigen. Du hast ja hoffentlich Beziehungen angelegt.

Im Anhang mal ein Bild der Beziehungen einer Beispieldb für Kurse.

Übersetzung:
tblKurse => Schulungen
tblSchüler => Personen
tblSchülerKurse => PersonenSchulungen (n:m Tabelle)
tblTeilnahmen => Teilnahmen (kann so beibehalten werden)
Gruß Klaus

AccessNewbieNoob

Hallo KLaus,

um das verständlich zu machen muss ich mehr in die Tiefe gehen:
Das Original in dem ich die Funktion anwende ist eine Tabelle, in der Mitarbeiter verschiedene Schulungen absolviert haben, oder auch nicht. Wichtig ist, dass die Schulungen eine "begrenzte Haltbarkeit" haben, also nach verschiedenen Intervallen wiederholt werden müssen.

Je nach Qualifikation haben also unterschiedliche Mitarbeiter auch unterschiedliche Schulungen, in meinem Fall gibt es aber nur 2 verschiedene Gruppen (also Gruppe 1 hat z.B. 13 Schulungsthemen und Gruppe 2 hat ebenfalls die 13 PLUS 7 spezielle Schulungsthemen).
Es kann natürlich auch passieren, dass ein Mitarbeiter irgendwann einmal aufsteigt und dann von der Gruppe 1 in die 2 aufsteigt, welche dann wieder ihre speziellen Verfallsdatums haben.
Ergo habe ich eine Tabelle erstellt, in der der Primärschlüssel beim Mitarbeiter liegt und alle möglichen Schulungen als Datumsfelder hinterlegt sind.
Jetzt blende ich im Formular einfach den Part aus, der für den Kollegen unzutreffend ist (über ein einfaches KK-Feld) und markiere über bedingte Formatierung die Daten (Datum), die demnächst fällig oder überschritten sind.
Sollte jetzt der MA irgendwann einmal "aufsteigen", dann wird auch bei ihm das KK-Feld aktiviert und die bisher unnötigen Schulungen werden eingeblendet und können verwendet werden.
Was die Beziehung angeht: Es gibt tatsächlich eine Beziehung, allerdings ist diese zwischen der Haupttabelle (also der Person) und ihrem Einsatzort. Diese Orte sind oft bei mehreren Mitarbeitern gleich, darum habe ich dafür eine Beziehung aufgebaut. Hier tue ich mir aber jedes mal extrem schwer, weil ich scheinbar nicht verstehe welche Art ich wann verwenden muss. Scheinbar habe ich eine 1:n - Verbindung vom Ort zu der Person (Der Ort steht nur 1 mal in der Ort-Tabelle und kann dann aber bei vielen Personen eingesetzt werden).

Da die Tabelle in unserer Firma genutzt wird möchte ich das original ungerne hier abbilden, ich bitte um Verständnis.
~Joe~

Starr mich nicht so an, ich bin auch nur eine Signatur.

MzKlMu

Hallo,
auch nach deinen weiteren Erläuterungen bleibe ich bei meinem Vorschlag. Dieses Felder ein/ausblenden ist fast immer ein Hinweis auf ein falsches Datenmodell. Ich denke, Du hast auch zu wenige Tabellen, solche Abhängigkeiten sollten immer über n:m Zuordnungstabellen abgebildet werden, wie in meinem Bild in #8 zu sehen.
Auch sollten unbedingt vollständige Beziehungen angelegt werden. Und Beziehungen sollte man auch verstehen.

Zitatallerdings ist diese zwischen der Haupttabelle (also der Person) und ihrem Einsatzort.
Das dürfte mit Sicherheit falsch sein. In der Haupttabelle (Person) darf es keine Beziehung zum Einsatzort geben. Du brauchst für die Einsätze eine extra Tabelle mit einem Fremdschlüssel zur einer Einsatztabelle und einem Fremdschlüssel zur Person, das wäre dann eine n:m Beziehung.
ZitatDa die Tabelle in unserer Firma genutzt wird möchte ich das original ungerne hier abbilden, ich bitte um Verständnis.
Ich brauche da kein Verständnis, es ist ja Dein Problem.
Und für das Forum kann man eine Beispieldb anlegen, mit anonymen Daten die man dann auch hier zeigen kann.
Im übrigen sollte man aus Tabellen und Feldnamen (wie im Beziehungsbild) nicht auf deren Inhalte schließen können, von daher sollte rein im Beziehungsbild nichts stehen das auf die Firma oder deren Aufgabe schließen lässt.
Eine Datenbank ohne vollständig angelegte Beziehungen ist ungeeignet.
Gruß Klaus

AccessNewbieNoob

Hallo Klaus,

ich habe eine DB nach dem Muster der Kurse erstellt um das mal auszuprobieren.
Sie dürfen in diesem Board keine Dateianhänge sehen.

In der- Tabellenansicht sieht das dann so aus:

Sie dürfen in diesem Board keine Dateianhänge sehen.

Jetzt kommt mir aber bereits eine Frage auf:
  • Es kann ja eigentlich nicht sein, dass der Kurs am 17.06.2024 stattgefunden hat, der MA aber schon am 07.06.2024 teilgenommen hat.
  • Wenn jetzt ein anderer Erste Hilfe Kurs an einem anderen Datum stattgefunden hat, muss man den dann als extra-Eintrag aufführen?

Das wäre ja kontraproduktiv, weil dann würden ja irgendwann haufenweise gleiche Einträge nur mit unterschiedlichen Datums auftauchen...

Genau deswegen umgehe ich solche Situationen wenn irgendwie möglich. Ich bin einfach zu bekloppt dazu um das sinnvoll umzusetzen.
~Joe~

Starr mich nicht so an, ich bin auch nur eine Signatur.

MzKlMu

#12
Hallo,
aber mein Beispiel ist nicht ganz geeignet für Dich. Ich habe da zu schnell geantwortet. Es sollte ja auch nur das Prinzip zeigen, sorry.

Zu dem Datumsproblem:
Wenn es ein Kursdatum gibt, so braucht es kein Feld "Teilgenommen_am", das Datum steht ja schon beim Kurs.
Wenn er am Kurs teilgenommen hat, so kann es nur am dem Kursdatum sein.

Ich mache Dir heute Nachmittag ein neueres besseres Beispiel. Etwas Geduld bitte.

Noch eine Frage: Wer hält die Kurse (Dozent) ? Eigene Mitarbeiter oder externe ?


Noch ein Hinweis:
So wie das aussieht, hast Du Nachschlagefelder in den Tabellen benutzt. Das solltest Du unbedingt wieder ändern. Nachschlagefelder haben in Tabellen nichts zu suchen. Die sollten nur in Formularen (und nur dort) als Kombinationsfelder zum Einsatz kommen. Die erfüllen in Formularen die gleiche Funktionalität.
Gruß Klaus

AccessNewbieNoob

Hallo Klaus,

lass dir Zeit, es eilt überhaupt nicht.

Zu den Dozenten: Die können beides sein, je nach Schulung (Erste Hilfe z.B. macht oft das DRK, Brandschutz eine Feuerwehr, aber andere Schulungen machen eigene Dozenten).

In den Tabellen sind keine Nachschlagefelder:
Sie dürfen in diesem Board keine Dateianhänge sehen.

Das würde ich nur in Formularen benutzen.
~Joe~

Starr mich nicht so an, ich bin auch nur eine Signatur.