Neuigkeiten:

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

Mobiles Hauptmenü

Datenbezug aus Union-Abfrage (Historie)

Begonnen von Username, August 09, 2013, 12:05:50

⏪ vorheriges - nächstes ⏩

Username

Hey
Mal wieder ein kleineres Problem ;D

Ich habe eine Abfrage und eine Tabelle in einer Union Abfrage vereint:
select * from qryFreizeitkontoUbersichtAngestellt
UNION Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr, Freizeitanspruch, UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt from tblFreizeitkontoUbersichtAngestellt_History
ORDER BY [Datum];

In die Tabelle werden bei Datenänderungen die alten Datensätze automatisch eingefügt.

Die Abfrage sieht folgendermaßen aus (der Übersichtlichkeit halber Absätze eingefügt):
SELECT tblPersonal.PersonalnummerID AS PersonalNr, tblFirmaTaetigkeit.FirmaID_F AS Firma, tblPersonal.Name,
tblPersonal.Vorname, tblFreizeitkonto.Datum, Format([Datum],"mmmm") AS Monat, Year([Datum]) AS Jahr,
tblFreizeitkonto.Freizeitanspruch, Round((28/12),3) AS UrlaubfürdenMonat, ([Freizeitanspruch]+[UrlaubfürdenMonat]) AS
AltFreizeitGesamt, tblFreizeitkonto.IstStunden, tblFreizeitkonto.IstStunden AS PM, ([AltFreizeitGesamt]+[PM]) AS NeuFreizeitGesamt
FROM (tblPersonal INNER JOIN (tblFreizeitkonto INNER JOIN tblVertrage ON tblFreizeitkonto.FreizeitkontoID =
tblVertrage.FreizeitkontoID_F) ON tblPersonal.PersonalnummerID = tblVertrage.PersonalnummerID) INNER JOIN (tblEntlohnung INNER
JOIN tblFirmaTaetigkeit ON tblEntlohnung.EntlohnungID = tblFirmaTaetigkeit.EntlohnungID_F) ON tblVertrage.VertragID =
tblFirmaTaetigkeit.VertragID_F
WHERE (((tblEntlohnung.Bezeichnung)="Gehalt"))
ORDER BY tblFirmaTaetigkeit.FirmaID_F, tblPersonal.Name;


Mein Problem ist die Spalte Freizeitanspruch. Dieses Feld soll den Wert aus NeuFreizeitGesamt des letzten Monats enthalten.
Alle Felder werden berechnet, außer IstStunden.
Ich habe es schon mit folgendem Code in allen Varianten ohne Erfolg ausprobiert:
Freizeitanspruchd: DomWert([Freizeitanspruch];[tblFreizeitkonto];[Datum]=DatSeriell(Jahr([Datum]);Monat([Datum])-1;1))

Die Union Abfrage stellt letztlich eine Übersicht für das "Freizeitkonto" eines jeden Mitarbeiters dar (Filterungen nach Monat kommen später mit rein)

Kann mir jemand dabei helfen? Ich brauche die Funktion noch öfter und habe absolut keine Ahnung mehr, wie ich es machen soll :-\

Danke! ;)

DF6GL

Hallo,


wenn "Dieses Feld soll den Wert aus NeuFreizeitGesamt des letzten Monats enthalten."   authentisch ist, dann etwa so (und ohne jetzt die Datenverhältnisse wirklich zu durchblicken):


Freizeitanspruchd: DomWert("[AltFreizeitGesamt]+[IstStunden]";"[tblFreizeitkonto]";" [Datum] between Dateserial(Year([Datum]);Month([Datum])-1;1) and Dateserial(Year([Datum]);Month([Datum]);-1)" )

Username

#2
Sry hast recht, ich hätte ein Beispiel bringen müssen :D
Die Übersicht zeigt die Union Abfrage.
Freizeitanspruch = NeuFreizeitAnspruch(Vormonat)
AltGesamtFreizeit = Freizeitanspruch + UrlaubfurdenMonat
NeuGesamtFreizeit = AltGesamtFreizeit + PM

Ich habe deine Funktion eingesetzt, aber es erscheint ein Fehler (Anhang). Nach Klick auf Okay folgt eine weitere Meldung "Fehlt". :-\
Freizeitanspruchd: NZ(DomWert("[NeuFreizeitGesamt]";"[tblFreizeitkonto]";" [Datum] between Dateserial(Year([Datum]);Month([Datum])-1;1) and Dateserial(Year([Datum]);Month([Datum]);-1)");0)

Sieht schon einmal besser aus als mein Ansatz, aber woran kann es dann liegen? =>Danke für die Hilfe!

[Anhang gelöscht durch Administrator]

DF6GL

Hallo,

vermutlich braucht der Kriterienstring Komma stat Semilkolon:


Freizeitanspruchd: NZ(DomWert("[NeuFreizeitGesamt]";"[tblFreizeitkonto]";" [Datum] between Dateserial(Year([Datum]),Month([Datum])-1,1) and Dateserial(Year([Datum]),Month([Datum]),-1)"),0)

Username

Das NZ muss trotzdem mit ; geschrieben werden. Wie baue ich das geschickt in die Union (?)-Abfrage mit ein? In der qryFreizeitkontoUbersichtAngestellt gibt er mir den Fehler aus, dass er NeuFreizeitGesamt nicht finden kann, auch wenn man das Formular öffnet um die tbl...History Daten zur Verfügung zu stellen... Alles richtig geschrieben.

DF6GL

Hallo,

ok, das NZ ist ja auch nicht Bestandteil des Kriteriums der Dlookup-Funktion...




Es dürfte dann wohl das Feld "NeuFreizeitGesamt"  nicht in der History-Tabelle vorhanden sein.



Username

Es ist schon alles genau gleich vorhanden. :-\ ??? Die qry und die tbl sind gleich aufgebaut.
Zitatselect * from qryFreizeitkontoUbersichtAngestellt
UNION Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr, Freizeitanspruch, UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt [/font] from tblFreizeitkontoUbersichtAngestellt_History
ORDER BY [Datum];

Hast du noch eine andere Idee?

DF6GL

#7
Hallo,

poste mal beide Abfragen , so wie Du Dir den Einbau vorstellst..


Der Aliasname "Freizeitanspruchd"  für den Dlookup-Ausdruck könnte Probleme bereiten.

Username

Das brauchbarste Ergebnis liefert er so:
Union-Abfrage:

select * from qryFreizeitkontoUbersichtAngestellt
UNION Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr, (NZ(DomWert("[NeuFreizeitGesamt]", (; )"[tblFreizeitkonto]",(; )" [Datum] between Dateserial(Year([Datum]),(; )Month([Datum])-1,(; )1) and Dateserial(Year([Datum]),(; )Month([Datum]),(; )-1)"),(; )0)) As Freizeitanspruch, UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt from tblFreizeitkontoUbersichtAngestellt_History
ORDER BY [Datum];

Ergebnis: Undefinierte Funktion DomWert. Sobald ein Semikolon in der DomWert Funktion vorkommt, gibt er einen Syntaxfehler über die gesamte Funktion aus ((; ) erzeugen Syntaxfehler) ((; ) oder nur (,) erzeugen Meldung "Undefinierte Funktion")

SQL zur qry wie oben:
SELECT tblPersonal.PersonalnummerID AS PersonalNr, tblFirmaTaetigkeit.FirmaID_F AS Firma, tblPersonal.Name, tblPersonal.Vorname, tblFreizeitkonto.Datum, Format([Datum],"mmmm") AS Monat, Year([Datum]) AS Jahr, tblFreizeitkonto.Freizeitanspruch, Round(([Zahl]/12),3) AS UrlaubfürdenMonat, ([Freizeitanspruch]+[UrlaubfürdenMonat]) AS AltFreizeitGesamt, tblFreizeitkonto.IstStunden, tblFreizeitkonto.IstStunden AS PM, ([AltFreizeitGesamt]+[PM]) AS NeuFreizeitGesamt
FROM (tblPersonal INNER JOIN ((tblAnsprucheZahl INNER JOIN tblFreizeitkonto ON tblAnsprucheZahl.AnspruchZahlID = tblFreizeitkonto.UrlaubFurDenMonat) INNER JOIN tblVertrage ON tblFreizeitkonto.FreizeitkontoID = tblVertrage.FreizeitkontoID_F) ON tblPersonal.PersonalnummerID = tblVertrage.PersonalnummerID) INNER JOIN (tblEntlohnung INNER JOIN tblFirmaTaetigkeit ON tblEntlohnung.EntlohnungID = tblFirmaTaetigkeit.EntlohnungID_F) ON tblVertrage.VertragID = tblFirmaTaetigkeit.VertragID_F
WHERE (((tblAnsprucheZahl.Bezeichnung)="Jahresurlaub") AND ((tblEntlohnung.Bezeichnung)="Gehalt"))
ORDER BY tblFirmaTaetigkeit.FirmaID_F, tblPersonal.Name;


die tblFreizeitkontoAngestellt_History besteht aus den Feldern der Union-Abfrage.
Vielen Dank!

DF6GL

Hallo,


diese Semikola haben in der SQL-Ansicht der Abfrage doch nichts zu suchen...


select * from qryFreizeitkontoUbersichtAngestellt
UNION Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr,
(NZ(Dlookup("NeuFreizeitGesamt", "tblFreizeitkonto"," [Datum] between Dateserial(Year([Datum]),Month([Datum])-1,1) and Dateserial(Year([Datum]), Month([Datum]), -1)"),0)) As Freizeitanspruch,
UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt
from tblFreizeitkontoUbersichtAngestellt_History
ORDER BY [Datum];

Username

Ich probiere seit einer Stunde dran herum und es will nicht funktionieren!!! >:(
Darf ich das entspeckt mal hochladen, damit jemand drüber guckt? :-[

Meine aktuelle Lösung: tblFreizeitkontoÜbersichtAngestellt_History hat für Freizeitanspruch ja fest hinterlegte Werte. Die qry soll für Freizeitanspruch den Vormonatswert NeuFreizeitGesamt aus der tbl enthalten.

Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr,
Freizeitanspruch, UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt
from tblFreizeitkontoUbersichtAngestellt_History
ORDER BY [Datum]
Union
Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr,
(NZ(Dlookup("NeuFreizeitGesamt", "tblFreizeitkontoUbersichtAngestellt_History","[Datum] between Dateserial(Year([Datum]),Month([Datum])-1,1) and Dateserial(Year([Datum]), Month([Datum]), -1)"),0)) As Freizeitanspruch,
UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt  from qryFreizeitkontoUbersichtAngestellt;


Keine Fehlermeldungen mehr, aber für den aktuellen Monat erscheint immer 0!

DF6GL

Hallo,

naja, der Vormonat ist ja nun auch nicht akt. Monat....  Oder wie ist das zu verstehen... ???

Username

#12
Hier mal ne Beispiel DB.
Das Formular ist eine History der Freizeitkonten. Hier soll in der Spalte Freizeitanspruch für August der Wert aus NeuFreizeitGesamt im Juli stehen.

[Anhang gelöscht durch Administrator]

DF6GL

#13
Hallo,

versuch das mal so:


Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr,
Freizeitanspruch, UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt
from tblFreizeitkontoUbersichtAngestellt_History
ORDER BY [Datum]
UNION Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr,
(NZ(Dlookup("NeuFreizeitGesamt", "tblFreizeitkontoUbersichtAngestellt_History","[Datum] between Dateserial(Year(" & Format(A.[Datum],'\#yyyy-mm-dd\#') & "),Month(" & Format(A.[Datum],'\#yyyy-mm-dd\#') & ")-1,1) and Dateserial(Year(" & Format(A.[Datum],'\#yyyy-mm-dd\#')  & "), Month(" & Format(A.[Datum],'\#yyyy-mm-dd\#') & "), -1)"),0)) As Freizeitanspruch,
UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt  from qryFreizeitkontoUbersichtAngestellt as A;



wobei, da scheinbar immer des Erste des Monats als Datum für die Kennzeichnung des gesamten Monats  verwendet wird, auch dieses gehen sollte:


Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr,
Freizeitanspruch, UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt
from tblFreizeitkontoUbersichtAngestellt_History
ORDER BY [Datum]
UNION Select PersonalNr, Firma, Name, Vorname, Datum, Monat, Jahr,
(NZ(Dlookup("NeuFreizeitGesamt", "tblFreizeitkontoUbersichtAngestellt_History","[Datum] = Dateserial(Year(" & Format(A.[Datum],'\#yyyy-mm-dd\#') & "),Month(" & Format(A.[Datum],'\#yyyy-mm-dd\#') & ")-1,1)"),0))   As Freizeitanspruch,
UrlaubfürdenMonat, AltFreizeitGesamt, IstStunden, PM, NeuFreizeitGesamt  from qryFreizeitkontoUbersichtAngestellt as A;


Username

#14
Das sieht schon sehr gut aus! Danke! ;D
Habe es mal gründlich ausprobiert.
Wenn man es in die Union einträgt, hinterlegt er für alle Freizeitkonten vom aktuellen Monat die selben Daten. Habe es schon mit einem Inner Join mit der PersonalNr versucht, aber die Union Abfrage will das nicht mitmachen :P
Er scheint die Funktion nur einmal auszuführen und speichert den Wert dann allgemein für alle Felder Freizeitanspruch zwischen.
(Er übernimmt einmal für den ersten Eintrag 29,33 und alle folgenden Einträge haben denselben Wert. Die Zahl wird nicht zur Berechnung beachtet. Für den zweiten Mitarbeiter fordert er schon eine Eingabe für Freizeitanspruch und nimmt diese als Berechnungsgrundlage statt des errechneten Wertes)

Wenn man deine Funktion allerdings in die qry für Freizeitanspruch eingibt, fragt er nach A.Datum. Das habe ich in mehreren Formaten eiongegeben, aber er produziert immer den Fehler "Syntaxfehler in Abfrageausdruck (die Formel)"

Soo kurz davor ;)
Danke für deine Hilfe!

[Anhang gelöscht durch Administrator]