AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Währungsumrechnung mit decode()

Währungsumrechnung mit decode()

Ein Thema von p80286 · begonnen am 17. Okt 2014 · letzter Beitrag vom 19. Okt 2014
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

Währungsumrechnung mit decode()

  Alt 17. Okt 2014, 12:10
Datenbank: Oracle • Version: 10 • Zugriff über: ADO
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 decode ?

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

Gruß und vielen Dank im vorraus
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Währungsumrechnung mit decode()

  Alt 17. Okt 2014, 12:24
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.
Ralph

Geändert von Jumpy (17. Okt 2014 um 12:30 Uhr) Grund: 2. Beispiel, To_Char vergessen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Währungsumrechnung mit decode()

  Alt 17. Okt 2014, 12:29
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.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (17. Okt 2014 um 12:34 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Währungsumrechnung mit decode()

  Alt 17. Okt 2014, 14:18
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Währungsumrechnung mit decode()

  Alt 17. Okt 2014, 16:30
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Währungsumrechnung mit decode()

  Alt 19. Okt 2014, 21:12
@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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 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