Ich sags ja, kaum dreht man an der einen Schraube läuft was anderes nicht.
Ich hatte ja in der QAQQINI den Wert 'IGNORE_DERIVED_INDEX' auf *YES gesetzt.
Dies führt nun dazu, dass so gut wie alle SQL's von der SQE durchgeführt werden.

Tja, nun stirbt ein Programm, dass schon lange (Februar 2005) läuft mit einem MCH3203-Fehler:

Nachricht . . . : Funktionsfehler X'1720' in Maschineninstruktion. Interne
Speicherauszugs-ID .
Ursache . . . . : Die Ausführung der Maschineninstruktion ist
fehlgeschlagen. Zeitmarke = 22.10.08 11:58:23, Fehlercode = X'1720',
Fehlerklasse = 0, Einheitennummer = X'0000'. Die Fehlerklasse zeigt an, wie
der Fehler entdeckt wurde:
0000 = nicht spezifizierte abnormale Bedingung
0002 = logisch ungültiger Einheitensektor
0003 = Einheitenfehler
0004 = ungültige Operation ausgeführt
Bei Fehlerklasse 0003 kennzeichnet die Einheitennummer die fehlerhafte
Einheit oder sie enthält Null, falls der Fehler im Hauptspeicher aufgetreten
ist.
Bei Fehlerklasse 0004 wurde ein nicht unterstützter Operationscode einer
MI-Instruktion verwendet.
Fehlerbeseitigung: Bei Fehlerklasse 0004 den nicht unterstützten
Operationscode der MI-Instruktion aus dem Programm entfernen. Bei allen
anderen Fehlerklassen die Problemanalyse starten (Befehl ANZPRB).

Nachrichten-ID . . . . : MCH3203 Bewertung . . . . . . : 60
Sendedatum . . . . . . : 22.10.08 Sendezeit . . . . . . : 11:58:28
Nachrichtenart . . . . : Abbruch
Von . . . . . . . . . : REMHOL_800 CCSID . . . . . . . . : 65535

Von Programm . . . . . . . . . : assert
Instruktion . . . . . . . . : 000004

An Programm . . . . . . . . . : QQQOOODBOP
An Bibliothek . . . . . . . : QSYS
An Modul . . . . . . . . . . : QQQOOOINV
An Prozedur . . . . . . . . : CALLDBMAINTFOROPENOROPTIMIZE
An Anweisung . . . . . . . . : 4139

Zusätzlich gibts einen 1419 Seiten Dump des Optimizers.

Ich habe nun in einem CLP per CHGQRYA auf eine andere, nicht modifizierte QAQQINI ungeschaltet und siehe da, der Befehl läuft wieder, da er nun von der CQE ausgeführt wird.

Der SQL ist eigentlich recht simpel und auch schnell:

Code:
c/exec sql 
c+ with 
c+ x1IVCL as -- alle offenen Inventuren 
c+ (select distinct ivivnr from ivcl 
c+ where ivfirm=:DAFIRM 
c+ and ivwknr=:DAWKNR 
c+ and ivlanr=:DASTLA 
c+ and ivsart='KO' 
c+ and ivstat<'80' -- erledigt/storniert 
c+ ) 
c+ , 
c+ x1LGLM as -- alle Bestände aus LGST 
c+ -- die nicht gesperrt sind 
c+ (select cmfirm, cmwknr, cmlanr, cmlonr, cmtenr 
c+ ,dec(sum(cmbest), 11, 2) as cmbest 
c+ ,dec(sum(case tevpbm*tevpap -- auf palette 
c+ when 0 then 1 
c+ else cmbest / (tevpbm*tevpap) -- Anz.Paletten 
c+ end) 
c+ , 11, 5) as cmpale 
c+ from lglm 
c+ inner join teil 
c+ on cmfirm=tefirm 
c+ and cmwknr=tewknr 
c+ and cmtenr=tetenr 
c+ inner join LGST 
c+ on cmfirm=clfirm 
c+ and cmwknr=clwknr 
c+ and cmlanr=cllanr 
c+ and cmlonr=cllonr 
c+ where cmfirm=:DAFIRM 
c+ and cmwknr=:DAWKNR 
c+ and cmlanr=:DASTLA 
c+ and clspgr <> '09' -- Auslagerung anstehend 
c+ and clakiv not in (select ivivnr from x1IVCL) 
c+ and clivda < :GZDAVON -- Letzte Inventur < Grenze 
c+ group by cmfirm, cmwknr, cmlanr, cmlonr, cmtenr 
c+ ) 
c+ 
c+ -- Sammeln der Daten 
c+ 
c+ select min(cllonr) -- erster Platz 
c+ ,max(cllonr) -- letzter Platz 
c+ ,count(cllonr) -- Anzahl Plätze 
c+ 
c+ ,(select count(*) from LGST -- Anzahl gezählt 
c+ where clfirm=:DAFIRM 
c+ and clwknr=:DAWKNR 
c+ and cllanr=:DASTLA 
c+ and clivda >= :GZDAVON -- Letzte Inventur 
c+ and abs(clfr04) <= :DAAGNR -- Mengendiff % 
c+ and abs(clfr05) <= :DAKONR -- Wertdiff % 
c+ ) 
c+ 
c+ ,(select count(*) from LGST -- Anzahl Differenz 
c+ where clfirm=:DAFIRM 
c+ and clwknr=:DAWKNR 
c+ and cllanr=:DASTLA 
c+ and clivda >= :GZDAVON -- Letzte Inventur 
c+ and clakiv not in (select ivivnr from x1IVCL) 
c+ and (abs(clfr04) > :DAAGNR -- Mengendiff % 
c+ or abs(clfr05) > :DAKONR) -- Wertdiff % 
c+ ) 
c+ 
c+ ,(select count(*) from LGST -- leere Plätze 
c+ exception join LGLM 
c+ on clfirm=cmfirm 
c+ and clwknr=cmwknr 
c+ and cllanr=cmlanr 
c+ and cllonr=cmlonr 
c+ where clfirm=:DAFIRM 
c+ and clwknr=:DAWKNR 
c+ and cllanr=:DASTLA 
c+ and clakiv not in (select ivivnr from x1IVCL) 
c+ and clivda < :GZDAVON -- Letzte Inventur 
c+ ) 
c+ 
c+ ,(select count(distinct cllonr) -- Anzahl ohne Res. 
c+ from LGLM 
c+ inner join LGST 
c+ on cmfirm=clfirm 
c+ and cmwknr=clwknr 
c+ and cmlanr=cllanr 
c+ and cmlonr=cllonr 
c+ inner join teil 
c+ on cmfirm=tefirm 
c+ and cmwknr=tewknr 
c+ and cmtenr=tetenr 
c+ where clfirm=:DAFIRM 
c+ and clwknr=:DAWKNR 
c+ and cllanr=:DASTLA 
c+ and clakiv not in (select ivivnr from x1IVCL) 
c+ and clivda < :GZDAVON -- Letzte Inventur 
c+ and teresb = 0 -- keine Reservierung 
c+ ) 
c+ 
c+ ,(select count(distinct cmlonr) -- Anzahl volle Palette 
c+ from x1LGLM 
c+ where floor(cmpale) = cmpale -- Ganzzahl 
c+ ) 
c+ 
c+ ,(select count(distinct cmlonr) -- Anzahl Anbruchpalette 
c+ from x1LGLM 
c+ where floor(cmpale) <> cmpale -- Ganzzahl 
c+ ) 
c+ 
c+ ,(select count(*) from LGST -- Anzahl für Inventur 
c+ where clfirm=:DAFIRM 
c+ and clwknr=:DAWKNR 
c+ and cllanr=:DASTLA 
c+ and clakiv not in (select ivivnr from x1IVCL) 
c+ and clivda < :GZDAVON -- Letzte Inventur 
c+ and clspgr <> '09' -- Auslagerung 
c+ ) 
c+ 
c+ into :WKLGMI 
c+ ,:WKLGMX 
c+ ,:WKLGAN 
c+ ,:WKLGGZ 
c+ ,:WKANPD 
c+ ,:WKANLE 
c+ ,:WKANRS 
c+ ,:WKANVP 
c+ ,:WKANAP 
c+ ,:WKANSU 
c+ from lgst 
c+ where clfirm=:DAFIRM 
c+ and clwknr=:DAWKNR 
c+ and cllanr=:DASTLA
Und nur wegen der SQE nun diesen SQL umzuschreiben finde ich nicht sehr amüsant.