Bedingung in Access

Hallo,

folgende Situation:
In einer Tabelle in Access habe ich zwei Spalten: „Vorname“ und „Prüfung“. „Vorname“ hat den Felddatentyp „Text“.
Nun möchte ich, dass in der Spalte „Prüfung“ ein X angezeigt wird, wenn „Vorname“ nicht leer ist.

Ich habe schon

WENN([Vorname]"", "X", "")

und

=IIF([Vorname]"", "X", "")

in die Zelle geschriebn, mit dem Felddatentyp „Text“. In beiden Fällen, für euch Wissende wahrscheinlich vollkommen offensichtlich, ist nichts passiert.

In dieser Richtung habe ich mit Access noch nie was gemacht, also würde ich mich über eine Idioten-Sichere Anleitung (welche Eigenschaften muss welches Feld haben, was genau muss ich wo hinschreiben, etc.) freuen.

Danke
Jops

Hallo Jops,

folgende Situation:
In einer Tabelle in Access habe ich zwei Spalten: „Vorname“
und „Prüfung“. „Vorname“ hat den Felddatentyp „Text“.
Nun möchte ich, dass in der Spalte „Prüfung“ ein X angezeigt
wird, wenn „Vorname“ nicht leer ist.

ok, die Frage ist WO?

Ich habe schon

WENN([Vorname]"", „X“,
„“)

und

=IIF([Vorname]"", „X“,
„“)

in die Zelle geschriebn, mit dem Felddatentyp
„Text“. In beiden Fällen, für euch Wissende wahrscheinlich
vollkommen offensichtlich, ist nichts passiert.

ja :smile: das funktioniert in Excel, aber nicht in Access.

Eine Tabelle in Access ist die Daten-Basis, mehr nicht! (bitte nicht mit einer Excel-Tabelle verwechseln!!)

In einer Tabelle kann man nichts machen, was Formeln und Bedingungen angeht! Es ist ein einfacher Datenspeicher.

In dieser Richtung habe ich mit Access noch nie was gemacht,

geht ja auch nicht :smile:

also würde ich mich über eine Idioten-Sichere Anleitung
(welche Eigenschaften muss welches Feld haben, was genau muss
ich wo hinschreiben, etc.) freuen.

  1. Möglichkeit:
  • erstelle eine Aktualisierungsabfrage
  • deine Tabelle als Basis
    1. Spalte = Vorname
    1. Spalte = Kriterium: >""
    1. Spalte = Prüfung
    1. Spalte = Aktualisieren: „X“
  • speichern
  • Doppelklick auf die Abfrage führt diese aus.
  1. Möglichkeit:
  • erstelle ein Formular
  • als Datenbasis wähle deine Tabelle
  • füge deine Felder in das Formualr ein
  • nutze ggf. den Assistenten
  • Rechtsklick auf das Feld VORNAME
  • Eigenschaften wählen
  • Reiter = Ereignis
  • Bei Fokusverlußt: [Ereignisprozedur]
  • am Ende der Zeile auf die drei Punkte […] klicken
  • im VBA - Editor nun eingeben:
  • me.prüfung = iif(Me.Vorname="","",„X“)
  • VBA-Editor = speichern und verlassen
  • Formular öffnen
  • Daten in Vorname eintragen …

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hey Netwolf,
erstmal Danke für deine Mühe.

In dieser Richtung habe ich mit Access noch nie was gemacht,

geht ja auch nicht :smile:

Das hatte ich mit letztendlich dann auch gedacht.

  1. Möglichkeit:
  • erstelle ein Formular
  • als Datenbasis wähle deine Tabelle
  • füge deine Felder in das Formualr ein
  • nutze ggf. den Assistenten
  • Rechtsklick auf das Feld VORNAME
  • Eigenschaften wählen
  • Reiter = Ereignis
  • Bei Fokusverlußt: [Ereignisprozedur]

Was bedeutet dieses „Bei Fokusverlust“? Nur damit ich weiß, was ich da mache.

  • am Ende der Zeile auf die drei Punkte […] klicken
  • im VBA - Editor nun eingeben:
  • me.prüfung = iif(Me.Vorname="","",„X“)
  • VBA-Editor = speichern und verlassen
  • Formular öffnen
  • Daten in Vorname eintragen …

Diese Variante gefällt mir, vor allem, weil ich auch mal wieder selber ein bisschen Code schreiben kann.
Allerdings klappt das nicht so ganz: Das Feld Prüfung bekommt immer ein X, ganz egal ob Vorname leer ist oder nicht.

Daraufhin habe ich die Zeile dann mal so geändert, weil es ja im Prinzip für’s funktionieren der Funktion keinen Unterschied machen sollte:

me.Prüfung = iif(Me.Vorname="h","","X")

Jetzt wurde ein X ausgegeben, wenn Vorname kein „h“ war. Wenn Vorname ein „h“ war, bekam ich folgende Fehlermeldung:
>>Microsoft Visual Basic
>>Laufzeitfehler ‚-2147352567 (800200009)‘:
>>Feld ‚Tabelle1.Prüfung‘ darf keine Zeichenfolge der Länge Null sein.
>>[Beenden] [Debuggen]
Habe ich damit jetzt meine Unwissenheit nur noch schlimmer unter Beweis gestellt?

Ich hoffe, du kannst mir nochmal helfen.
Jops

Hey Jobs,

  • Reiter = Ereignis
  • Bei Fokusverlußt: [Ereignisprozedur]

Was bedeutet dieses „Bei Fokusverlust“? Nur damit ich weiß,
was ich da mache.

Du hast die Eigenschaften des Vorname-Feldes aufgerufen?
Du hast auf den Reiter [Ereignis] geklickt?
Du hast mal gelesen was da so angeboten wird?

Allerdings klappt das nicht so ganz: Das Feld Prüfung bekommt
immer ein X, ganz egal ob Vorname leer ist oder nicht.

das ist nicht normal, was hast du sonst noch wo eingegeben?

Daraufhin habe ich die Zeile dann mal so geändert, weil es ja
im Prinzip für’s funktionieren der Funktion keinen Unterschied
machen sollte:

me.Prüfung = iif(Me.Vorname=„h“,"",„X“)

Jetzt wurde ein X ausgegeben, wenn Vorname kein „h“ war. Wenn
Vorname ein „h“ war, bekam ich folgende Fehlermeldung:
>>Microsoft Visual Basic
>>Laufzeitfehler ‚-2147352567 (800200009)‘:
>>Feld ‚Tabelle1.Prüfung‘ darf keine Zeichenfolge der
Länge Null sein.
>>[Beenden] [Debuggen]
Habe ich damit jetzt meine Unwissenheit nur noch schlimmer
unter Beweis gestellt?

nein, wir haben ja alle mal angefangen… und selbst heute überrascht mich Access noch mit Fehlermeldungen die ich nie vermutet hatte :smile:

  • also öffne deine Tabelle im Entwurfsmodus
  • prüfe die Einstellungen für das Feld Prüfung
  • Es sollte den Typ TEXT haben
  • Es sollten sonst keine Bedingungen eingestellt sein!
  • Es sollten sonst keine Verknüpfungen mit diesem Feld existieren

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo,

da gäbe es doch Einiges dazu zu sagen/fragen:

– für was ist das Ganze letztendlich überhaupt gut? Eine solche Berechnung („X“ anzeigen, wenn „Vorname“ leer ist) ist nicht nötig, in einem Tabellenfeld gespeichert zu werden. Weiterhin ist eine „Kennzeichung“ eines leeren Feldes mit „X“ in einem anderen Feld für mich im Sinn nachfragewürdig.

– die Fehlermeldung ( ) bedeutet, daß die Eigenschaften des Tabellenfeldes so eingestellt sind, als daß keine „leere Eingabe“ (Textlänge =0 ) erlaubt ist.

– der Code sollte so heißen( je nachdem, in welcher Ereignisprozedur er stehen soll)

Sub Vorname_Afterupdate() 'passende Ereignisprozedur verwenden
If IsNull(Me!Vorname) Then Me!Prüfung =„X“
End Sub

Der Code hat den "Nachteil, daß zwar X gesetzt , aber nicht zurückgesetzt wird, wenn der Vorname wieder gefüllt wird. Siehe ff.

Bei IIF(…) werden immer beide Entscheidungszweige ausgewählt, so daß eben bei Zuweisung von „“ (Leerstring) die o. g. Fehlermeldung erscheint. Das könnte vermieden werden, wenn in den Tabellenfeldeigenschaften Leerstrings erlaubt würden.

– Am besten wäre, das Tabellenfeld „Prüfung“ ganz zu eliminieren und die Berechnung dafür an den Stellen zu erledigen, an denen das Ergebnis (die Kenntnis, daß der Vorname leer ist) gebraucht wird. (Wobei ich nicht weiß, wie oben schon angedeutet, wie , wo und warum dieses gebraucht wird.)

Wenn aber schon als gespeicherte Berechnung, dann das Tabellenfeld in den Datentyp Ja/Nein wandeln und z. B. mit einem Kontrollk. oder einem Optionsfeld anzeigen und ähnlichen Code verwenden:

Sub Vorname_Afterupdate()
Me!Prüfung= IsNull(Me!Vorname) 'Feld „Prüfung“ in der Tabelle vom Datentyp „Ja/Nein“
End Sub

Gruß
Franz, DF6GL

1 Like

Hallo,

Was bedeutet dieses „Bei Fokusverlust“? Nur damit ich weiß,
was ich da mache.

Du hast die Eigenschaften des Vorname-Feldes aufgerufen?
Du hast auf den Reiter [Ereignis] geklickt?
Du hast mal gelesen was da so angeboten wird?

Das habe ich. Und ich verstehe auch alle. Bis eben auf die beiden „Bei Fokuserhalt“ und „Bei Fokusverlust“. Was ist mit diesem Fokus gemeint?

Allerdings klappt das nicht so ganz: Das Feld Prüfung bekommt
immer ein X, ganz egal ob Vorname leer ist oder nicht.

das ist nicht normal, was hast du sonst noch wo eingegeben?

So weit ich weiß nirgendwo.

  • also öffne deine Tabelle im Entwurfsmodus
  • prüfe die Einstellungen für das Feld Prüfung
  • Es sollte den Typ TEXT haben
  • Es sollten sonst keine Bedingungen eingestellt sein!
  • Es sollten sonst keine Verknüpfungen mit diesem Feld
    existieren

Ist alles so, wie du schreibst.

Allerdings habe ich jetzt in der Tabelle im Entwurfmodus für alle Felder „Leere Zeichenfolge“ auf „Ja“ gestellt.
Und siehe da, in meiner Änderung mit dem „h“ läuft es jetzt so ab:
Wenn „Vorname“ „h“ ist oder ein h enthält (z.B. „ghi“) dann bekommt „Prüfung“ ein „X“.
Wenn ich im iif() wieder „“ als Bedingung mache, dann bekommt Prüfung immer noch in jedem Fall ein „X“. Aber wenigstens bin ich die Fehlermeldung los :smile:

Daraufhin würde ich jetzt davon ausgehen, dass nicht der ganze Daten-String abgeglichen wird, sondern dass auch ein positives Ergebnis ausgegeben wird, wenn nur ein Teil des Strings mit dem zu prüfenden String übereinstimmt. Aber das macht irgenwie keinen Sinn und ich wüsste auch nicht, wie ich das ändern kann…

Ratlos
Jops

Hallo,

– für was ist das Ganze letztendlich überhaupt gut?

Die Access-Tabelle dient als Quelle für den M$ Word Seriendruck.
Im Grunde geht es nicht nur um die Prüfung ob in „Vorname“ etwas steht. Das ist nur eine Vereinfachung des Falls. Letzendlich sollen bis zu zehn Felder überprüft werden, ob sie leer sind oder ob bestimmte Kombinationen von ihnen leer oder nichtleer sind.

– die Fehlermeldung ( ) bedeutet, daß die Eigenschaften des
Tabellenfeldes so eingestellt sind, als daß keine „leere
Eingabe“ (Textlänge =0 ) erlaubt ist.

Danke! Das habe ich geändert (hätte aber auch selber drauf kommen müssen!!) und jetzt bin ich schon mal wenigstens die Fehlermeldung los.

– der Code sollte so heißen( je nachdem, in welcher
Ereignisprozedur er stehen soll)

Sub Vorname_Afterupdate() 'passende Ereignisprozedur verwenden
If IsNull(Me!Vorname) Then Me!Prüfung =„X“
End Sub

Der Code hat den "Nachteil, daß zwar X gesetzt , aber nicht
zurückgesetzt wird, wenn der Vorname wieder gefüllt wird.

Habe deine Vorschlag jetzt so geändert:

If IsNull(Me.Vorname) Then
 Me.Prüfung = ""
Else
 Me.Prüfung = "X"
End If

Und es funktioniert bestens!! Und wird auch geändert, wenn Vorname geändert wird. Vielen Dank!!

– Am besten wäre, das Tabellenfeld „Prüfung“ ganz zu
eliminieren und die Berechnung dafür an den Stellen zu
erledigen, an denen das Ergebnis (die Kenntnis, daß der
Vorname leer ist) gebraucht wird. (Wobei ich nicht weiß, wie
oben schon angedeutet, wie , wo und warum dieses gebraucht
wird.)

Nicht möglich, da es die Möglichkeiten der Feldfunktionen in Word (meines Wissens nach) überschreitet und über Access mit VB-Code relativ einfach umzusetzen sollte.

Vielen Dank
Jops

Hallo Netwolf,

ich habe jetzt mit Hilfe von df6gl eine Möglichkeit gefunden, meine Vorstellungen umzusetzen. Vielen Dank für deine Hilfe.

Ich wäre dir dankbar, wenn du mir aber trotzdem noch sagen würdest, was es mit dem „Fokus“ auf sich hat und warum ich den Code in diesem Ereignis eintrage und nicht bei z.B. „Nach Aktualisierung“.
Und warum kommt der Code in die Eigenschaft des „Vorname“ Feldes und nicht in das Feld um das es eigentlich geht, also „Prüfung“?

Jops

Hallo Jobs,

ich habe jetzt mit Hilfe von df6gl eine Möglichkeit gefunden,
meine Vorstellungen umzusetzen. Vielen Dank für deine Hilfe.

richtig, er prüft auf IsEmpty und nicht auf „“

ergänzend gibt es noch weitere Möglichkeiten der Prüfung:

  • isNULL(Feld)
  • Len(Feld)>0 'Leerzeichen werden erkannt
  • Len(Ltrim(Rtrim(Feld)))>0 'Leerzeichen werden am Anfang und Ende gelöscht

Ich wäre dir dankbar, wenn du mir aber trotzdem noch sagen
würdest, was es mit dem „Fokus“ auf sich hat und warum ich den
Code in diesem Ereignis eintrage und nicht bei z.B. „Nach
Aktualisierung“.

meine Erfahrung hat gezeigt, dass das Ereignis bei Aktualisierung nicht immer richtig erkannt wird. Schließlich kannst du mit der Maus während der Eingabe ganz woanders hinklicken.
Fokus bedeutet vereinfacht: das Feld, wo der Cursor drinsteht, hat den Fokus, oder besser = ist ausgewählt (z.B. bei Buttons etc.)

Und warum kommt der Code in die Eigenschaft des „Vorname“
Feldes und nicht in das Feld um das es eigentlich geht, also
„Prüfung“?

Prüfung ist ein „totes“ Feld! Der User soll ja keine Eingabe dort vornehmen. Also stellt man die Eigenschaften: aktiviert auf NEIN und gesperrt auf JA (immer beide in Verbindung nutzten!!)
Somit bekommt das Feld Prüfung NIE den Fokus und kann so auch selbst idR kein Ereignis auslösen.

Das Feld VORNAME ist in der Lage den Fokus zu bekommen, also kann es Ereignisse abfragen.
Gleichzeitig verändere ich dort etwas, so dass mein Tun in diesem Feld etwas woanders (Prüfung) bewirkt. Und das soll es ja sofort bewirken und nicht erste, wenn ich z.B. an 10 Stelle das entsprechende Feld (Prüfung) aktivieren würde, in dem ich in das Feld klicke.

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

kleine Korrektur am Rande…

richtig, er prüft auf IsEmpty und nicht auf „“

Nein, das habe ich nicht gemacht…

IsEmpty ist nicht geeignet, weil es sich hierbei um die Prüfung bei einer Variant-Variablen handelt, ob sie schon erstinitialisiert ist oder nicht.

IsNull prüft den aktuellen Inhalt einer Variant-Variablen (und Form-Textfelder sind grundsätzlich von Typ Variant), ob ein solcher vorhanden ist oder nicht.

Grüße
Franz,DF6GL