Januar 20, 2021, 14:33:16

Neuigkeiten:

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


Aktualisierungsabfrage schreibt nicht wie gewünscht

Begonnen von mad, Dezember 26, 2020, 10:00:03

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

ich habe eine Aktualisierungsabfrage die nicht so ganz das macht was ich gerne möchte.
Sie sollte je nach durchgeführter Ehrung in die Tabelle "Personal" in den Spalten "25JahreAktiv", "40JahreAktiv" und "50JahreAktiv" entsprechend mit "Wahr" füllen.

Wenn jemand nach 25Jahren geehrt ist soll in die entsprechenden Spalte "25JahreAktiv" (Ja/Nein Feld) ein "Wahr" eingetragen werden. Wenn jemand dann für 40Jahre geehrt wird soll zusätzlich in die Spalte "40JahreAktiv" auch ein "Wahr" eingetragen werden. Dasselbe für 50Jahre.

Aber die Aktualisierungsabfrage macht folgendes: 25Jahre soweit in Ordnung. Wenn jetzt aber wer für 40Jahre geehrt wird, trägt die Aktualisierungsabfrage zwar in die Spalte "40JahreAktiv" ein "Wahr" ein, löscht aber das "Wahr" in der Spalte "25JahreAktiv". Wenn dann jemand für 50Jahre geehrt wird, wird in die Spalte "50JahreAktiv" ein "Wahr" eingetragen aber das "Wahr" aus der Spalte "40JahrerAktiv" wird wieder entfernt.

Hier mein aktueller Code:
UPDATE Personal INNER JOIN (tblEhrung2540 INNER JOIN tblRegEhrung2540 ON tblEhrung2540.EhrungID = tblRegEhrung2540.EhrungID_E) ON Personal.PID = tblRegEhrung2540.PID_E SET Personal.[25JahreAktiv] = IIf([EhrungTitelID_E]=47 And [StatusRegID_E]=2,-1,0), Personal.[40JahreAktiv] = IIf([EhrungTitelID_E]=48 And [StatusRegID_E]=2,-1,0), Personal.[50JahreAktiv] = IIf([EhrungTitelID_E]=49 And [StatusRegID_E]=2,-1,0);

Wie müsste mein Code aussehen wenn auch die bereits durchgeführten Ehrungen erhalten bleiben?

Über eure Hilfe würde ich mich sehr freuen.

Frohe Feiertage und Gesundheit
mad


MzKlMu

Hallo,
die Ehrungen sind doch bereits erfasst, sogar mit Datum wozu dann noch ein Ja/Nein Feld ?
Gruß
Klaus

mad

Hallo,

der Datum selbst sagt noch nicht aus ob die Ehrung durchgeführt wurde, nur ob die Ehrung geplant, angemeldet oder eben durchgeführt ist. Desweiteren werden die Ja/Nein Felder für zahlreiche andere Abfrage benötigt.


Gruss
mad

MzKlMu

Dezember 26, 2020, 18:13:07 #3 Letzte Bearbeitung: Dezember 26, 2020, 18:19:09 von MzKlMu
Hallo,
Du machst einen Denkfehler. Du willst doch die Ja/Nein felder automatisch füllen, also muss doch die Information dass die Ehrung erfolgt aus den bisherigen Daten abgeleitet werden können. Demzufolge sind die Ja/Nein Felder redundant und somit ersatzlos überflüssig.
Das das falsch ist, erkennst Du auch daran, dass die Daten nur stimmen, wenn auch die Aktualisierungsabfrage gelaufen ist. Wenn da (unbemerkt) was schief geht, hast Du falsche Daten in der DB.

Mir scheint, das mit den Ehrungen ist noch nicht so ganz ausgegoren.

Was steht denn in dem Feld "EhrungDatum" und was in dem Feld Erledigt_E ?
Was bedeutet denn das Feld mit dem Status (StatusRegID_E) ?
Was wir in der n:m Tabelle tblRegEhrung2540 gespeichert ?
Dem Namen nach, dürfte die 50ziger Ehrung in der Tabelle gar nicht enthalten sein. ;D

Was willst Du denn mit den Ja/Nein Feldern noch anfangen, weil Du von anderen Abfragen sprichst ?

Du kannst davon ausgehen, dass solche Ja/Nein Felder in einer Datenbank oftmals auf eine falsche Struktur hinweisen.
Gruß
Klaus

Beaker s.a.

@mad
Das du ein falsches DM hast, Klaus hat marginal darauf hingewiesen,
solltest du inzwischen gelernt haben.
Die Ehrungen gehören in DS, nicht in Felder.
Die Tabelle "Ehrungen" wird dann n:m mit den Mitgliedern in Beziehung
setzt. In diese n:m kommt dann noch ein FK zu einer Statustabelle und
ein Feld für's Datum. Keine J/N-Felder nötig, - entweder es gibt ein
Datum = Status erfasst/durchgeführt, oder eben keins.

gruss ekkehard

P.S. Mehrfelder-Index über die FK in der n:m nicht vergessen.
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

MzKlMu

Hallo,
@ekkehard
so wie ich das sehe, hat er diese n:m (tblRegEhrung2540) doch schon, was das Vorhaben noch zweifelhafter macht.
Daher habe ich mal explizit nach dem Inhalt der verschiedenen Felder gefragt.
Gruß
Klaus

ebs17

ZitatWie müsste mein Code aussehen wenn auch die bereits durchgeführten Ehrungen erhalten bleiben?
Nun, Du müsstest Deine IIF-Logiken durchdenken und korrigieren: EhrungTitelID_E kann ja nur einem Wert entsprechen und damit zwei anderen dann nicht.

Übersichtlicher wird es, wenn Du Dich auf jeweils ein Feld beschränkst. Noch einfacher wäre es, wenn man mit DB-praktikablen Strukturen arbeitet.
Mit freundlichem Glück Auf!

Eberhard

mad

Hallo,

möchte nochmals vorausschicken das es mir bei meiner eigentlichen Abfrage nicht darum geht, wer den schon geehrt wurde (diese Abfrage gibt es), sondern wer noch nicht für die entsprchenden Jahre (25, 40 oder 50) geehrt wurde und im aktuellen Jahr dazu ansteht würde.

Noch zur Info: es kann durchaus vorkommen das ein Kollege/Kollegin zwar zu einer Ehrung geplant/angemeldet ist, diese/r aber dann wegen z.B. krankheit nicht wahrnehmen kann. Somit bekommt diese/r NICHT den Status "geehrt" und wird für die nächste Ehrung z.B. im Folgejahr erneut "angemeldet" --> neue "EhrungID".
Deshalb hätte ich gerne die Aktualisierungsabfrage umgestetzt so das nur diejenigen das entsprechende Häckchen in der Tabelle "Personal" bekommen die wirklich für die entsprechende Ehrung "geehrt" wurden.

Darum hätte ich gerne die Ja/Nein-Felder mit der Aktualisierungsabfrage gefüllt.
Es funktioniert ja auch alles Soweit sehr gut, nur eben wie Anfangs beschrieben:
ZitatAber die Aktualisierungsabfrage macht folgendes: 25Jahre soweit in Ordnung. Wenn jetzt aber wer für 40Jahre geehrt wird, trägt die Aktualisierungsabfrage zwar in die Spalte "40JahreAktiv" ein "Wahr" ein, löscht aber das "Wahr" in der Spalte "25JahreAktiv". Wenn dann jemand für 50Jahre geehrt wird, wird in die Spalte "50JahreAktiv" ein "Wahr" eingetragen aber das "Wahr" aus der Spalte "40JahrerAktiv" wird wieder entfernt.

zu den Fragen von MzKlMu:
ZitatWas steht denn in dem Feld "EhrungDatum" und was in dem Feld Erledigt_E ?
Was bedeutet denn das Feld mit dem Status (StatusRegID_E) ?
Was wir in der n:m Tabelle tblRegEhrung2540 gespeichert ?
Dem Namen nach, dürfte die 50ziger Ehrung in der Tabelle gar nicht enthalten sein.

"EhrungDatum" -> das Datum wann die Ehrung stattfinden soll bzw. stattgefunden hat.
"Erledigt_E" -> ist ein Ja/Nein-Feld mit dem ich den Vorgabg aus erledigt setzte und somit im Formular die nur noch die noch offenen Ehrungen anzeigen lasse, dient nur der Übersichtlichkeit.
"StatusRegID_E" -> zeigt den Status ob der Kollege für die Ehrung "geplant"(3), "angemeldet"(1) oder "geehrt"(2) ist.
"tblRegEhrung2540" -> wer (PID_E = Personen-ID(Zahl) für welche Ehrung (EhrungID_E) mit welchem Status (StatusRegID_E)
"50ziger Ehrung" -> doch, diese ist ziemlich neu und für uns aktuell noch nicht relevant, habe die Tabellen nur noch nicht Umbenannt. Habe eben mit 25 u. 40 die Tabellen gestartet.


Gruss
mad



mad

Hallo Zusammen,

habe noch etwas rumprobiert und bin dann auf folgende Lösung gekommen:

Code:
UPDATE Personal INNER JOIN (tblEhrung2540 INNER JOIN tblRegEhrung2540 ON tblEhrung2540.EhrungID = tblRegEhrung2540.EhrungID_E) ON Personal.PID = tblRegEhrung2540.PID_E SET Personal.[25JahreAktiv] = IIf([EhrungTitelID_E]=47 And [StatusRegID_E]=2 Or [EhrungTitelID_E]=48 And [StatusRegID_E]=2,-1,0), Personal.[40JahreAktiv] = IIf([EhrungTitelID_E]=48 And [StatusRegID_E]=2 Or [EhrungTitelID_E]=49 And [StatusRegID_E]=2,-1,0), Personal.[50JahreAktiv] = IIf([EhrungTitelID_E]=49 And [StatusRegID_E]=2,-1,0);


Danke und nochmals schöne Feiertage
mad

MzKlMu

Hallo,
Du kannst es drehen und wenden wie Du willst. Auch wenn es jetzt funktioniert, es ist einfach überflüssig.
Über den Status "geehrt"(2) hast Du bereits jetzt alle Infos die Du brauchst. Du nutzt ja auch den Status 2 für die Aktualisierungsabfrage. Wo ist also Dein Informationsgewinn, wenn Du jetzt noch zusätzlich die Ja/Nein Felder füllts ?
Du hast Dir eine potentielle Fehlerquelle eingebaut sonst nix, denn wenn mit der Aktualisierungsabfrgae was schief geht, hast Du falsche Daten in der Datenbank.

Mit meinem Hinweis zu der 50ziger Ehrung wollte ich nur darauf hinweisen, dass es problematisch ist sich in Objektnamen auf Inhalte zu beziehen. Eine Änderung des Tabellennamens zieht einen ganzen Rattenschawanz von weiteren Änderungen nach sich. Besser wäre es, die Tabelle einfach tblRegEhrung zu nennen.
Gruß
Klaus

Beaker s.a.

Hallo,
Ich halte das DM immer noch für suboptimal.
In die Tabelle "Ehrungen" gehört für mich nur die ID, der Titel, die
entsprechende Anzahl Jahre (25/40/50 oder auch beliebig andere) und
vielleicht eine ausführliche Beschreibung. Alles andere (Ort, Datum,
was da noch ist sieht man nicht) gehört in die n:m "EhrungenFuerPersonal".
ZitatNICHT den Status "geehrt" und wird für die nächste Ehrung z.B. im Folgejahr erneut "angemeldet" --> neue "EhrungID".
Wozu? Ist doch die gleiche Ehrung nur zu einem anderen Termin. Kannst
du entweder mit einem Status "verschoben" abbilden, oder einfach beim
Status "geplant/angemeldet" ein neues Datum einsetzen.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

mad

Hallo Zusammen,

Danke für die für mich "erhellenden und informativen" Anregungen.
Ich werde das Datenmodell doch nochmals überarbeiten bzw. neu anlegen.
Wird allerdings dauern, da mein Urlaub schon wieder vorbei ist.


Danke Euch.
mad