Hallo zusammen...... da ist er wieder ;D
Ich würde gerne nach Auswahl eines KombinationsfeldesA den ausgewählten Wert in KombinationsfeldB (Beide den selben Datenherkunft) nicht mehr anzeigen lassen bzw eine msgbox einblenden wollen. Private Sub Kombinationsfeld313_AfterUpdate()
If Me.KombinationsfeldB = "5000" Then
MsgBox " Auswahl ist 5000, bitte neue Auswahl treffen"
Me.KombinationsfeldB = ""
If Me.KombinationsfeldB = [KombinationsfeldA] Then
MsgBox "Die Auswahl wurde bereits verwendet."
Me.KombinationsfeldB = ""
End If
End If
End Sub
Die erste If - then funktioniert aber wie kann ich den ausgewählten Wert aus KombiA mit dem ausgewählten Wert aus KombiB vergleichen und eine Funktion laufen lassen ?
Gurß Udo
Hallo,
was hat es mit dem festen Wert "5000" auf sich ?
Das ist doch eine Zahl, warum nimmst Du da Az (") ?
Wie hängt das mit dem Kombinationsfeld313 zusammen ?
Außerdem ist das Ereignis "Vor Aktualisierung" wahrscheinlich besser geeignet, denn Nach Aktualisierung ist zu spät, da ist der Wert bereits gespeichert und müsste ggf. wieder gelöscht werden.
Bitte erkläre das Vorhaben mal im Gesamtzusammenhang.
Hallo Klaus.
Die Schnipsel die ich aufgeführt hatte sind nur als Beispiel gedacht.
Hintergrund der Aktion ist folgendes:
Über die Kombinationsfelder kann ich Mitarbeiternamen (aus einer Tabelle) auswählen.
Jeder Tätigkeitsschritt wird von den Arbeitern mit seinem Namen ausgewählt. Es gibt Felder, die zwingend durch zwei Unabhänige Arbeiter geprüft werden müssen, deshalb möchte ich wenn in diesem Feldabschnitt der Arbeiter Meier als erster Prüfer ausgewählt ist dieser nicht nochmal als zweiter Prüfer ausgewählt werden kann.
Hallo,
Du kannst zunächst mal über die beiden Felder einen eindeutigen zusammengesetzten Index legen. Damit ist es dann technisch gar nicht mehr möglich den gleichen Mitarbeiter noch mal zu speichern, das wird von Access aktiv verhindert und kann nicht überlistet werden.
Zusätzlich kannst Du in der Datenherkunft des 2. Kombis den bereits im 1. Kombi vergebenen Namen nicht mehr anzeigen und damit dessen Auswahl verhindern. Das KombiB braucht dann als Kriterium für die MitarbeiterID <>KombifeldA Dein VBA reduziert sich dann auf eine Zeile:
Me.KombifeldB.Requery
Im Ereignis "Bei Fokuserhalt" von KombiB.
Wie sehen denn die beiden Datenherkünfte (SQL) der jetzigen Kombis aus ?
Hallo,
dies http://www.donkarl.com/?FAQ3.16 sollte helfen...
Ich habe eine Tabelle mit den Mitarbeiternamen (MitarbieterID, Vorname und Nachname) Angezeigt werden über Berechnete Felder aus (Vor und Zuname). Nach Auswahl wird das Gebunden Kombifeld gespeichert.
@Klaus: Die Richtung vor Aktualisierung war richtig, msgbox meldet aber das Feld wird nicht leer.Private Sub Kombinationsfeld313_BeforeUpdate()
If Me.KombinationsfeldB = [KombinationsfeldA] Then
MsgBox "Die Auswahl wurde bereits verwendet."
End If
End Sub
Wenn ich nun Private Sub Kombinationsfeld313_BeforeUpdate()
If Me.KombinationsfeldB = [KombinationsfeldA] Then
MsgBox "Die Auswahl wurde bereits verwendet."
Me.KombinationsfeldB =""
End If
End SubMeldung von Access kommt " ...... vor Aktualisierung oder Gültigkeitsregel festgelegt ist, hindert MS Access daran, die Daten im Feld zu speichern" ... Soll es ja auch nicht, stattdessen entweder das Kombifeld wieder aufklappen oder auf ein anderes Feld ein Focus setzen wenn es nicht anders geht.
P.s.: Meldung kommt auch wenn ich direkt versuche den Focus auf ein anders Feld zu setzen
.......
@ Franz... Hallo, danke für den Tip von Donkarls aber ich habe ja nur eine Tabelle mit den Mitarbeiternamen.
Wenn das in einem Datensatz stattfindet, kann weder ein eindeutiger Mehrfachindex, noch die FAQ 3.16 helfen, denn der Index könnte nur unterbinden, dass eine Prüferkombination in mehreren Datensätzen die gleiche ist, was vermutlich nicht der Anforderung entspricht.
Und mit der FAQ 3.16 lässt sich nur etwas prüfen, was auch bereits gespeichert ist.
Eine Gültigkeitsregel in der Tabelleneigenschaft
[FeldA] <> [FeldB] sollte bei zwei Pflichtfeldern zumindest schon einmal das Speichern verhindern. Sind beide Felder nicht obligatorisch, so ist die Prüfung zu erweitern:
([FeldA] <> [FeldB]) Or [FeldA] Is Null Or [FeldB] Is NullAngenommen, es gibt die Tabelle
Mitarbeiter| MitarbeiterId | Vorname | Nachname | | 1 | Hans | Wurst | | 2 | Rainer | Zufall | | 3 | Erika | Schmalz | | 4 | Klaus | Kluge | und eine Tabelle mit den Feldern: id, a und b. Die letzten beiden Felder stellen jeweils einen Fremdschlüssel zur erstgenannten Tabelle dar und werden in einem Formular durch gleichnamige Kombifelder angezeigt. Folgender Code im Formular-Klassenmodul könnte dann der Anforderung genüge leisten. |
Option Compare Database
Option Explicit
Private Const Q1 As String = "SELECT MitarbeiterId, Nachname FROM Mitarbeiter;"
Private Const Q2 As String = "SELECT MitarbeiterId, Nachname FROM Mitarbeiter" & vbLf & _
"WHERE MitarbeiterId <> [@AndereMitarbeiterId];"
Private Sub SetzeMitarbeiterKombi(AktuellerKombiName As String, AndererKombiName As String)
With DBEngine(0)(0).CreateQueryDef(vbNullString)
If IsNull(Me(AndererKombiName)) Then
.SQL = Q1
Set Me(AktuellerKombiName).Recordset = .OpenRecordset(dbOpenSnapshot)
Else
.SQL = Q2
.Parameters(0) = Me(AndererKombiName)
Set Me(AktuellerKombiName).Recordset = .OpenRecordset(dbOpenSnapshot)
End If
End With
End Sub
Private Sub a_GotFocus()
SetzeMitarbeiterKombi "a", "b"
End Sub
Private Sub b_GotFocus()
SetzeMitarbeiterKombi "b", "a"
End Sub
Private Sub Form_Current()
Dim rs As DAO.Recordset
Set rs = DBEngine(0)(0).OpenRecordset(Q1, dbOpenSnapshot)
Set Me.a.Recordset = rs
Set Me.b.Recordset = rs
End Sub
Auch Dir Lachtaube guten Abend und Danke für die Tips. Aber ich habe es doch mit Private Sub KombinationsfeldA_AfterUpdate()
If Me.KombinationsfeldA = Me.KombinationsfeldB Then
MsgBox "Das Gerät MUSS mit einem anderen Kollegen geprüft werden."
Me.KombinationsfeldA = ""
End If
If Me.KombinationsfeldA = "50000" Then
MsgBox "Bitte den richtigen Namen eingeben"
Me.KombinationsfeldA = ""
End If
End Sub hinbekommen.
"5000" ist ein erfundener Name
geschafft. Habe alles vor und zurück getestet und es funktioniert so.
Aber danke nochmal an alle !