Neuigkeiten:

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

Mobiles Hauptmenü

Mehrere Wenn-Fragen

Begonnen von mad, April 12, 2023, 15:44:58

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,
ich habe in einer Abfrage einen Ausdruck mit sechs WENN-Fragen, siehe Code:
Ehrungfür: Wenn(Nz([Jahre_PID]) Mod 39>=25;25;Wenn(Nz([Jahre_PID]) Mod 49>=40;40;Wenn(Nz([Jahre_PID]) Mod 59>=50;50;Wenn(Nz([Jahre_PID]) Mod 69>=60;60;Wenn(Nz([Jahre_PID]) Mod 79>=70;70;Wenn(Nz([Jahre_PID]) Mod 89>=80;80;0))))))Irgendwie werden aber nur die ersten drei WENN-Frage abgearbeitet und wenn eigentlich die ,,70" angezeigt werden sollte, wird die ,,25" angezeigt. (siehe Bild: WENN_falsch)

Nun habe ich mal die Zeiträume auf maximal 3 Jahre eingegrenzt, wie folgt:
Ehrungfür: Wenn(Nz([Jahre_PID]) Mod 28>=25;25;Wenn(Nz([Jahre_PID]) Mod 43>=40;40;Wenn(Nz([Jahre_PID]) Mod 53>=50;50;Wenn(Nz([Jahre_PID]) Mod 63>=60;60;Wenn(Nz([Jahre_PID]) Mod 73>=70;70;Wenn(Nz([Jahre_PID]) Mod 83>=80;80;0))))))Dann wird alles richtig angezeigt. (siehe Bild: WENN_richtig)

Hätte jemand eine Idee an was das liegen könnte?

Gruss
mad

MzKlMu

Hallo,
ich würde so etwas in eine Funktion auslagern, das ist viel übersichtlicher.

Kannst Du mal die Bedingungen mit Mod erläutern ?
Was steht im Feld Jahre_PID ?
Gruß Klaus

mad

Hallo,

hier der Ausdruck zum Feld "Jahre_PID":
Jahre_PID: Summe(Wenn([AufgabeEnde] Ist Null;DatDiff("t";[AufgabeBeginn];Datum());DatDiff("t";[AufgabeBeginn];[AufgabeEnde])))\365,25
in diesem Feld werden die Jahre berechnet. In diesem Fall wie lange eine Person beim Verein ist.

Über Mod wird ermittelt für wieviel Jahre (25, 40, 50, 60 etc.) jemand geehrt werden soll. Jenachdem wieviel Jahre die Person Mitglied ist.
Weiter wird damit gesteuert für wieviel Jahre die mögliche Ehrung angezeigt wird.

Zur Info: Über eine nachfolgende Abfrage in der diese Abfrage integriert ist, wird dann die Person ausgeblendet wenn diese geehrt wurde.


Gruss
Manfred

MzKlMu

Hallo,
erstelle eine VBA Funktion, das ist viel einfacher und vor allen Dingen ist auch die Fehlersuche einfacher.
Gruß Klaus

mad

Hallo,

habe nun wie folgt eine Funktion erstellt und diese in die Abfrage integriert, siehe Bild (EhrungV.png):

Function EhrungV(Jahre_PID As Integer)

    EhrungV = IIf(Nz([Jahre_PID]) Mod 39 >= 25, 25, IIf(Nz([Jahre_PID]) Mod 49 >= 40, 40, IIf(Nz([Jahre_PID]) Mod 59 >= 50, 50, IIf(Nz([Jahre_PID]) Mod 69 >= 60, 60, IIf(Nz([Jahre_PID]) Mod 79 >= 70, 70, IIf(Nz([Jahre_PID]) Mod 89 >= 80, 80, 0))))))

End Function

Leider tritt der selbe effekt wie am Anfang beschrieben auf, siehe Bild (WENN_falsch.png)


Gruss
mad

ebs17

Zitaterstelle eine VBA Funktion
Damit war eher eine übersichtliche Gestaltung per Select Case gemeint, nicht, dass der ganze Kram wie er ist einfach nur kopiert wird.

Eigentlich löst man solche Wenn-Dann-Kaskaden in einer Datenbank derart auf, dass man eine zusätzliche Tabelle mit den Fällen führt und per Verknüpfung die Fälle zuordnet.

Alter ermitteln
Damit kann man analog auch Zugehörigkeiten sauber ermitteln, ohne über diese krumme Tagesberechnung zu gehen.

Die Mod-Berechnungen in der gezeigten Form verstehe ich nicht.
Zugehörigkeit in Jahren kann man doch direkt mit Jahreszahlen (25, 40, ...) abgleichen.

Mit freundlichem Glück Auf!

Eberhard

mad

Hallo Zusammen,
das mit Select Case muß ich mir erst ansehen bzw. mich damit befassen. Hatte ich noch nicht. Kann ich jetzt auch nicht beurteilen ob dies mein Problem lösen kann.

Aber nochmals zu ,,Mod".
Zum einen können sich die Jahre zusammensetzen, weil die Aufgabe aus unterschiedlichen Gründen mal für einen gewissen Zeitraum unterbrochen wurde, darum dieser Ausdruck in der Abfrage:

Jahre_PID: Summe(Wenn([AufgabeEnde] Ist Null;DatDiff("t";[AufgabeBeginn];Datum());DatDiff("t";[AufgabeBeginn];[AufgabeEnde])))\365,25

Mod verwende ich deshalb, weil die Person vielleicht in diesem Jahr an dem die Ehrung eigentlich anstehen würde keine Zeit hat, wegen Krankheit verhindert, oder im Ausland lebt, etc. Somit muss die Ehrung auf die Folgejahre verschoben werden. Jetzt kommt Mod ins Spiel, mit Mod steuere ich wie lange die Person zur möglichen Ehrung angezeigt wird. Wenn ich das nur für ein Jahr anzeigen lassen würde, würde es eventuell in den nächsten Jahren untergehen!

Beispiel:
...IIf(Nz([Jahre_PID]) Mod 39 >= 25, 25,... -> wenn Jahre_PID 25 anzeigt, dann zeige das im vom 25. Bis 39. Jahr an, also 14 Jahre.

Oder

...IIf(Nz([Jahre_PID]) Mod 59 >= 50, 50,... -> wenn Jahre_PID 50 anzeigt, dann zeige das im vom 50. bis 59. Jahr an, also 9 Jahre.

Oder ein verkürzer Zeitraum wie in der Abfrage ,,333abf_VereinTageJahre"

...IIf(Nz([Jahre_PID]) Mod 28 >= 25, 25,... -> wenn Jahre_PID 25 anzeigt, dann zeige das im vom 25. bis 28. Jahr an, also 3 Jahre.

Ich habe mal ein Beispiel-DB hochgeladen.
Bei der Abfrage mit den langen Anzeigezeiträumen entsteht der Fehler, siehe den DS 204 in der Abfrage ,,222abf_VereinTageJahre".

Bei der Abfrage mit den kurzen Anzeigezeiträumen entsteht der Fehler nicht, siehe den DS 204 in der Abfrage ,,333abf_VereinTageJahre".

Vielleicht hilfts ja.


Gruss
mad

PhilS

Ich habe die technische Problematik in diesem Thread nicht wirklich verfolgt, aber zu der folgenden Aussage kann ich mir dennoch einen Kommentar nicht verkneifen...

Zitat von: mad am April 13, 2023, 16:54:46Mod verwende ich deshalb, weil die Person vielleicht in diesem Jahr an dem die Ehrung eigentlich anstehen würde keine Zeit hat, wegen Krankheit verhindert, oder im Ausland lebt, etc. Somit muss die Ehrung auf die Folgejahre verschoben werden. Jetzt kommt Mod ins Spiel, mit Mod steuere ich wie lange die Person zur möglichen Ehrung angezeigt wird. Wenn ich das nur für ein Jahr anzeigen lassen würde, würde es eventuell in den nächsten Jahren untergehen!
Hört sich nach verschleiertem Zufallsprinzip an.
Wäre es nicht sinnvoller in der Datenbank zu dokumentieren, ob eine Ehrung durchgeführt wurde? Da wüsste man das genau und müsste sich nicht darauf verlassen, dass sie schon innerhalb eines recht willkürlich festgelegten Zeitraumes irgendwann wahrscheinlich, möglicherweise, vielleicht, vielleicht aber auch nicht, hoffentlich doch mal durchgeführt wurde.



Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

ebs17

Zitathier der Ausdruck zum Feld "Jahre_PID"
Wenn PID die Person darstellen soll: In der DB sah ich vielfach Tätigkeiten, die parallel stattfinden. Da wäre ich bei einer Summierung zu Jahren wie gezeigt äußerst skeptisch über den Wert von Ergebnissen, was mich zum unmittelbaren Abbruch der Betrachtung führte.
Um es zu überspitzen: Es kann natürlich Methode sein, gleichzeitig 20 Tätigkeiten zu haben und so in einem Jahr schon zur 20-jährigen Ehrung zu kommen.
Mit freundlichem Glück Auf!

Eberhard

mad

Hallo,

zu #7:
natürlich wird in einer Registrierungstabelle auch erfaßt wenn die Person denn geehrt ist. Dann wird die Person für diese Ehrung auch nicht mehr angezeigt.
Aber ob diese Person geehrt ist wird erst in einer späteren Abfrage ausgewertet. Der ganze Auswertevorgang ist sehr komplex und besteht aus insgesamt vier Abfragen. Auch der Zeitraum ist nicht willkürlich sondern über unsere Satzung festgelegt.
Was eben festgelegt werden kann, ist der Anzeigezeitraum solange eine Person nicht geehrt wurde.

zu#8:
natürlich gibt es viele Personen mit vielen verschiedenen Tätigkeiten zu denen sie in bestimmten Fällen separat geehrt werden. Auch in anderen Interwallen. Darum ist das ganze ja so komplex.
Die Anzahl an Tätigkeit führt keineswegs zu frühzeitiger Ehrung. Welche Aufgabe abgefragt wir ist mit dem Kriterium "AufgabeTitelID" definiert.

Es geht nur um das Problem warum in der Abfrage "333..." mit kürzerem Anzeigezeitraum das ganze richtig angezeigt wird und in der Abfrage "222..." eben nicht.


Gruss
mad