Neuigkeiten:

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

Mobiles Hauptmenü

Pflichtfeld in abhängigkeit von Eintrag in anderem Feld

Begonnen von Sandra80, Januar 30, 2012, 16:52:11

⏪ vorheriges - nächstes ⏩

Sandra80

Hallo,

mache gerade eine Datenbank für die Arbeit. Habe folgendes Problem im Formular:
Wenn in dem Feld "Zugang Anzahl" eine Zahl eingetragen wird dann soll das Feld "Grund Zugang" zu einem Pflichtfeld werden.
Wenn nichts in dem Feld "Zugang Anzahl" steht soll das Feld "Grund Zugang" leer bleiben.

Das gleiche gibt es nochmal mit "Abgang Anzahl" und "Grund Abgang".

Jetzt kommt noch die nächste Hürde. Es muss immer eins der beiden Felder "Zugang Anzahl" oder "Abgang Anzahl" ausgefüllt sein.

Ich bin leider nicht so fit im Access. Deshalb bitte eine Hilfe für Dummis. Und schon mal vielen Dank für eure Mühe.

MzKlMu

#1
Hallo,
ich würde die Anzahlen in einem Feld führen. Zugang postiv und Abgang negativ. Das Vorzeichen kannst Du automatisch steuern mit einer Optionsgruppe, für Zugang den Wert 1 und für den Abgang den Wert -1.
Die Anzahl, den Grund (auch nur ein Feld) und das Feld für die Optionsgruppe machst Du einfach zu einem Pflichtfeld. Du brauchst keine weitere Prüfung. Und den Bestand zu rechnen ist ein Klacks, ist einfach die Summe der Anzahlen, gruppiert über den Artikel.
Gleichzeitig reduzierst Du die Tabelle um 2 Felder.
Gruß Klaus

database

Hallo,

ungeachtet der durchaus richtigen Empfehlung von Klaus wäre auch folgendes möglich:

das Ereignis 'BeforeUpdate' des Formulars KÖNNTE dazu verwendet werden die Kombination der erwarteten Einträge zu prüfen.
Bei Abweichung von der Vorgabe kann eine Fehlermeldung erzeugt und per MsgBox ausgegeben werden.
Der Vorgang der Datenaktualisierung wird dann durch 'Cancel = True' unterbrochen und zur Berichtigung des Fehlers ins entsprechende Feld gesprungen (z.B. Me![GrundZugang].setFocus)

Unterlasse bitte bei Feldnamen Leerzeichen zu verwenden.

Sandra80

Vielen Dank für die schnellen Antworten.
Ich hätte noch eine Bitte an den Peter.
Kannst du mir bitte noch sagen wie ich die Ereignisprozedur genau eingeben muss, damit geprüft wird
wenn in einem bestimmten Feld was steht, dass dan das andere ein Pflichtfeld ist und das dann auch geprüft wird
ob in diesem Pflichtfeld was steht.
Da wäre mir sehr geholfen.

Und das mit den Leerzeichen bei den Feldnamen habe ich schon geändert.

Lg
Sandra

DF6GL

#4
Hallo,

auch wenn ich nicht der Peter bin,     ;)   etwa so:

Sub Form_BeforeUpdate(Cancel as Integer)

If  not Isnull (Me!AbgangAnzahl) and Isnull(Me!GrundAbgang) then
 Msgbox "da stimmt doch was nicht.."
 Cancel=true
  Me!GrundAbgang.Setfocus
End If

End Sub




Ich empfehle Dir auch, nur EIN Feld für die Menge zu benutzen...

Sandra80

Danke für die schnelle Antwort.
Funktioniert auch schon fast. Aber irgendwas mache ich noch falsch.
Das Formular ist ein Pop Up Formular. Wenn ich das Formular schließe kommt die Meldung "Achtung! Feld Grund nicht ausgefüllt."
Aber dann komme ich nicht mehr ins Formular, damit ich dieses Feld noch befüllen kann sondern folgender Fehler:
Laufzeitfehler 438. Objekt unterstützt diese Eigenschaft oder Methonde nicht.
An was liegt den das?

Lg
Sandra

DF6GL

Hallo,

zeig mal den Code, den Du benutzt....


Auch wenn Du das Form schliesst und den Eingabe nicht korrigiert hast, wird das Before-Update-Ereignis ausgeführt....

Drück vorher (bevor Du das Form schliesst) ein oder mehrmals die Esc-Taste, damit die Eingaben (Änderungen) angebrochen werden.




Sandra80

Hallo,

der Code schaut so aus:

Private Sub Form_BeforeUpdate(Cancel As Integer)

If Not IsNull(Me!Zugang) And IsNull(Me!ZugangText) Then
MsgBox "Bitte Grund eintragen!"
Cancel = True
Me!ZugangText.SetFocus
End If
End Sub

Könnte es dann damit zusammenhängen das ich einen Button habe zum verlassen des Formulars bei dem ein Makro hinterlegt ist?

Lg

DF6GL

Hallo,

naja..   ja...

was ist das denn für ein Makro..?

"Laufzeitfehler 438"  ist mehr nach wie vor in diesem Zusammenhang noch nicht klar...


Cancel = true bricht alle Ereignisse ab, die noch "anstehen", bzw. abgearbeitet werden müssen, so dass auch das Schliessen-Makro davon betroffen ist, wenn dadurch das BeforeUpate-Ereignis ausgelöst wurde.
.



MzKlMu

#9
Hallo,
warum folgst Du nicht meinen Emfehlungen und baust das wie vorgeschlagen um?

Auch die Gründe können vermutlich standardisiert werden und damit aus einem Kombi auswählbar. Wenn in die Tabelle mit den Gründen noch das Vorzeichen (in Form von 1 bzw. -1) hinterlegt wird, hast Du eine sehr kompfortable und fast unfehlbare Eingabe. Fast ohne VBA Code.
Nicht dass ich meinen Vorschlag für den besten halte, aber ich würde zumindest mal darüber nachdenken.

Falls Interesse, mache ich Dir gern mal ein Beispiel. Aber dazu nenne mir mal einige Buchungsgründe als Beispiel.
Gruß Klaus

DF6GL

Hallo,

gehe da mit Klaus völlig konform und würde aus Gründen von "eine Datenbank für die Arbeit"  sogar noch weitergehen und die "Gründe" in ein (Fremdschlüssel-) Feld "Kontierung" umwandeln und ein (Fremdschlüssel-) Feld "Vorgangsart" zusätzlich einführen. Ein Textfeld für evtl. Notizen ist ja deswegen nicht verboten, das wäre aber aus Sicht der Db nur "nice to have".

Sandra80

Ist nur ein ganz einfaches Makro damit dieses Formular geschlossen wird und ein anderes dafür aufgemacht wird.

DF6GL

Hallo,

naja, dann beißt sich halt das:  Formular schliessen ---> Fehler erzeugen und Ereignis mit Cancel abrechen ---> Form-Schliessen  abbrechen, was nicht geht, und anderes FormÖffnen zu wollen.  .... Knall

Versuch mal , die Cancel-Zeile wegzulassen und
Me.Undo
dafür zu schreiben.