-
sql0802 mit Dataxpress
Hallo zusammen,
wir setzen das Produkt DataXpress von Toolmaker ein, um Abfragen in Excel mit den Daten der iSeries zu verarbeiten.
Nun haben wir ne sehr große Abfrage, und es kommt der SQL Fehler SQL0802 Arithemitscher Überlauf.
Man kann sich den SQL String, den DataXpress erstellt auf Grund der Kriterien anzeigen lassen. Diesen in ne SQL auf der Maschine kopierne und es kommt keine Fehlermeldung. Sprich die Meldung kommt nur mit DataXpress.
Hat jemand eine Idee?
Hier der SQL-String, der generiert wird.
SELECT T2.APABT, T4.AUKKBZ, T1.LBAUFT, T1.AGAFO, T1.AGAAP, T1.AGAWKZ, T1.LBTNR, T3.BABEZ1, T1.GAAMEN, T1.GAARGL, (T1.GAAMEN)-(T1.GAARGL), T4.GAEASS, T1.GAADSE, T4.LBFAEL, T4.GAKULU, (((T1.AGARM)/60))+(((((T1.GAAMEN)-(T1.GAARGL)))*(T1.AGAFM)/60)), (((T1.GAAMEN)-(T1.GAARGL)))*(T1.AGAFM)/60, (T1.AGARM)/60, substr(digits(T1.GAADSE), 1, 6), T3.TBESME, T5.BEDGES, (T3.TBESME)-(T5.BEDGES), T4.GAAUN1, T4.GAAUN2 FROM (((ISUBARTD/GAAPLP AS T1 INNER JOIN ISUBARTD/ARBPLP AS T2 ON (T1.AGAAP=T2.APLATZ) ) INNER JOIN ISUBARTD/ARSP01 AS T3 ON (T1.LBTNR=T3.BAANR) ) INNER JOIN ISUBARTD/GAKOPP AS T4 ON (T1.LBAUFT=T4.LBAUFT) ) LEFT OUTER JOIN BARENTWD/BEDARFPF AS T5 ON (T1.LBTNR=T5.ARTKL) WHERE T1.GAAEND<>'E' AND T4.GAPRIO<>'E' AND (substr(T1.agaap, 1, 3))<='405' AND T1.GAADSE>=20050101 AND T1.GAADSE<=99999999 ORDER BY T4.LBFAEL, T1.LBAUFT
Vielen Dank
-
Nun, irgendwo wird der Überlauf wohl stattfinden.
Das Problem ist, dass STRSQL intern mit Anzeiger-Variablen arbeiten kann, so dass SQL-Fehler nicht zum Abbruch des Queries führen sondern das Ergebnis mit '++++' dargestellt wird.
Per ODBC-SQL besteht genau diese Möglichkeit nicht !
Wenn also bei einer Berechnung ein Fehler auftritt wird der Query eben abgebrochen.
Man hat dann nur die Möglichkeiten:
a) per STRSQL das '++++'-Ergebnis zu suchen
b) per CASE- und CAST-Ausdruck die Berechnung zu beeinflussen
z.B. Division durch 0 verhindern:
case wert2 when 0 then 0 else wert1/wert2 end
Das nächste Problem liegt ggf. an der Packed-Ausprägung.
STRSQL unterstützt ggf. bis PACKED(63,n) !
Bei ODBC-SQL ist das max. Packed(28,n), da der Datentyp Currency z.B. von Excel verwendet wird und dieser eben nur 28 Stellen unterstützt.
Hier kann dann der CAST-Ausdruck helfen:
CAST(Formel as double) oder double(Formel)
Dies geht ggf. zu Lasten der Genauigkeit, kann aber je nach Formel vernachlässigt werden.
Benötigt man diese jedoch, so sind die Zwischenergebnisse einer Formel ggf. anzupassen, da SQL intern immer das Maximum des theortisch möglichen verwendet.
Also
DEC(11, 2) * DEC(11,2) => DEC(30,4)
Wenn das tatsächliche Ergebnis aber garantiert kleiner sein kann hilft auch hier ein CAST:
DEC(Formel, 13, 2) oder
cast(Formel as dec(13, 2))
Das Ganze dann noch sinnvoll in CASE gepackt.
Bei Joins kann es noch zusätzlich Probleme geben, aber meist ist das Ergebnis NULL wenn einer der beteiligten Werte NULL ist (nicht vorhanden im Join ergibt NULL).
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks