PDA

View Full Version : Navigator SQL empfindlicher als STRSQL, wo ist der Fehler



Seiten : [1] 2

Robi
23-11-16, 12:08
dieses sql bringt im STRSQL ein ergebnis und im
Navigator den Fehler

select substr(MR1REFK, 1, 3) as was1,
substr(MR1REFK, 5, 11) as was2,
mr1dtlg, substr(MR1REFK, 5, 15) as was3,
MR1USER, MR1DIFF-MR1DIFE as std,
(select dec(max(substr(nttext, 1, 11)), 11, 2) from pntm1
where nttabl = 'PWE' and nttabw = mr1user and
ntadat <= mr1dtlg group by nttabw) as stds
FROM PPTL/MR1M1
WHERE MR1DTLG >= 20160101 AND MR1DTLG <= 20161031




SQL-Status:01565 Vendorecode 420
Zeichen in cast-Argument ungültig


Wie kann ich die Ursache suchen?
Es gibt zu JEDEM MR1USER mind. 1 PNTM1 NTTABW Satz mit 20010101 als datum
In NTTEXT steht
00000015,06 oder
00000017,33

Wie gesagt, STRSQL geht, Navigator nicht

alle Ideen wilkommen

Robi
23-11-16, 12:43
Bin etwas weiter ...
select dec(substr(nttext, 1, 11)), 11, 2) from pntm1
where nttabl = 'PWE' and nttabw <> ' '

bringt STRSQL ein Ergebnis, im Navigator nur +++++++

select dec(substr(replace(nttext, ',', '.'), 1, 11)), 11, 2) from pntm1
where nttabl = 'PWE' and nttabw <> ' '
genau umgekehrt

Im Navigator erwartet er also ein dezimal-Punkt, im STRSQL ein Komma

Habe den DEC nun so
dec(substr(nttext, 1, 11), 11, 2, ',')

das ging

Robi

Danke

Fuerchau
23-11-16, 12:45
Ich vermute mal, in den Verbindungseigenschaften im Navigator wird als Dezimaltrenner ein Punkt definiert. Wenn dann in den Daten ein Komma vorkommt, knallt es halt.
Prüfe die Dezimaleinstellungen in der Verbindung.

Anmerkung:
In einem skalaren Subselect macht ein Group By keinen Sinn, da du per direktem Bezug zu deinem übergeordneten Satz mit dem NTTABW den Maxwert erhälst.

B.Hauser
23-11-16, 17:10
Du kannst sowohl beim IBM i Navigator als auch beim STRSQL das Dezimal-Trennzeichen einstellen.
Beim STRSQL ist das Trennzeichen per Default ein Komma (vermutlich System-Wert) im IBM i Navigator standardmäßig ein Punkt.

Einstellen im IBM i Navigator:
Connection/Verbindung --> JDBC Einstellungen --> Format --> Decimal Separator/Trennzeichen

... übrigens wenn Du Dezimal-Trennzeichen Komma verwendest, musst Du immer ein Leerzeichen nach dem Komma-Separator innerhalb einer Funktion oder eines SQL-Statements angeben.

Birgitta

Fuerchau
23-11-16, 17:35
Aber nur bei Zahlen...

B.Hauser
23-11-16, 20:23
Aber nur bei Zahlen...

Warum?
Bei Trennzeichen kann man eigentlich nie zuviel Blanks angegeben, nur zuwenig!

Fuerchau
24-11-16, 08:02
Mir ging es ja nur um das "muss".
Bei Zahlen muss man, bei allem anderen kann man.
Wichtig ist ja nur, dass man das Blank nach der Zahl angeben muss.

BenderD
24-11-16, 08:33
Warum?
Bei Trennzeichen kann man eigentlich nie zuviel Blanks angegeben, nur zuwenig!

... bei ordentlichen Programmiersprachen nicht, bei free RPG schon, mach mal ein Semikolon am Anfang der nächsten Zeile, da kriegt der Compiler die Vogelgrippe.

D*B

Fuerchau
24-11-16, 08:51
Nun ja, wenn die vorherige Zeile nicht mit Semikolon aufhört, funktionierts.
Das mache ich gerne bei längeren SQL's und Prozeduraufrufen.
Nur "leere" Zeilen, also 2 auf einander folgende Semikolons, mag der Compiler nicht.

BenderD
24-11-16, 09:03
Nun ja, wenn die vorherige Zeile nicht mit Semikolon aufhört, funktionierts.
Das mache ich gerne bei längeren SQL's und Prozeduraufrufen.
Nur "leere" Zeilen, also 2 auf einander folgende Semikolons, mag der Compiler nicht.

... das Problem fängt an, wenn hinter dem Semikolon in der selben Zeile was anderes wie Kommentar kommt...