Krain Geschrieben 20. August 2003 Geschrieben 20. August 2003 Hallo, Ich greife über Java mit SQL auf eine DB2. Nun unterstützt die AS400 eine Library-List, die ich unter SQL aber nicht verwenden kann, da SQL grundsätzlich in der CURLIB arbeitet, außer ich gebe im SELECt die Bibliothek an (zb. SELECT * FROM BIBLIOTHEK.DATEI). Nun ist es so dass bei unseren Kunden die Dateien in unterschiedlichen Bibliotheken liegen können. Hat jemand schonmal ein ähnliches Problem gehabt und eine Lösung dafür? Kennt sich jemand mit dem jt400-Package aus? Ich brauche da dringend Hilfe!!! mfg Zitieren
Peeter Geschrieben 20. August 2003 Geschrieben 20. August 2003 Also erst mal kannst du dir ein "AS400JDBCDataSource"-Objekt erzeugen. Darauf kannst du die Methode: "setLibraries(String)" anwenden. Etwas ähnliches gibt´s in der "QSYSObjectPathName" Klasse. Dort kannst du direkt deine Bibliothek setzen (setLibraryName(java.lang.String library) ). In der Doku zur Toolbox ist auch ein Beispiel zur AS400JDBCDataSource. Mußt dir mal unter http://www-1.ibm.com/servers/eserver/iseries/toolbox/index.html gibt´s ne aktuelle Version mit einer (endlich) ordentlichen Doku. Wobei ich aber eher dazu tendiere meine Bibliotheken direkt im SQL-Statement mit anzugeben. Da habe ich den ganzen Streß drurum nicht. Kleiner Tip. Mach´s in den SQL-Statements. Peet Zitieren
Krain Geschrieben 20. August 2003 Autor Geschrieben 20. August 2003 Wie soll ich es denn in den Statements machen? So : Select * from <LIB>.<DAT> ? Zitieren
Peeter Geschrieben 21. August 2003 Geschrieben 21. August 2003 Genau so. So machen wir es hier und es funktioniert ohne Probleme. Wir müssen auch auf Dateien in verschiedenen Bibliotheken abfragen. Peet Zitieren
Krain Geschrieben 21. August 2003 Autor Geschrieben 21. August 2003 Und wie funktioniert es mit dem Aufruf eines Programms auf der AS400? public static BWM90 callPGM(String inpFIR, String inpSTFN, String inpBSD, String inpBSNR) { /* lokale Variablen */ BWM90 tmpBWM90 = null; String FIR = inpFIR; String STFN = inpSTFN; String BSD = inpBSD; String BSNR = inpBSNR; AS400 tmpAs400System = null; // com.ibm.as400.access.AS400 ProgramCallDocument tmpPcml; // com.ibm.as400.data.ProgramCallDocument boolean rc = false; // Return code from ProgramCallDocument.callProgram() String msgId, msgText; // Messages returned from the server Object value; // Return value from ProgramCallDocument.getValue() // Verbindung zu AS400 System holen try { tmpAs400System = iSeriesConnection.getSystem(); } catch (java.lang.Throwable e) { System.out.println("* ERROS: " + e.getMessage()); } // Einstellungen aus Properties holen Properties tmpConnectionProperties; InputStream tmpInputStream; String tmpPcmlMessageLogTrace=""; try { tmpConnectionProperties = new Properties(); tmpInputStream = nabjPruefwert.class.getResourceAsStream("nabjCommandSettings.properties"); tmpConnectionProperties.load(tmpInputStream); tmpPcmlMessageLogTrace = tmpConnectionProperties.getProperty("PcmlMessageLogTrace"); } catch (java.lang.Throwable e) { System.out.println("* ERROS:" + e); } try { //debug Funktion if ( tmpPcmlMessageLogTrace.equals("j") ) { com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true); }; // Instanz von PCML erzeugen tmpPcml = new ProgramCallDocument(tmpAs400System, "nabj.pcml.BWM90"); // PCML Struktur befüllen tmpPcml.setValue("BWM90.SWMQB.FIR", FIR ); tmpPcml.setValue("BWM90.SWMQB.STFN", STFN); tmpPcml.setValue("BWM90.SWMQB.BSD", BSD); tmpPcml.setValue("BWM90.SWMQB.BSNR", BSNR); //Start des Call rc = tmpPcml.callProgram("BWM90"); // If return code is false, we received messages from the server if(rc == false) { System.out.println("*ERROS"); } // if else { System.out.println(" CallBWM90.Lesen : CALL Abgeschlossen "); // PCML aus der PCML holen FIR = tmpPcml.getValue( "BWM90.SWMQB.FIR" ).toString(); STFN = tmpPcml.getValue( "BWM90.SWMQB.STFN" ).toString(); BSD = tmpPcml.getValue("BWM90.SWMQB.BSD").toString(); BSNR = tmpPcml.getValue("BWM90.SWMQB.BSNR").toString(); System.out.println(FIR + STFN + BSD + BSNR); } } catch (PcmlException e) { System.out.println(e.getLocalizedMessage()); e.printStackTrace(); System.out.println("*** Call to BWM90 failed. ***"); } So hab ich es bisher - bei mir in der Firma funktioniert es auch, aber beim kunden nicht. Der hat eine andere LibraryList als wir Zitieren
Peeter Geschrieben 21. August 2003 Geschrieben 21. August 2003 Du könntest doch im AS400 Programm direkt eine Libary-List setzen! Also ein CL schreiben, welches die Libary-List setzt und dann das AS400-Programm aufruft. Wäre das was?? Peet Zitieren
Peeter Geschrieben 21. August 2003 Geschrieben 21. August 2003 Noch einfacher ist es, wenn due in dem RPG-Programm die Libary-List setzt. Dort kannst du (wo du deine Input- und Output-Files angibst) explizit einen "extfile('LIB/FILE')" Parameter angeben. Das wäre jetzt mein Vorschlag. Peet Zitieren
Krain Geschrieben 21. August 2003 Autor Geschrieben 21. August 2003 Wir haben nicht nur einen Kunden mit einer LibraryList sondern mehrere und die haben alle unterschiedliche LibraryLists. Wir versuchen gerade die LibraryList über den User zu bekommen. Wir bauen eine Connection auf mit einem von uns eingerichteten User und dieser soll die LibraryList dann haben, was hältst du davon? Zitieren
Peeter Geschrieben 21. August 2003 Geschrieben 21. August 2003 Das wäre eine Möglichkeit. Du willst also an den User (der eine Connection aufbaut) all die Libaries dranhängen (auf der AS400 natürlich). Un dieser soll dann die entsprechenden Programm ausführen. Gar keine dumme Idee. Somit hast du für jeden Kunden einen speziefischen User der die benötigten Biblitheken hat. :uli , hätte ich eigentlich selber drauf kommen können. Peet Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.