Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Statement funktioniert nicht (https://www.delphipraxis.net/161518-sql-statement-funktioniert-nicht.html)

khh 7. Jul 2011 09:55

Datenbank: firebird • Version: 2.1 • Zugriff über: zeos

SQL-Statement funktioniert nicht
 
Hallo zusammen
folgendes Statement :
Code:
update artikelpreise p1
set p1.bruttopreis =
(SELECT bruttoneu as bruttopreis FROM artikelpreiseaenderung p2
WHERE p1.artikelpreis_id = p2.artikelpreis_id ),  
p1.nettopreis = (SELECT (bruttoneu / (100  + p2.mwstsatz ) *100 ) as nettopreis FROM artikelpreiseaenderung p2
WHERE p1.artikelpreis_id = p2.artikelpreis_id )
funktioniert solange in artikelpreise und artikelpreiseaenderung die gleiche Anzahl DS vorhanden sind.
Wenn in der Tabelle artikelpreise aber weitere DS stehen werden diese logischerweise auf 0 gesetzt.

Das Statement wie folgt zu erweitern funktioniert auch nicht:

Code:
update artikelpreise p1
set p1.bruttopreis =
(SELECT bruttoneu as bruttopreis FROM artikelpreiseaenderung p2
WHERE p1.artikelpreis_id = p2.artikelpreis_id ),  
p1.nettopreis = (SELECT (bruttoneu / (100  + p2.mwstsatz ) *100 ) as nettopreis FROM artikelpreiseaenderung p2
WHERE p1.artikelpreis_id = p2.artikelpreis_id )


WHERE p1.artikelpreis_id = p2.artikelpreis_id;
hier kennt er p2 der letzten where-Klausel nicht:-(

was mache ich falsch?


Danke Gruss KH

mkinzler 7. Jul 2011 10:06

AW: SQL-Statement funkt nicht
 
Erstelle einen Execution Block und drreh die Logik um:
Schleife über die Ändetungen und dann Update.

Noch besser wäre es aber, die Artikeltabelle zu "snow-flaken" ( Erweiterung um Gültigkeitsbereich)

jobo 7. Jul 2011 10:21

AW: SQL-Statement funkt nicht
 
Das Update Statement selbst braucht auch eine Where Clause, wenn Du bei einem reinen Update Statement bleiben willst.

zb.
SQL-Code:
update artikelpreise p1
   set p1.bruttopreis =
        (SELECT bruttoneu as bruttopreis
           FROM artikelpreiseaenderung p2
          WHERE p1.artikelpreis_id = p2.artikelpreis_id),
       p1.nettopreis =
        (SELECT (bruttoneu / (100 + p2.mwstsatz) * 100)
         as nettopreis
           FROM artikelpreiseaenderung p2
          WHERE p1.artikelpreis_id = p2.artikelpreis_id)
  where p1.artikelpreis_id in
       (select artikelpreis_id from artikelpreiseaenderung )
Ich weiß aber nicht, ob 'where.. in..' so in Firbird funktioniert, notfalls dazu die Syntax anpassen.

DeddyH 7. Jul 2011 10:34

AW: SQL-Statement funkt nicht
 
IIRC funktioniert das so (kann ich hier aber gerade mangels Firebird nicht probieren), aber man kann zur Not auch auf EXISTS ausweichen.

jobo 7. Jul 2011 10:37

AW: SQL-Statement funkt nicht
 
Ich hab hier kein FB, aber wenn wir das demokratisch regeln können:
Ich bin auch dafür, dass es funktioniert! ;)

DeddyH 7. Jul 2011 10:38

AW: SQL-Statement funkt nicht
 
:cheers:

Luckie 7. Jul 2011 10:45

AW: SQL-Statement funkt nicht
 
@khh: Ich würde dich bitten wenigstens den Beitragstitel in ordentlichen Deutsch zu verfassen, damit man mit der Suche zumindest eine minimale Chance hat den Beitrag zu finden. Danke.

jobo 7. Jul 2011 10:54

AW: SQL-Statement funkt nicht
 
Aber die Beiträg müsen nich in orntlichen deutsch oder? ;)

khh 7. Jul 2011 11:28

AW: SQL-Statement funkt nicht
 
Zitat:

Zitat von jobo (Beitrag 1110507)
Das Update Statement selbst braucht auch eine Where Clause, wenn Du bei einem reinen Update Statement bleiben willst.

zb.
SQL-Code:
update artikelpreise p1
   set p1.bruttopreis =
        (SELECT bruttoneu as bruttopreis
           FROM artikelpreiseaenderung p2
          WHERE p1.artikelpreis_id = p2.artikelpreis_id),
       p1.nettopreis =
        (SELECT (bruttoneu / (100 + p2.mwstsatz) * 100)
         as nettopreis
           FROM artikelpreiseaenderung p2
          WHERE p1.artikelpreis_id = p2.artikelpreis_id)
  where p1.artikelpreis_id in
       (select artikelpreis_id from artikelpreiseaenderung )
Ich weiß aber nicht, ob 'where.. in..' so in Firbird funktioniert, notfalls dazu die Syntax anpassen.

ich danke euch, so funktionierts :-)
wobei ich hier überlege, ob 'where.. in..' nicht ziemlich zeitintensiv ist?

p80286 7. Jul 2011 11:33

AW: SQL-Statement funkt nicht
 
Zitat:

Zitat von Luckie (Beitrag 1110515)
@khh: Ich würde dich bitten wenigstens den Beitragstitel in ordentlichen Deutsch zu verfassen, damit man mit der Suche zumindest eine minimale Chance hat den Beitrag zu finden. Danke.

Wo ist das Problem?
"Das SQL-Statement funkt nicht". Eine klare unmißverständliche Aussage.
Ich frage mich nur was sollte ein SQL-Statement funken?
Sind da bestimmte Frequenzen von betroffen?
Handelt es sich vllt. um Morsecodes?
(nein, dann würde man von Morsen und nicht von Funken sprechen)

Gruß
K-H

khh 7. Jul 2011 11:48

AW: SQL-Statement funkt nicht
 
Zitat:

Zitat von p80286 (Beitrag 1110527)
Zitat:

Zitat von Luckie (Beitrag 1110515)
@khh: Ich würde dich bitten wenigstens den Beitragstitel in ordentlichen Deutsch zu verfassen, damit man mit der Suche zumindest eine minimale Chance hat den Beitrag zu finden. Danke.

Wo ist das Problem?
"Das SQL-Statement funkt nicht". Eine klare unmißverständliche Aussage.
Ich frage mich nur was sollte ein SQL-Statement funken?
Sind da bestimmte Frequenzen von betroffen?
Handelt es sich vllt. um Morsecodes?
(nein, dann würde man von Morsen und nicht von Funken sprechen)

Gruß
K-H

sorry, habs inzwischen geändert ;-)

joachimd 7. Jul 2011 12:19

AW: SQL-Statement funkt nicht
 
wird folgendes auch unterstützt?
SQL-Code:
UPDATE a
SET a.val = b.Val
FROM a INNER JOIN b ON a.id = b.id
Damit wäre es übersichtlicher ... und wahrscheinlich auch schneller

SQL-Code:
UPDATE artikelpreise
   SET bruttopreis = b.bruttoneu,
       nettopreis = (b.bruttoneu / (100 + b.mwstsatz) * 100)
FROM artikelpreise
INNER JOIN artikelpreiseaenderung b
  ON artikelpreise.artikelpreis_id=b.artikelpreis_id

alex517 7. Jul 2011 14:38

AW: SQL-Statement funktioniert nicht
 
versuchs doch mal damit
Code:
MERGE
  INTO ARTIKELPREISE P
  USING ( SELECT A.ARTIKELPREIS_ID, A.BRUTTONEU, (A.BRUTTONEU / (100 + A.MWSTSATZ ) * 100 ) as NETTOPREISNEU
            FROM artikelpreiseaenderung A) PA
  ON (P.ARTIKELPREIS_ID = PA.ARTIKELPREIS_ID)
  WHEN MATCHED THEN
    UPDATE SET
      P.BRUTTOPREIS = PA.BRUTTONEU,
      P.NETTOPREIS = PA.NETTOPREISNEU;
alex

Neumann 7. Jul 2011 16:15

AW: SQL-Statement funktioniert nicht
 
Eigentlich hat khh die Lösung schon im 1. Posting fast richtig gehabt, bis auf eine Kleinigkeit:
Code:
update artikelpreise p1
 set p1.bruttopreis =
 (SELECT bruttoneu as bruttopreis FROM artikelpreiseaenderung p2
 WHERE p1.artikelpreis_id = p2.artikelpreis_id ),
 p1.nettopreis = (SELECT (bruttoneu / (100  + p2.mwstsatz ) *100 ) as nettopreis FROM artikelpreiseaenderung p2
 WHERE p1.artikelpreis_id = p2.artikelpreis_id )


 WHERE p1.artikelpreis_id = p2.artikelpreis_id;
So sollte es funktionieren:
Code:
update artikelpreise p1
 set p1.bruttopreis =
 (SELECT bruttoneu as bruttopreis FROM artikelpreiseaenderung p2
 WHERE p1.artikelpreis_id = p2.artikelpreis_id ),
 p1.nettopreis = (SELECT (bruttoneu / (100  + p2.mwstsatz ) *100 ) as nettopreis FROM artikelpreiseaenderung p2
 WHERE p1.artikelpreis_id = p2.artikelpreis_id )


 WHERE p1.artikelpreis_id = artikelpreiseaenderung.artikelpreis_id;
Ralf

khh 8. Jul 2011 07:02

AW: SQL-Statement funktioniert nicht
 
Zitat:

Zitat von Neumann (Beitrag 1110644)
Eigentlich hat khh die Lösung schon im 1. Posting fast richtig gehabt, bis auf eine Kleinigkeit:

So sollte es funktionieren:
Code:
update artikelpreise p1
 set p1.bruttopreis =
 (SELECT bruttoneu as bruttopreis FROM artikelpreiseaenderung p2
 WHERE p1.artikelpreis_id = p2.artikelpreis_id ),
 p1.nettopreis = (SELECT (bruttoneu / (100  + p2.mwstsatz ) *100 ) as nettopreis FROM artikelpreiseaenderung p2
 WHERE p1.artikelpreis_id = p2.artikelpreis_id )


 WHERE p1.artikelpreis_id = artikelpreiseaenderung.artikelpreis_id;
Ralf

das dachte ich ursprünglich auch, aber mit Angabe des Tabellennamens anstatt p2 erhalte ich
sql-error -206 column unknown.
Die Lösung mit "where ..in " funktioniert hingegen.
Die matched und join-Lösungen muss ich noch testen.

Ich danke euch
Gruss KHH

Jumpy 8. Jul 2011 07:29

AW: SQL-Statement funktioniert nicht
 
Mmn kann das so doch auch nicht funktionieren. Wenn man das updaten mal rausläßt (und so tut als wäre es ein Select) steht doch in dem Statement:

Select p1.bruttopreis, p1.nettopreis From artikelpreise p1
WHERE p1.artikelpreis_id = artikelpreiseaenderung.artikelpreis_id;

Und das kann in keiner der Formen (p2 oder Tabellenname) funktionieren. Wenn in p2 nur ein Element stünde ginge

WHERE p1.artikelpreis_id = (Select p2.artikelpreis_id from artikelpreiseaenderung p2);

Da aber i.d.R. mehrere Elemente zurückgeliefert werden "in" statt "=".


In der Schule hatten wir neulich noch so Spezialbefehle, die ich schon wieder vergessen habe, weil wir die in der Firma nicht benutzen sollen. Damit konnte man die Schnittmenge bilden usw., das würde auch gehen.

Neumann 8. Jul 2011 08:33

AW: SQL-Statement funktioniert nicht
 
Stimmt, so wie ich gedacht habe funktioniert es nicht.

Habe mal bei mir getestet und die Tabellennamen usw. an das angepasst was ich gerade zur Verfügung hatte.

Dieses funktioniert jetzt:
Code:
SET TERM ^ ;

CREATE OR ALTER PROCEDURE P_PREISNEU
as
declare variable part integer;
declare variable psumme numeric(12,4);
begin
  for select art_nr,neupreis from preisaenderungen into :part, :psumme do
  begin
    update Verkaufsartikel p1
    set p1.preis = :psumme,
        p1.preis_2 = :psumme / (100  + 19 ) *100

    WHERE p1.art_nr = :part;
  end

end^

SET TERM ; ^

GRANT SELECT ON PREISAENDERUNGEN TO PROCEDURE P_PREISNEU;

GRANT SELECT,UPDATE ON VERKAUFSARTIKEL TO PROCEDURE P_PREISNEU;

GRANT EXECUTE ON PROCEDURE P_PREISNEU TO SYSDBA;
Denke mal das kann man leicht anpassen.

Ralf

omata 8. Jul 2011 08:45

AW: SQL-Statement funktioniert nicht
 
Vielleicht so...

SQL-Code:
UPDATE artikelpreise
SET bruttopreis = (SELECT bruttoneu
                   FROM artikelpreiseaenderung
                   WHERE artikelpreis_id = artikelpreise.artikelpreis_id),
    nettopreis = (SELECT bruttoneu / (100  + mwstsatz ) * 100
                  FROM artikelpreiseaenderung
                  WHERE artikelpreis_id = artikelpreise.artikelpreis_id)
WHERE artikelpreis_id IN (SELECT artikelpreis_id
                          FROM artikelpreiseaenderung)

alex517 8. Jul 2011 09:18

AW: SQL-Statement funktioniert nicht
 
Zitat:

Zitat von omata (Beitrag 1110754)
Vielleicht so...

SQL-Code:
UPDATE artikelpreise
SET bruttopreis = (SELECT bruttoneu
                   FROM artikelpreiseaenderung
                   WHERE artikelpreis_id = artikelpreise.artikelpreis_id),
    nettopreis = (SELECT bruttoneu / (100  + mwstsatz ) * 100
                  FROM artikelpreiseaenderung
                  WHERE artikelpreis_id = artikelpreise.artikelpreis_id)
WHERE artikelpreis_id IN (SELECT artikelpreis_id
                          FROM artikelpreiseaenderung)

Diese Lösung funktioniert zwar, hat aber den Nachteil, dass die Tabelle 'artikelpreiseaenderung' 3x durchlaufen wird.
Und zwar jeweils für jedes Subselect ('nettopreis', 'bruttopreis' und 'where in (Select..)'.
Falls weitere Felder "upgedatet" werden müssen, kommt jeweils ein Durchlauf dazu..

Bei der Verwendung von
SQL-Code:
   <merge statement> ::=
      MERGE
         INTO <table or view> [ [AS] <correlation name> ]
         USING <table or view or derived table> [ [AS] <correlation name> ]
         ON <condition>
         [ <merge when matched> ]
         [ <merge when not matched> ]

   <merge when matched> ::=
      WHEN MATCHED THEN
         UPDATE SET <assignment list>

   <merge when not matched> ::=
      WHEN NOT MATCHED THEN
         INSERT [ <left paren> <column list> <right paren> ]
            VALUES <left paren> <value list> <right parent>
siehe hier #13,
wird 'artikelpreiseaenderung' nur einmal durchlaufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 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