[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.749
    DSPOBJD geht zwar auch, aber man muss dabei aufpassen, dass man hier eindeutige Dateinamen (QTEMP) verwendet. Immerhin können das ja mehrere Jobs gleichzeitig machen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.934
    Zitat Zitat von Fuerchau Beitrag anzeigen
    DSPOBJD geht zwar auch, aber man muss dabei aufpassen, dass man hier eindeutige Dateinamen (QTEMP) verwendet. Immerhin können das ja mehrere Jobs gleichzeitig machen.
    Das Problem hast Du aber auch bei den List APIs wenn Du den gleichen User Space Namen verwendest und nicht in die QTEMP kopierst.

    Das API für Objekte is QUSLOBJ (List Objects) und Format OBJL0100 sollte reichen.

    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
    Feb 2001
    Beiträge
    20.749
    Als USRSPC gebe ich ja gezielt QTEMP an, bei DSPOBJD in QTEMP brauche ich aber noch einen OVRDBF, da ja zum Compilezeitpunkt ggf. die Datei nicht da ist.
    Ich könnte da natürlich auch anschließend SQL nehmen.

    Wie immer, es gibt viele Möglichkeiten (auch ein Programm zum Absturz zu bringen).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Jan 2012
    Beiträge
    1.217
    Vielen Dank für die schnellen und zahlreichen Antworten.

    Das API ist wahrscheinlich die eleganteste Lösung. Nur sind API-Aufrufe (für mich) meistens mit zeitintensiver Tüftelei verbunden.
    Deshalb werde ich wohl erstmal die DPSOBJD-Lösung favorisieren.

    Zur Erklärung, was das ganze soll: Wir setzen ja Profound ein und möchten Profound-Releasewechsel ohne Nachtarbeit erledigen. Deshalb wollen wir die User mit einer vorgeschalteten Apache-Instanz auf die von uns (der Programmierung) gerade gewünschten Profound-Instanz leiten, wenn die User eine neue iSeries-Sitzung (im Browser) öffnen. Dazu müssen wir im Startprogramm des Users aber die richtige Profound-Bibliothek (passend zur Apache-Instanz) setzen. Um die richtige Bibliothek herauszufinden, müssen wir ein bestimmtes Profound-Tool aufrufen, dass uns die gewünschte Information liefert. Das Aufrufen des Tools ist allerdings schwierig, solange sich noch keine Profound-Lib in der *LIBL befindet.

    Während ich das ganze hier schreibe, merke ich gerade, dass ich den Wald vor lauter Bäumen nicht sehe: Ich kann ja das Profound-Tool einfach in eine feste, beim Releasewechsel nicht veränderbare eigene Lib kopieren und damit immer ohne Suchen finden!

    Tja, sorry für die Mühe.
    Und danke, das wir darüber gesprochen haben :-).

    Viele Grüße,
    Dieter

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.749
    Wenn du verschieden Versionen hast würde ich diese Info doch in einer bekannten Lib in einer Datei vorhalten.
    Somit reicht SQL um die korrekte Lib zur Version herauszufinden und die LIBL anzupassen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Nov 2003
    Beiträge
    2.422
    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.

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.934
    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

  8. #8
    Registriert seit
    May 2002
    Beiträge
    1.122
    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

  9. #9
    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

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.934
    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

  11. #11
    Registriert seit
    May 2002
    Beiträge
    1.122
    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, 19:59
  2. Parameter des aurufenden Programms ermitteln
    By GreatEMU in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 29-03-07, 11:39
  3. Fixtexte in Bildschirmdateien ermitteln
    By ulbrecht in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 06-12-06, 18:06
  4. LPAR Prozessor Leistung Ermitteln
    By Weki in forum NEWSboard Server Software
    Antworten: 6
    Letzter Beitrag: 29-08-06, 10:09
  5. SQL Select mit SUM aus einer DB
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 30-03-06, 13:33

Berechtigungen

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