[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Wenn du stattdessen einen eigenen Befehl schreibst, der das gewünschte Programm aufruft, und diesen in die feste Bibliothek legst, dann brauchst du diesem nur die entsprechenden Produktbibliothek (Parameter PRDLIB) einmalig einzutragen.

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Man kann sich auch mit einem Zweizeiler eine User Defined Table Function (UDTF) schreiben, die man dann immer wenn man sie braucht über SQL aufrufen und verarbeiten kann:

    Code:
    Create Or Replace Function YourLib/FindLibPGM           
           (ParPGM        VarChar(10))                  
           Returns Table (ObjLib       Char(10)     ,   
                          Obj          Char(10)     ,   
                          ObjDescr     Char(50)      )  
                            
           Language SQL                                 
           Modifies SQL Data                            
           Called On NULL Input                         
           Disallow Parallel                            
           Not Fenced                                   
     Begin                                                           
        Declare CLCmd VarChar(256) Not Null Default '';              
                                                                     
        Set CLCmd = 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGM) concat ') '  
                     Concat  ' OBJTYPE(*PGM) '                      
                     Concat  ' OUTPUT(*OUTFILE) '                   
                     Concat  ' OUTFILE(QTEMP/TMPOBJD) '           
                     Concat  ' OUTMBR(*FIRST *REPLACE) ';           
                                                                    
        Call QCMDEXC(CLCmd, Length(CLCmd));                         
                                                                    
        Return Select ODLBNM, ODOBNM, ODOBTX
               From QTEMP/TMPOBJD;                                
    End  ;
    Wenn das Skript ordnungsgemäß ausgeführt wurde, d.h. die UDTF erstellt wurde, kann man sie von überall und jederzeit mit dem folgenden SQL-Befehl aufrufen:
    Code:
    select *
    From Table(FindLibPgm('PGMNAME')) x;
    Anstatt PGMNAME kann natürlich auch eine (Host-)Variable eingesetzt werden.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    May 2002
    Beiträge
    1.121
    Hallo Birgitta,

    wollte natürlich das gleich einmal aus probieren. Beim Erstellen der Funktion kann erst eine Meldung, das er mit "LENGTH" nichts anfangen kann. Also habe ich den Code etwas abgewandelt.
    PHP-Code:
    Declare CLCmd VarChar(256Not Null Default '';                
    Declare 
    CLCmdL DEC(155Not Null Default 0,0;                
    Set CLCmd 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGMconcat ') '
                 
    Concat  ' OBJTYPE(*PGM) '                         
                 
    Concat  ' OUTPUT(*OUTFILE) '                      
                 
    Concat  ' OUTFILE(QTEMP/TMPOBJD) '                
                 
    Concat  ' OUTMBR(*FIRST *REPLACE) ';              
    Set CLCmdL Length(CLCmd);                                    
    Call QCMDEXC(CLCmdCLCmd);
    Return 
    Select ODLBNMODOBNMODOBTX     
           From QTEMP
    /TMPOBJD;               
    End 
    Damit konnte ich die Funktion erstellen. Führe ich den SELECT aus kommt
    "Abfrage kann nicht ausgeführt werden".
    Und eine Ebene tiffer in der Meldung
    "Zeichen in CAST-Argument ungültig"

    Hast du eventuell noch einmal Zeit dir diese Function anzuschauen?
    Gruß
    Ronald

  4. #4
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von malzusrex Beitrag anzeigen
    PHP-Code:
    Declare CLCmd VarChar(256Not Null Default '';                
    Declare 
    CLCmdL DEC(155Not Null Default 0,0;                
    Set CLCmd 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGMconcat ') '
                 
    Concat  ' OBJTYPE(*PGM) '                         
                 
    Concat  ' OUTPUT(*OUTFILE) '                      
                 
    Concat  ' OUTFILE(QTEMP/TMPOBJD) '                
                 
    Concat  ' OUTMBR(*FIRST *REPLACE) ';              
    Set CLCmdL Length(CLCmd);                                    
    Call QCMDEXC(CLCmdCLCmd);
    Return 
    Select ODLBNMODOBNMODOBTX     
           From QTEMP
    /TMPOBJD;               
    End 
    Kann es sein dass du im 2. Parameter die Falsche Variable angiebst?

    Call QCMDEXC(CLCmd, CLCmdL);

    statt

    Call QCMDEXC(CLCmd, CLCmd);


    lg Andreas

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Ich hatte die Funktion gestern Abend auf einem System mit 7.1 erstellt. Dabei hatte ich wohl einiges verwendet, das erst mit Release 7.1 und PTFs dazugekommen ist (Or Replace und Übergabe von Ausdrücken beim Aufruf von Stored Procedures.

    Die folgende Version habe ich gerade auf einem System mit V5R4 erstellt und ausgeführt.
    Code:
    Create Function WrkBHA/FindLibPGM           
           (ParPGM        VarChar(10))                  
           Returns Table (ObjLib       Char(10)     ,   
                          Obj          Char(10)     ,   
                          ObjDescr     Char(50)      )  
                            
           Language SQL                                 
           Modifies SQL Data                            
           Called On NULL Input                         
           Disallow Parallel                            
           Not Fenced                                   
     Begin                                                           
        Declare CLCmd VarChar(256) Not Null Default '';
        Declare CmdLen Dec(15, 0) Not Null Default 0;              
                                                                     
        Set CLCmd = 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGM) concat ') '  
                     Concat  ' OBJTYPE(*PGM) '                      
                     Concat  ' OUTPUT(*OUTFILE) '                   
                     Concat  ' OUTFILE(QTEMP/TMPOBJD) '           
                     Concat  ' OUTMBR(*FIRST *REPLACE) ';           
                                                     
        Set CmdLen = Length(CLCmd);               
        Call QCMDEXC(CLCmd, CmdLen);                         
                                                                    
        Return Select ODLBNM, ODOBNM, ODOBTX
               From QTEMP/TMPOBJD;                                
    End  ;
    Aufruf: Ermittelt alle Programme in allen Bibliotheken, die mit HS anfangen. (unter System Naming und IBM i Navigator - Eine SQL Prozedur ausführen - die Bibliothek in der die UDTF erstellt wurde sollte in der Bibliotheksliste sein)
    Code:
    Select * from Table(FindLibPGM('HS*')) x;;
    STRSQL macht allerdings auch bei mir Probleme. (ist ja stabilized!!!)

    Einbindung in embedded SQL wiederum sollte problemlos funktionieren, da ich jede Menge von diesen UDTFs in meinen Programmen und Prozeduren (auch unter V5R4) verwende.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    May 2002
    Beiträge
    1.121
    Jo, so geht es.

    Hatte da 2 mal die gleiche Variable drin

    Danke Euch

    Ronald

Similar Threads

  1. Parameter eines Programms ermitteln?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 16
    Letzter Beitrag: 14-02-13, 18:59
  2. Parameter des aurufenden Programms ermitteln
    By GreatEMU in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 29-03-07, 10:39
  3. Fixtexte in Bildschirmdateien ermitteln
    By ulbrecht in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 06-12-06, 17:06
  4. LPAR Prozessor Leistung Ermitteln
    By Weki in forum NEWSboard Server Software
    Antworten: 6
    Letzter Beitrag: 29-08-06, 09:09
  5. SQL Select mit SUM aus einer DB
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 30-03-06, 12:33

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •