![]() |
Datenbank: firebird • Version: 2.1 • Zugriff über: zeos
SQL-Statement funktioniert nicht
Hallo zusammen
folgendes Statement :
Code:
funktioniert solange in artikelpreise und artikelpreiseaenderung die gleiche Anzahl DS vorhanden sind.
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 ) 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:
hier kennt er p2 der letzten where-Klausel nicht:-(
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; was mache ich falsch? Danke Gruss KH |
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) |
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:
Ich weiß aber nicht, ob 'where.. in..' so in Firbird funktioniert, notfalls dazu die Syntax anpassen.
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 ) |
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.
|
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! ;) |
AW: SQL-Statement funkt nicht
:cheers:
|
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.
|
AW: SQL-Statement funkt nicht
Aber die Beiträg müsen nich in orntlichen deutsch oder? ;)
|
AW: SQL-Statement funkt nicht
Zitat:
wobei ich hier überlege, ob 'where.. in..' nicht ziemlich zeitintensiv ist? |
AW: SQL-Statement funkt nicht
Zitat:
"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 |
AW: SQL-Statement funkt nicht
Zitat:
|
AW: SQL-Statement funkt nicht
wird folgendes auch unterstützt?
SQL-Code:
Damit wäre es übersichtlicher ... und wahrscheinlich auch schneller
UPDATE a
SET a.val = b.Val FROM a INNER JOIN b ON a.id = b.id
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 |
AW: SQL-Statement funktioniert nicht
versuchs doch mal damit
Code:
alex
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; |
AW: SQL-Statement funktioniert nicht
Eigentlich hat khh die Lösung schon im 1. Posting fast richtig gehabt, bis auf eine Kleinigkeit:
Code:
So sollte es funktionieren:
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;
Code:
Ralf
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; |
AW: SQL-Statement funktioniert nicht
Zitat:
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 |
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. |
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:
Denke mal das kann man leicht anpassen.
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; Ralf |
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) |
AW: SQL-Statement funktioniert nicht
Zitat:
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:
siehe
<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> ![]() wird 'artikelpreiseaenderung' nur einmal durchlaufen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 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