Hallo allerseits,
ich stecke irgendwie vollkommen fest.
SELECT lnx_lo_lohnarten_summen_neu.nr_personal_lasum, lnx_lo_personal_stamm.name_familie, lnx_lo_personal_stamm.vorname, lnx_lo_lohnarten_summen_neu.tag_lasum, lnx_lo_lohnarten_summen_neu.std_lasum, lnx_lo_lohnarten_summen_neu.la_nr_lasum, lnx_lo_lohnarten_summen_neu.kst_ktr1_lasum, lnx_lo_personal_stamm.geburt_datum
FROM lnx_lo_lohnart_stamm INNER JOIN (lnx_lo_personal_stamm INNER JOIN lnx_lo_lohnarten_summen_neu ON lnx_lo_personal_stamm.nr_personal_stamm = lnx_lo_lohnarten_summen_neu.nr_personal_lasum) ON lnx_lo_lohnart_stamm.nr_la = lnx_lo_lohnarten_summen_neu.la_nr_lasum
WHERE (((lnx_lo_lohnarten_summen_neu.tag_lasum)<>0)
AND ((lnx_lo_lohnarten_summen_neu.la_nr_lasum)=11 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=12 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=13 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=14 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=822)
AND ((lnx_lo_lohnarten_summen_neu.jahr_lasum)=[Geben Sie das Jahr ein:])
AND ((lnx_lo_lohnarten_summen_neu.monat_lasum)=[Geben Sie den Monat als Zahl ein:])
AND ((lnx_lo_personal_stamm.personengruppe)=102));
An sich funktioniert auch alles Einwandfrei, ausser die Stelle mit den vielen "Or".
Ich bin mir noch nicht ganz sicher, ob er es einfach völlig ignoriert oder nur teilweise ausführt, aber so oder so scheint da
ein Fehler drin zu stecken.
Z.B. kommt die 972 immer wieder mit durch =/
Eine Fehlermeldung gibt es nicht, er macht brav seine abfrage.
Hat jemand eine Idee?
Vielen lieben Dank =)
Gruß
Max
Sind die Felddatentypen, in den im Kriterium Zahlen stehen auch alle Zahlenfelder?SELECT s.nr_personal_lasum,
p.name_familie,
p.vorname,
s.tag_lasum,
s.std_lasum,
s.la_nr_lasum,
s.kst_ktr1_lasum,
p.geburt_datum
FROM lnx_lo_personal_stamm AS p
LEFT JOIN lnx_lo_lohnarten_summen_neu AS s
ON p.nr_personal_stamm = s.nr_personal_lasum
WHERE s.tag_lasum > 0 AND
s.la_nr_lasum IN( 11, 12, 13, 14, 822 ) AND
s.jahr_lasum = [Geben Sie das Jahr ein:] AND
s.monat_lasum = [Geben Sie den Monat als Zahl ein:] AND
p.personengruppe = 102;
Abseits von der eleganten und zu bevorzugenden Lösung mit IN(...):
AND bindet mehr als OR. Eine OR-Verknüpfung müsste man also zur Ausführung der gewünschten Logik gezielt klammern.
Dabei wird es günstig sein, vorher die vielen überflüssigen Klammern, die der Abfrageeditor erzeugt, zu beseitigen, um eher Überblick zu bekommen. Auch das zeigt ja Lachtaube.
Eine ganz neue Welt 0.0
SQL fällt bei mir noch unter Fremdsprache.
Dein Post ist super hilfreich Lachtaube. Ich hatte keine Ahnung , dass ich mit AS ähnlich VBA Kürzel definieren kann. Genauso, dass die Klammern nicht wichtig sind, wusste ich nicht. Dachte der Abfrageeditor braucht die irgendwie. (Wobei... wenn man Makros aufzeichnet in Excel kann man ja auch erstmal die hälfte wegschmeißen, hätte ich mir denken können).
Auch IN ist mir neu... Super Sache, werde ich nachher noch an anderen Stellen nutzen können =)
Ich hab den Code jetzt einfach mal in meine Abfrage kopiert und eingesetzt und Daten von 2 verschiedenen Monaten gezogen.
Ergebnis:
Für das Feld la_nr_lasum kommen immer noch die Werte 100 und 972 mit. - Ist das das Problem was du meintest ebs17? Das hab ich nämlich noch nicht so ganz kapiert.
Die Felddefinitionen stimmen, sind alle als Zahl hinterlegt.
Trotzdem schonmal vielen Dank =)
Hm, das dürfte eigentlich nicht sein. Kannst Du einige (anonymisierte) Spieldatensätze in Textform zur Verfügung stellen?
PS: der Left-Join mit den Kriterien aus meiner ersten Antwort scheint so sinnvoller formuliert zu sein:SELECT q.nr_personal_lasum,
p.name_familie,
p.vorname,
q.tag_lasum,
q.std_lasum,
q.la_nr_lasum,
q.kst_ktr1_lasum,
p.geburt_datum
FROM lnx_lo_personal_stamm AS p
LEFT JOIN ( SELECT nr_personal_lasum,
tag_lasum,
std_lasum,
la_nr_lasum,
kst_ktr1_lasum
FROM lnx_lo_lohnarten_summen_neu
WHERE tag_lasum > 0 AND
la_nr_lasum IN( 11, 12, 13, 14, 822 ) AND
jahr_lasum = [Geben Sie das Jahr ein:] AND
monat_lasum = [Geben Sie den Monat als Zahl ein:] ) AS q
ON p.nr_personal_stamm = q.nr_personal_lasum
WHERE p.personengruppe = 102;
Zuerst zu der neuen Left Join:
Es muss ein Right Join sein, auch wenn es eher konterintuitiv ist.
Ich hol mal etwas weiter aus um was es eigentlich geht:
Die Tabellen sind alle verknüpft zu einem Server per ODBC-Schnittstellen. Ich kann nur lesen, nicht schreiben.
Die Tabelle lnx_lo_personal_stamm ist, wie sie ja auch heißt, mein Personalstamm. Hier werden über die Personalnummer als Primärschlüssel alle Mitarbeiter mit ihren Stammdaten (geburtsdatum, name, personengruppe...) geführt.
Die Tabelle lnx_lo_lohnarten_summen_neu erfasst die gearbeiteten Stunden der Mitarbeiter.
Die Tabelle listet im Prinzip:
Personalnummer Jahr Monat Tag Stunden Lohnart Kostenträger
123 2018 1 1 5 12 36
123 2018 1 1 3 12 36
123 2018 1 2 8 822 29
567 2018 1 2 8 14 120
Ziel der Abfrage ist es mir alle Stunden für einen Monat zu ziehen, aufgeschlüsselt nach Mitarbeiter und Datum um in Excel eine Auswertung damit zu machen. Es geht drum zu sehen Mitarbeiter 123 hat am 01.01.2018 8 Stunden gearbeitet. Hier sind die Lohnarten eigentlich fast egal, das Problem ist nur das es Buchungen auf Lohnarten gibt, die meine Auswertung verfälschen. Deshalb auch die Filter nach 11,12,13,14,822.
Die Auswertung funktioniert soweit auch(Ist simpel über Pivot und bedingte Formatierungen umgesetzt)
Der Personalstamm dient mit mir lediglich dazu den Namen herauszufinden und nur die Personengruppe 102 zu ziehen.
Im Prinzip brauche ich einfach nur die lo_lohnarten_summe_neu um die Namen ergänzt und nur die Mitarbeiter der Gruppe 102 und die Filterung der Lohnarten. Mitarbeiter die keine Daten in lo_lohnarten_summe_neu haben interessieren mich nicht weiter, die möchte ich sowieso nicht im Abfrageergebnis haben.
Ich hoffe ich hab nichts wichtiges vergessen.
OK, dann wäre aber die erste Abfrage (nur statt eines LEFT- einen INNER JOIN) AFAIK korrekt.
Um das Problem einzugrenzen, verwende einmal nur die Bedingung mit der IN-Klausel. Wenn das nicht hilft, importiere einige der relevanten Daten vom Server in eine neue leere DB und teste, ob es lakal zu den gleichen Problemen kommt. Ist das nicht der Fall, dürfte es am ODBC-Treiber liegen, der vielleicht eine entsprechende Stellschraube zur Korrektur aufweist oder aber vielleicht auch in einer verbesserten Version zu haben ist.
Ich hab mal etwas getestet.
Nur mit der IN Bedingung funktioniert es auch nicht - Auch nicht wenn ich mir die Daten vorher lokal als Tabelle gespeichert hab... Ich bin langsam mehr als verwirrt. Vor Allem weil es großteils funktioniert und nur ein paar vereinzelte Datensätze "durchrutschen".
Ich werde das Problem jetzt zu Lasten meiner User ändern, da mir die Zeit fehlt jetzt auf ewige Fehlersuche zu gehen.
Die drücken eh nur auf einen Knopf im Formular und bekommen eine Exceltabelle zurück. Da muss dann halt mit Filtern oder ähnlichem gearbeitet werden oder ich bau noch fix was in VBA zusammen.
Trotzdem vielen Dank für die Hilfe, ich lasse den Thread nochmal offen und schließe ihn Anfang nächster Woche, falls sich noch jemand zu Wort melden will.
Vielen Dank!!!
Ich behaupte, dass ein Defekt vorliegt, wenn die IN-Klausel nicht funktioniert. Die folgende Tabelle
t t| txt | num | | A | 11 | | B | 11 | | A | 6 | | B | 12 | | C | 15 | | C | 14 | | D | 822 | | D | 823 | mit |
SELECT t.txt, t.num
FROM t
WHERE t.num IN ( 11, 12, 13, 14, 822 );ergibt bei mir erwartungsgemäß
Ich stimme die voll und ganz zu. Trotz allem weiß ich nicht wie ich es lösen soll, bzw. den Defekt beheben.
Die Daten sollen eh in Excel exportiert werden, von daher lass ich jetzt Excel die arbeit machen, bevor ich mir
stundenlang den Kopf zerbreche - so ärgerlich das Ganze auch ist...
Wenn die Abfragedefinition richtig ist (was ich auch behaupten würde), dann könnte es vielleicht sein, dass mit einer Tabelle gearbeitet wird und man aber eine andere Tabelle anschaut.
Man sollte also einmal die Gesamtkonstellation anschauen.