Neuigkeiten:

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

Mobiles Hauptmenü

Endlosformular Feld in Abhängigkeit von einem anderen Feld sperren

Begonnen von jaderbass, Oktober 06, 2016, 22:33:34

⏪ vorheriges - nächstes ⏩

jaderbass

Liebe Gemeinde,

ich habe folgendes Problem:
In einem Endlosformular (kein UF) werden Datensätze aus zwei Tabellen ausgegeben. Wenn nun in einem Feld (bei mir heißt dies JoKlasID_F) bestimmte IDs stehen soll ein anderes Feld (hier Betrag) gesperrt werden. Folgendes habe ich bereits getan:

Private Sub Form_Load()
   
    Dim rcs As DAO.Recordset
    Set rcs = Me.RecordsetClone
    rcs.MoveFirst
    Do Until rcs.EOF
        Dim dblLstb As Double
        If Not IsNull(rcs!LStB) Then
            dblLstb = rcs!LStB
        Else
            dblLstb = 0#
        End If
        Me!Betrag = dblLstb
        If Me!JoKlasID_F = 1 Or Me!JoKlasID_F = 2 Or Me!JoKlasID_F = 3 Or Me!JoKlasID_F = 4 Or Me!JoKlasID_F = 5 Or Me!JoKlasID_F = 6 Then
            Me!MM = True
        End If
       
        ' Dies hier macht Probleme:
        If Me!JoKlasID_F = 4 Or Me!JoKlasID_F = 5 Or Me!JoKlasID_F = 6 Then
            Me!Betrag = 0#
            Me!Betrag.Locked = True
        Else
            Me!Betrag.Locked = False
        End If
        rcs.MoveNext
        If Not Me.NewRecord Then
            DoCmd.GoToRecord , , acNext
        End If
    Loop
    rcs.Close
    Set rcs = Nothing
   
End Sub


Problematisch ist die von mir gekennzeichnete Stelle. Hier ist es so dass entweder alle Betrag-Felder im Endlos-Formular gesperrt sind, und zwar dann wenn der letzte Datensatz eine JoKlasID_F liefert die in dem zu prüfenden Bereich zwischen 4 und 6 liegt. Ist im letzten Datensatz nicht dieser JoKlasID_F-Bereich vorhanden sind alle Betrags-Felder beschreibbar.

Wo liegt denn hier der Fehler? Es soll doch immer nur das Betrags-Feld des DS gesperrt sein in welchem die JoKlasID_F den genannten Bereich liefert.

Komischerweise klappt das bei der If-Else Konstruktion die darüber liegt mit dem Kontroll-Feld (Me!MM). Die werden je nach gelieferter JoKlasID_F aktiviert bzw. deaktiviert.

Danke für Eure Hilfe
Jörg

MaggieMay

#1
Hallo,

es macht keinen Sinn, bereits im Load-Ereignis derartige Aktionen auszuführen.
Das muss datensatzbezogen gemacht werden, ist also im Formularereignis
"Beim Anzeigen" besser angebracht.

PS:
In einem (auch Endlos-) Formular gibt es jedes Steuerelement nur einmal.
Es macht daher keinen Sinn, ihm in einer Loop wechselnde Eigenschaften
in Abhängigkeit zum möglichen Dateninhalt zuzuordnen.
Freundliche Grüße
MaggieMay

Xoar

Jo so ging es mir auch mal.
Willst Du nur ein Steuerelement sperren, ist das
sozussgen von Access vorgegauckelt im Endlosformular.

Jede Zeile stellt ja ein Datensatz dar, da man durch "beim anzeigen" ja immer ein Ereignis auslöst, sobald man die Zeile wechselt, wird im deinem Fall geprüft ob das Steuerelement gesperrt ist, oder nicht.

Allerdings ist dann in jedem Datensatz, also Zeile das Steuerelement gesperrt, das merkt man nur nicht, da man ja beim wechsel in einen anderen Datensatz, wieder die Prüfung auf Sperrung startet.

Willst Du was farblich darstellen, welcher DS gesperrt ist und welcher nicht, geht das nur mit der bedingten Formatierung.

Grüße

jaderbass

Hallo,

danke erst einmal für die Antworten. Wenn ich Euch richtig verstanden habe sollte ich die Zuweisungen in Abhängigkeit des JoKlasID_F-Feldes in dem Ereignis "Beim Anzeigen" unterbringen (ohne Loop) weil dieses Ereignis bei jedem Datensatz der im Endlosformular angezeigt wird aufgerufen wird. Richtig?

Dann wird mir einiges klar. Ich hatte die Codeschnipsel aus einigen Forums-Beiträgen und dort hieß es immer im Loop. Naja. Wieder etwas dazugelernt.

Jörg

Xoar

Jo, sobald Du einen Datensatz anwählst, wird "beim anzeigen" Ereignisprocedure ausgelöst. In dieser sperrst Du das Steuerelement anhand der Abhängigkeit

jaderbass

Guten Morgen,

der Stand ist nun folgender: Ich habe den Loop in die Ereignisprozedur "Beim Anzeigen ausgelagert.

Private Sub Form_Current()
        Dim dblLstb As Double
        If Not IsNull(Me!LStB) Then
            dblLstb = Me!LStB
        Else
            dblLstb = 0#
        End If
        Me!Betrag = dblLstb
        If Me!JoKlasID_F = 1 Or Me!JoKlasID_F = 2 Or Me!JoKlasID_F = 3 Or Me!JoKlasID_F = 4 Or Me!JoKlasID_F = 5 Or Me!JoKlasID_F = 6 Then
            Me!MM = True
        End If
       
        ' Dies hier macht Probleme:
        If Me!JoKlasID_F = 4 Or Me!JoKlasID_F = 5 Or Me!JoKlasID_F = 6 Then
            Me!Betrag = 0#
            Me!Betrag.Locked = True
        Else
            Me!Betrag.Locked = False
        End If
End Sub


Dies bewirkt allerdings auch nur, dass entweder alle oder gar kein Feld gesperrt ist. Ich gehe mal davon aus, dass diese Eigenschaft in einem Endlosformular nicht für die einzelnen Datensätze sondern nur "global" im Formular gesetzt werden können. Ich habe mal für einen Test im Loop der "Form_Load"-Prozedur (Siehe mein erster Post) anstatt "Me!Betrag.Locked = True" ein "Me!Betrag = 999.99" eingesetzt. Hier wurden korrekterweise nur die Betrag-Felder der Datensätze auf diesen Wert gesetzt bei denen die JoKlasID_F gleich 4, 5 oder 6 ist.

Somit muss ich mir für das Sperren des Betrag-Feldes etwas anderes einfallen lassen.

Jörg

jaderbass

Oh Mann. Ich mache mir hier Gedanken wegen der Sperrung und hantiere mit VBA-Code und das Ding geht einfach über die Bedingte Formatierung  :o

Also Dank an alle Helfer für die Denkanstöße.

Xoar

Ja mit der bedingten Formatierung geht das komplette deaktivieren.

Ich habe es bei mir so gemacht, dass ich je nach Status des Sperrfeldes (1 oder 0) jedes einzelnen Datensatzes, das Eingabefeld die Bearbeitungsmöglichkeit gesperrt habe.


Steuerelement.locked = true
Bzw. = false

. Das Steuerelement sieht also gleich aus, aber man kann keine Eingaben machen, zusätzlich über die bedingten Formatierung ein Textfeld rot, oder grün gefärbt.

Aber das ist ja je nach Anwendung und dem eigenen Geschmack, anpassbar