![]() |
AW: Ergebnis auf einen Datensatz reduzieren
Zitat:
Deine letzter Versuch kann nicht funktionieren, weil die Aufträge und Lieferscheine gemischt anzeigst, wenn ich es richtig sehe. Die Ergebnisse für Aufträge und Lieferscheine müssen getrennt werden. Wie Uwe schon schrieb, ist das ohne konkrete DB etwas schwierig. Da Uwe und ich ähnliche Ansätze verfolgt haben, hier kurz die Idee, die dahinter steckt, damit du dich ohne unsere Hilfe weiter rantasten kannst:
Du musst mit Tabellenaliasen arbeiten, damit du die Bedingungen im Subselect sauber mit dem äußeren Select verknüpfen kannst. Als ersten Ansatz kannst zu einem Ergebnis des Haupt-Selects erstmal eine weiteres Select erstellen, dass dann die richtigen Ergebnisse aus den Lieferscheinen liefert. Daran solltest du erkennen, welche Verknüpfungen im Subselect gesetzt werden müssen. Idealerweise testest du das mit einer Auftragsposition, die mehrere Teillieferungen hatte. Hinweis am Rande: Das Sum des Subselects kann NULL-Werte beinhalten. Keine Ahnung was Access damit macht, aber es kann dann sein, dass dort immer NULL rauskommt, sobald einer der Teilwerte NULL ist. Normalerweise habe DBs dafür eine Funktion, die ich aber für Access nicht kenne. Bei meiner DB muss ich Coalesce verwenden |
AW: Ergebnis auf einen Datensatz reduzieren
Da ich keine Ahnung habe, woran ich "Bestellt" und "Geliefert" unterscheiden soll, hab' ich mal ein bisserl geraten (keine Ahnung ob Access das kann und ohne Datenmodell und passende DB nur Spekulatius ;-)).
SQL-Code:
Was ich nicht verstehe: Wofür war in dem nicht so ganz korrekt funktionierenden SQL das Group by? Um irgendwelche uminösen Dubletten zu eliminieren? Eigentlich benötig man es bei Aggregatfunktionen, da es davon aber keine im SQL gibt, erscheint mir das irgendwie nicht plausibel. Wenn da keine unerwünschten Nebeneffekte auftreten, ist das eher Zufall.
SELECT
ABFDocAuftragNr, ABFPosArtNr, Bestellt, Geliefert, Bestellt - Geliefert as Offen, ABFPosName1 FROM ( SELECT ABFDocAuftragNr, ABFPosArtNr, case when ABFPosType = 0 then ABFPosMenge else 0 end as Bestellt, case when ABFPosType = 7 then 0 else ABFPosMenge end as Geliefert, ABFPosName1 FROM ABFDok INNER JOIN ABFPos ON ABFPos.ABFPosAuftragID = ABFDok.ABFDocAuftragID WHERE ABFDocOptFertig = false AND ABFDocVisType = 1 AND ABFPosType in (0,7) ) ORDER BY ABFPosArtNr |
AW: Ergebnis auf einen Datensatz reduzieren
Zitat:
|
AW: Ergebnis auf einen Datensatz reduzieren
Alles was Access nicht kennt, nennt es in der Fehlermeldung "Parameter", egal ob es nun ein Parameter ist oder nicht. Das ist zuweilen extrem irreführend.
|
AW: Ergebnis auf einen Datensatz reduzieren
Probier mal ganz unten hinter der Klammer "as SubQuery" einzufügen:
ABFPosType in (0,7) ) as SubQuery ORDER BY ABFPosArtNr |
AW: Ergebnis auf einen Datensatz reduzieren
Hallo und Danke an alle die mir helfen wollen.
Ich habe 2 Queries die genau das machen was sie sollen, nur müsste das in einer Abfrage untergebracht werden. Die erste Abfrage holt mir alle offenen Aufträge mit ABFDocVisType = 1 und ABFPos ON ABFDok.ABFDocAuftragID = ABFPos.ABFPosDocID und bringt mir u.a. die bestellte Menge. OK. Die zweite Abfrage bringt mir die bereits gelieferten Mengen mit Lieferschein ABFDocVisType = 2 und SUM(ABFPosMenge) AS Geliefert und ABFPos ON ABFDok.ABFDocID = ABFPos.ABFPosdocID. Die Innerjoins sowie die ABFDocVisType sind unterschiedlich: 1 = Aufträge, 2 = Lieferschein, 3 = Rechnung etc. Hier nochmal beide Abfragen:
Delphi-Quellcode:
Und hier die zweite:
SELECT
ABFDocAuftragNr, ABFDocDatum, ABFDocKundeKurzbez, ABFDocSummeNetto_0, ABFPosMenge as bestellt, ABFPosArtNr, ABFPosName1 FROM ABFDok INNER JOIN ABFPos ON ABFDok.ABFDocAuftragID = ABFPos.ABFPosDocID WHERE ABFDocOptFertig = false AND ABFDocVisType = 1 AND ABFPosEPreis > 0 AND ABFPosType IN (0, 7) AND ABFPosNr <> '' order by ABFDocAuftragNr;
Delphi-Quellcode:
Wahrscheinlich wird es noch deutlicher wenn man sich meine zuvor geposteten Screenshots ansieht.
SELECT
ABFDocAuftragNr, ABFPosArtNr, SUM(ABFPosMenge) AS Geliefert FROM ABFDok INNER JOIN ABFPos ON ABFDok.ABFDocID = ABFPos.ABFPosdocID WHERE ABFDocOptFertig = false AND ABFDocVisType = 2 AND ABFPosEPreis > 0 AND ABFPosType IN (0, 7) AND ABFPosNr <> '' GROUP BY ABFPosArtNr, ABFDocAuftragNr ORDER BY ABFPosArtNr; Vielen lieben Dank nochmals für Eure Mühe. LG Harry |
AW: Ergebnis auf einen Datensatz reduzieren
Im Prinzip habe ich auch nichts anderes gemacht als die beiden Abfragen zu kombinieren. Die erste Abfrage mit den "bestellt"-Werten habe ich um ein Feld "geliefert" ergänzt, dass durch ein Sub-Select realisiert wird. Offenbar gibt es aber bei Access ein Problem mit der verwendeten Syntax.
|
AW: Ergebnis auf einen Datensatz reduzieren
Ja, ja Uwe Dein Code läuft, es ist derselbe wie in Abfrage 2. Dieser bringt mir korrekt die gelieferten Mengen. Aber damit kann ich nicht die ursprünglich im Auftrag bestellte Menge sehen, sondern nur die bereits gelieferten.
LG Harry |
AW: Ergebnis auf einen Datensatz reduzieren
Das war mein erster Code. Der zweite ist der mit dem Subselect. Hier nochmal in abgewandelter Form mit vollständigen Alias:
SQL-Code:
SELECT
Dok.ABFDocAuftragNr, Dok.ABFDocDatum, Dok.ABFDocKundeKurzbez, Dok.ABFDocSummeNetto_0, Pos.ABFPosMenge as bestellt, Pos.ABFPosArtNr, Pos.ABFPosName1, (SELECT SUM(subPos.ABFPosMenge) FROM ABFDok subDok INNER JOIN ABFPos subPos ON subDok.ABFDocID = subPos.ABFPosdocID WHERE subDok.ABFDocAuftragNr = Dok.ABFDocAuftragNr AND subPos.ABFPosArtNr = Pos.ABFPosArtNr AND subDok.ABFDocOptFertig = false AND subDok.ABFDocVisType = 2 AND subPos.ABFPosEPreis > 0 AND subPos.ABFPosType IN (0, 7) AND subPos.ABFPosNr <> '' ) AS geliefert FROM ABFDok Dok INNER JOIN ABFPos Pos ON Dok.ABFDocAuftragID = Pos.ABFPosDocID WHERE Dok.ABFDocOptFertig = false AND Dok.ABFDocVisType = 1 AND Pos.ABFPosEPreis > 0 AND Pos.ABFPosType IN (0, 7) AND Pos.ABFPosNr <> '' order by Dok.ABFDocAuftragNr; |
AW: Ergebnis auf einen Datensatz reduzieren
Klappt das?
SQL-Code:
select
ABFDocAuftragNr, ABFDocDatum, ABFDocKundeKurzbez, ABFDocSummeNetto_0, Sum(Geliefert) as Geliefert, Sum(Bestellt) as Bestellt, ABFPosArtNr, ABFPosName1 from ( SELECT ABFDocAuftragNr, ABFDocDatum, ABFDocKundeKurzbez, ABFDocSummeNetto_0, 0 as Geliefert, ABFPosMenge as Bestellt, ABFPosArtNr, ABFPosName1 FROM ABFDok INNER JOIN ABFPos ON ABFDok.ABFDocAuftragID = ABFPos.ABFPosDocID WHERE ABFDocOptFertig = false AND ABFDocVisType = 1 AND ABFPosEPreis > 0 AND ABFPosType IN (0, 7) AND ABFPosNr <> '' union all SELECT ABFDocAuftragNr, ABFDocDatum, ABFDocKundeKurzbez, ABFDocSummeNetto_0, 0 as Geliefert, Sum(ABFPosMenge) as Bestellt, ABFPosArtNr, ABFPosName1 FROM ABFDok INNER JOIN ABFPos ON ABFDok.ABFDocID = ABFPos.ABFPosdocID WHERE ABFDocOptFertig = false AND ABFDocVisType = 2 AND ABFPosEPreis > 0 AND ABFPosType IN (0, 7) AND ABFPosNr <> '' GROUP BY ABFPosArtNr, ABFDocAuftragNr ) a group by ABFDocAuftragNr, ABFDocDatum, ABFDocKundeKurzbez, ABFDocSummeNetto_0, ABFPosArtNr, ABFPosName1 ORDER BY ABFPosArtNr; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz