Guten Morgen,
nachdem ich > 10 Jahre stiller Beobachter in diesem Forum war,
versuche ich es heute mit meinem ersten Forumsbeitrag.
Konkret geht es um ein ein SQL-Statement, welches funktioniert,
wenn die Zieltabelle zum Umwandlungszeitpunkt des Programmes nicht vorhanden ist.
Sobald die Tabelle beim Umwandeln vorhanden ist entsteht beim "select from final table..." der SQL - Fehler SQL0518 .
Das Problem tritt auf, sobald sich das erste mal Programm rekursiv aufruft.
Den Code ist ausführbar und liese sich auf eurer Maschine testen.
Das ganze tritt auch mit einer SQL-beschriebenene Tabelle auf.
Tabelle qgpl/ddsid vor dem Aufruf bestehen lassen -> SQL0518
Tabelle qgpl/ddsid vor dem Aufruf löschen -> 1. Aufruf funktioniert, 2. Aufruf SQL0518
Tabelle löschen und BHMXXX umwandeln -> alle Aufrufe funktionieren.
Vielen Dank im Voraus für eure Mithilfe.
Anbei der Code:




ctl-opt DATEDIT(*DMY.) DECEDIT('0,') DEBUG(*YES) ACTGRP(*new)
OPTION(*SRCSTMT : *NODEBUGIO : *NOUNREF);
//------------------------------------------------------------------
// Definitionen
//------------------------------------------------------------------
dcl-pr bhmxxx extpgm('BHMXXX');
*n like($ddsid) options(*nopass);
end-pr;
dcl-s $ddsid zoned(15:0);
dcl-s CmdText char(30000);
dcl-pr QCmdExc extpgm('QCMDEXC');
*n char(200) options(*varsize) const;
*n packed(15:5) const;
end-pr;

//-----------------------------------------------------------------
// Main
//-----------------------------------------------------------------
exec sql set option closqlcsr = *endactgrp;
exec sql set option commit = *none;

// erster Aufruf ohne Parameter -> Tabelle erstellen oder leeren
if %parms = 0;
// wenn die Tabelle vorher gelöscht wird oder
// die Tabelle beim umwandeln nicht vorhanden ist
// funktioniert der Select from final table auch rekursiv

// exec sql drop table qgpl/ddsid;
CmdText = 'CRTPF FILE(qgpl/ddsID) RCDLEN(15)';
Monitor;
QCmdExc(CmdText:%Size(CmdText));
On-Error *all;
endmon;
exec sql delete from qgpl/ddsid;
exec sql insert into qgpl/ddsid values(1);
endif;

// insert qgpl
// select from final table
// -> fehler bei RecursiveCall "bhmxxx"
// --> und tabelle zum umwandlungszeitpunkt vorhanden war
exec sql
select ddsid into :$ddsid from final table
(insert into qgpl/ddsid
values(select max(int(ddsid))+1 from qgpl/ddsid));

// rekursive Aufruf BHMXXX
if sqlcode = 0 and $ddsid < 100;
bhmxxx($ddsid);
endif;

*inlr = *on;
return;


http://www.michaelmatthes.de