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;