Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Was ist an diesem Statement falsch? (https://www.delphipraxis.net/103091-ist-diesem-statement-falsch.html)

DeddyH 9. Nov 2007 19:37

Datenbank: ABS DB • Zugriff über: DBManager

Was ist an diesem Statement falsch?
 
Wieso mag ABS DB die letzte Zeile nicht? Bin ich betriebsblind?
SQL-Code:
SELECT C.Bezeichnung AS Artikel,C.Preis AS Einzelpreis,B.Menge AS Menge,D.Wert AS 'MwSt %',
(C.Preis * B.Menge) AS 'Gesamt Netto',(C.Preis * (1 + D.Wert / 100) * Menge) AS 'Gesamt Brutto'
FROM Beleg A
JOIN BelegPos B ON B.Beleg_id = A.Id
JOIN Artikel C ON C.Id = B.Artikel_id
JOIN MwStSatz D ON D.Gruppe_ID = C.MwStGruppeId
WHERE A.Id = 1
AND D.gueltig_seit = (SELECT MAX(M.gueltig_seit) AS aktuell
                      FROM MwStSatz M
                      WHERE M.Gruppe_ID = D.Gruppe_ID)
                      --AND M.gueltig_seit <= A.Datum)
Ich möchte doch nur den MwSt-Satz ermitteln, der zum Zeitpunkt des Belegdatums gültig war. Entferne ich den Kommentar, erhalte ich die Fehlermeldung Search condition is not applicable - Native error: 30144. Lasse ich den Kommentar so, wie er oben ist, erhalte ich immer den aktuellsten Satz ohne Berücksichtigung des Belegdatums :wall:


[edit] So hätte ich es gerne, wird aber wie gesagt moniert:
SQL-Code:
SELECT C.Bezeichnung AS Artikel,C.Preis AS Einzelpreis,B.Menge AS Menge,D.Wert AS 'MwSt %',
(C.Preis * B.Menge) AS 'Gesamt Netto',(C.Preis * (1 + D.Wert / 100) * Menge) AS 'Gesamt Brutto'
FROM Beleg A
JOIN BelegPos B ON B.Beleg_id = A.Id
JOIN Artikel C ON C.Id = B.Artikel_id
JOIN MwStSatz D ON D.Gruppe_ID = C.MwStGruppeId
WHERE A.Id = 1
AND D.gueltig_seit = (SELECT MAX(M.gueltig_seit) AS aktuell
                      FROM MwStSatz M
                      WHERE M.Gruppe_ID = D.Gruppe_ID
                      AND M.gueltig_seit <= A.Datum)
[/edit]

mkinzler 9. Nov 2007 19:38

Re: Was ist an diesem Statement falsch?
 
Weil der Alias M außerhalb des Subselects unbekannt ist.

DeddyH 9. Nov 2007 19:40

Re: Was ist an diesem Statement falsch?
 
Nee, das ist es nicht. Die letzte Klammer vor dem Kommentar ist noch vom C & P übrig geblieben, dafür soll der Kommentar entfernt werden, dessen Klammer gilt.

mkinzler 9. Nov 2007 19:46

Re: Was ist an diesem Statement falsch?
 
Versuch mal
SQL-Code:
AND MAX(M.gueltig_seit) <= A.Datum)

DeddyH 9. Nov 2007 19:48

Re: Was ist an diesem Statement falsch?
 
Dieselbe Fehlermeldung. Der Subselect alleine wird auch anstandslos ausgeführt, ich versteh so langsam die Welt nicht mehr.

mkinzler 9. Nov 2007 19:49

Re: Was ist an diesem Statement falsch?
 
Schon mit HAVING satt WHERE versucht (wegen Gruppierung) oder eine sortierete limitiertung Abfrage

DeddyH 9. Nov 2007 19:51

Re: Was ist an diesem Statement falsch?
 
Gruppierung mit HAVING hab ich auch schon durch. Mir fehlt lediglich der Vergleich mit dem Belegdatum, dann ist das Ding eingetütet.

mkinzler 9. Nov 2007 19:53

Re: Was ist an diesem Statement falsch?
 
Unterstützt ABS Limitierung?

DeddyH 9. Nov 2007 19:54

Re: Was ist an diesem Statement falsch?
 
Weiß ich nicht, ich habe es erst vor 3 Stunden installiert :oops:

Dax 9. Nov 2007 19:58

Re: Was ist an diesem Statement falsch?
 
Klappt es vielleicht so?
SQL-Code:
SELECT C.Bezeichnung AS Artikel,C.Preis AS Einzelpreis,B.Menge AS Menge,D.Wert AS 'MwSt %',
(C.Preis * B.Menge) AS 'Gesamt Netto',(C.Preis * (1 + D.Wert / 100) * Menge) AS 'Gesamt Brutto'
FROM Beleg A
JOIN BelegPos B ON B.Beleg_id = A.Id
JOIN Artikel C ON C.Id = B.Artikel_id
JOIN MwStSatz D ON D.Gruppe_ID = C.MwStGruppeId
WHERE A.Id = 1
AND D.gueltig_seit = (SELECT MAX(M.gueltig_seit) AS aktuell
                      FROM MwStSatz M, Beleg A1
                      WHERE M.Gruppe_ID = D.Gruppe_ID
                      AND M.gueltig_seit <= A1.Datum AND A1.ID = 1)
Eventuell mag ABS den Verweis auf einen Alias außerhalb des Subselects nicht, was ich aber auch nicht so recht glauben kann :gruebel:

DeddyH 9. Nov 2007 20:02

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von Dax
Eventuell mag ABS den Verweis auf einen Alias außerhalb des Subselects nicht, was ich aber auch nicht so recht glauben kann :gruebel:

Dann würde der Vergleich mit D auch nicht gehen. Irgendwie scheint ABS den Vergleich mit A nicht zu mögen (was ist nur an dieser Tabelle dran?)

[edit] Mit Deinem Statement bekomme ich zwar ein Ergebnis, aber eine Position wird unterschlagen :wall: [/edit]

mkinzler 9. Nov 2007 20:03

Re: Was ist an diesem Statement falsch?
 
Erweitere die Abfrage auf A mal um das Datumsfeld

Dax 9. Nov 2007 20:03

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von DeddyH
Dann würde der Vergleich mit D auch nicht gehen. Irgendwie scheint ABS den Vergleich mit A nicht zu mögen (was ist nur an dieser Tabelle dran?)

Ja, deswegen verwundert mich es ja so sehr, dass es ausgerechnet bei A nicht funktioniert.. Ist auf gueltig_seit ein Index bzw keiner und hast du es mal mit/ohne probiert?

DeddyH 9. Nov 2007 20:06

Re: Was ist an diesem Statement falsch?
 
Die Tabelle MwStSatz sieht so aus:
SQL-Code:
CREATE TABLE MwStSatz (
  gueltig_seit DATE NOT NULL,
  Gruppe_ID INTEGER NOT NULL,
  Wert FLOAT NOT NULL,
  PRIMARY KEY IndexName (Gruppe_ID, Wert, gueltig_seit)
);

mkinzler 9. Nov 2007 20:08

Re: Was ist an diesem Statement falsch?
 
Warum ist der Wert Teil des Primärschlüssels?
@Dax: was ist mit deinem Profil los?

DeddyH 9. Nov 2007 20:10

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von mkinzler
Warum ist der Wert Teil des Primärschlüssels?

Gute Frage :gruebel:

Dax 9. Nov 2007 20:11

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von DeddyH
[edit] Mit Deinem Statement bekomme ich zwar ein Ergebnis, aber eine Position wird unterschlagen :wall: [/edit]

Das klingt für mich sehr nach einem Fehler in ABS (zugegeben, ich bin sehr pessimistisch) :?


Zitat:

Zitat von mkinzler
@Dax: was ist mit deinem Profil los?

Wenn ich das mal wüsste!

DeddyH 9. Nov 2007 20:12

Re: Was ist an diesem Statement falsch?
 
Das scheint mir auch bald so, dass ABS mit so "komplexen" Statements nicht richtig umgehen kann.

mkinzler 9. Nov 2007 20:14

Re: Was ist an diesem Statement falsch?
 
Ich vermute mal, es liegt am falschen PK(Index) nimm mal Wert raus

DeddyH 9. Nov 2007 20:18

Re: Was ist an diesem Statement falsch?
 
Schon geschehen, keine Besserung :?

grenzgaenger 9. Nov 2007 20:18

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von DeddyH
[edit] So hätte ich es gerne, wird aber wie gesagt moniert:
SQL-Code:
SELECT C.Bezeichnung AS Artikel,C.Preis AS Einzelpreis,B.Menge AS Menge,D.Wert AS 'MwSt %',
(C.Preis * B.Menge) AS 'Gesamt Netto',(C.Preis * (1 + D.Wert / 100) * Menge) AS 'Gesamt Brutto'
FROM Beleg A
JOIN BelegPos B ON B.Beleg_id = A.Id
JOIN Artikel C ON C.Id = B.Artikel_id
JOIN MwStSatz D ON D.Gruppe_ID = C.MwStGruppeId
WHERE A.Id = 1
AND D.gueltig_seit = (SELECT MAX(M.gueltig_seit) AS aktuell
                      FROM MwStSatz M
                      WHERE M.Gruppe_ID = D.Gruppe_ID
                      AND M.gueltig_seit <= A.Datum)
[/edit]

hab mir zwar nicht alle beiträge angeguckt, aber schlicht und einfach ist der fehler, dass du hier 'n subselect hast... also abfrage is exits oder in... dann sollte das auch klappen.

mfg.
ggg

mkinzler 9. Nov 2007 20:20

Re: Was ist an diesem Statement falsch?
 
Subselect sollte aber nur einen Wert zurückliefern, dann wäre in nicht unbedingt notwendig, aber schaden kann es natürlich nicht.

DeddyH 9. Nov 2007 20:21

Re: Was ist an diesem Statement falsch?
 
Na gut, in Anbetracht dessen, dass ich das hier nur für jemand anderen zur Verdeutlichung der Mehrwertsteuer-Problematik mache, habe ich jetzt keine Lust mehr, mich noch weiter zu ärgern. Dann muss man halt im ersten Schritt den jeweils aktuellen Prozentsatz je Gruppe ermitteln und daraus dann am Frontend ein entsprechendes zweites Statement zusammenbasteln (obwohl ich sowas hasse).

P.S.: Mit IN hab ich auch schon experimentiert, bringt auch nix.

grenzgaenger 9. Nov 2007 20:37

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von mkinzler
Subselect sollte aber nur einen Wert zurückliefern, dann wäre in nicht unbedingt notwendig, aber schaden kann es natürlich nicht.

tja, ausserdem ist noch any und some zulässig, wenn ich mich nicht irre. einfach mal ind er hilfe anchgugen... mit '=' klappt es auf alle fälle nicht.

Dax 9. Nov 2007 20:42

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von grenzgaenger
tja, ausserdem ist noch any und some zulässig, wenn ich mich nicht irre. einfach mal ind er hilfe anchgugen... mit '=' klappt es auf alle fälle nicht.

Möglicherweise ist es eine Postgres-Erweiterung von SQL (was ich aber nicht denke), aber dort funktioniert sowas.

grenzgaenger 9. Nov 2007 20:48

Re: Was ist an diesem Statement falsch?
 
tja, nach ANSI SQL ist das jedenfalls nicht erlaubt. ist möglich, dass dies die lokale datenbank unterstützt, aber darauf sollte man sich normal nicht verlassen. wie gesagt es gibt verschiedene statemens, welche subselects unterstützen.. IN, IS EXISTS, ANY, SOME ...

und noch 'n schönen abend

PS: teilweise wissen auch die datenbank hersteller nichtgenau was sie machen... ;-) . daher mal im handbuch nachsehen ... :-)

grenzgaenger 9. Nov 2007 20:51

Re: Was ist an diesem Statement falsch?
 
Zitat:

Zitat von DeddyH
P.S.: Mit IN hab ich auch schon experimentiert, bringt auch nix.

wie wär es mal, das ganze mit 'ner ansi SQL DB auszuprobieren... und nicht immer diese exotischen derivate...

TBx 9. Nov 2007 21:38

Re: Was ist an diesem Statement falsch?
 
N'Abend!

Lass doch mal das hier überflüssige
SQL-Code:
AS aktuell
aus dem Subselect raus.
Ich würde die Fehlermeldung dahingehend interpretieren, dass er das Feld nicht kennt, kennt ABS Feldnamen womöglich nicht mehr, sobald man einen Alias draufgelegt hat?
Ist vielleicht ja nen Versuch Wert.

Gruß

onlinekater

DeddyH 10. Nov 2007 10:29

Re: Was ist an diesem Statement falsch?
 
Danke für die vielen Vorschläge. Ich habe es mittlerweile so gelöst wie in #23 angedeutet. Ist zwar nicht schön, funktioniert aber.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz