Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Währungsumrechnung mit decode() (https://www.delphipraxis.net/182333-waehrungsumrechnung-mit-decode.html)

p80286 17. Okt 2014 12:10

Datenbank: Oracle • Version: 10 • Zugriff über: ADO

Währungsumrechnung mit decode()
 
Allo zusammen,
bei dieser abfrage bekommt der ADO-Treiber einen über sich:
Code:
select country
      ,to_char(sum(amount),'9999990D00')
      ,currency
      ,decode(currency,'USD',to_char(sum(amount)/1.25,'9999990D00')
                      ,'SEK',to_char(sum(amount)/9.15,'9999990D00')
                      ,'NOK',to_char(sum(amount)/8.38,'9999990D00')
                      ,'GBP',to_char(sum(amount)/0.79,'9999990D00'))
Meldung:
Zitat:

ADO-Error(s):

Error-No.: 0x80040E21
Fehler bei einem aus mehreren Schritten bestehenden Vorgang. Prüfen Sie die einzelnen Statuswerte.; (SQLState: )
Source: Microsoft Cursor Engine
NativeError: 0
Da ich für eine einmalige Abfrage nicht noch einen Währungsrechner implementieren will, welche Alternative hätte ich zu
SQL-Code:
decode
?

(Es mit Hilfe von
SQL-Code:
union
zu lösen halte ich für nicht so optimal)

Gruß und vielen Dank im vorraus
K-H

Jumpy 17. Okt 2014 12:24

AW: Währungsumrechnung mit decode()
 
Vielleicht reich ja für eine einmalige Sache eine Umformulierung:

SQL-Code:
Select
  country, currency,
  to_char(amount,'9999990D00') as amount,    
  decode(currency,'USD',to_char(amount/1.25,'9999990D00')
                 ,'SEK',to_char(amount/9.15,'9999990D00')
                 ,'NOK',to_char(amount/8.38,'9999990D00')
                 ,'GBP',to_char(amount/0.79,'9999990D00')
                 ,null
         ) as CalculatedAmount
From
(
  Select Distinct country ,sum(amount) as amount,currency
  From Tabelle
)
oder

SQL-Code:
Select
  country, currency,
  to_char(amount,'9999990D00') as amount,    
  decode(currency,'USD',amountUSD)
                 ,'SEK',amountSEK)
                 ,'NOK',amountNOK)
                 ,'GBP',amountGBP)
                 ,null
         ) as CalculatedAmount
From
(
  Select Distinct
    country,currency,
    sum(amount) as amount,
    to_char(sum(amount)/1.25,'9999990D00') as amountusd,
    to_char(sum(amount)/9.15,'9999990D00') as amountsek,
    ...
  From Tabelle
)
Wichtig ist natürlich irgendein Grouping (bei mir durch distinct). Erwähne ich nur, weil das aus deinem Post nicht hervorgeht.

p80286 17. Okt 2014 12:29

AW: Währungsumrechnung mit decode()
 
Danke! muß ich mal ausprobieren.

Ein Kollege hat mir folgenden Tip gegeben der wohl funktioniert:
Code:
select country
      ,to_char(sum(amount),'9999990D00')
      ,currency
      ,case currency when 'USD' then to_char(sum(amount)/1.25,'9999990D00')
                     when 'SEK' then to_char(sum(amount)/9.15,'9999990D00')
                     when 'NOK' then to_char(sum(amount)/8.38,'9999990D00')
                     when 'GBP' then to_char(sum(amount)/0.79,'9999990D00')
                    else         ' ??? '
end inEuro
vielen Dank nochmal
Gruß
K-H

Nachtrag:
Zitat:

Wichtig ist natürlich irgendein Grouping (bei mir durch distinct). Erwähne ich nur, weil das aus deinem Post nicht hervorgeht.
Ist klar, sonst könnten sum und count und .. doch garnicht mitspielen Das Problem ist ja eher der ADO-Treiber der mit dem ellenlangen decode (es fehlen noch ein paar Länder) nicht klarkommt.

jobo 17. Okt 2014 14:18

AW: Währungsumrechnung mit decode()
 
Ich wär mir nicht sicher, dass es an der Menge der Elemente liegt.
Eher der Typ der Ausgabe von decode. Die kann ja Text, Date usw sein.

Decode bzw Oracle weiß zu Begin des Aufrufes selbst nicht, welchen Typ das Ergebnis hat und bestimmt das nach irgendeinem definierten Verfahren. Wenn man das nicht berücksichtigt, fliegt auch gleich das Decode auf die Nase.
Ich glaube es ist sowas wie: Spaltenergebnis Typ = Typ der erstmaligen Auswertung oder sowas.
Naja und wenn der Server da schon so nachdenken muss, dann Ado erst Recht.
Ein Union könnte also dem Treiber helfen, indem man eine Dummyzeile an den Anfang setzt mit einem Texttyp für die Spalte. (Muss im Endergebnis natürlich wieder verschwinden)

Ansonsten noch ein Union, der alle Währungen mit Faktor aufführt und zur Hauptabfrage gejoined wird, dann ist das ganze decode raus.

Aber ist ja eh gelöst.

Sir Rufo 17. Okt 2014 16:30

AW: Währungsumrechnung mit decode()
 
Wenn du abhängig von currency die passende Umrechnung haben möchtest, warum dann keine separate Währungstabelle und die per JOIN dazunehmen?

Dieses Geschreibsel ist doch nur unübersichtlich und auch noch schlecht wartbar.
SQL-Code:
select country
      ,to_char(sum(amount),'9999990D00')
      ,currency
      ,to_char(sum(amount)/curr.factor,'9999990D00')
join curr on curr.code = currency
Wenn du auch unbekannte Währungen berücksichtigen musst, dann eben ein LEFT JOIN

p80286 19. Okt 2014 21:12

AW: Währungsumrechnung mit decode()
 
@jobo
Das ist eine interessante Idee, mal schauen ob man mit dem Union was erreichen kann.

@Sir Rufo
Das ist nur eine ad hoc Lösung, da die zugehörige Währungstabelle sehr individuelle Daten enthält und ich eine schnelle Lösung brauchte. Sobald klar ist mit welchen Faktoren die Umrechnung vorgenommen werden soll, werde ich eine Standardlösung implementieren.

Gruß
K-H


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