python如何使用jt400.jar包代码实例

本文详细介绍了如何使用Python的jt400.jar库连接到AS400系统,包括初始化连接、执行命令、调用程序、读取输出队列、FTP文件操作等,提供了丰富的代码示例,对于理解和操作AS400系统的Python开发者具有参考价值。
摘要由CSDN通过智能技术生成

这篇文章主要介绍了python如何使用jt400.jar包代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

代码如下

jt400helper.py

​
    #coding=utf-8
    import jpype
    import os
    
    
    
    class JT400Helper(object):
      def __init__(self, server,username,pwd):
        jvmpath=r"C:\Program Files\Java\jre1.8.0_60\bin\server\jvm.dll"
        jarpath=r'd:\temp\jt400.jar'
        jvmArg = "-Djava.class.path=%s" % jarpath
        jpype.startJVM(jvmpath,jvmArg)
        
        #jt400
        AS400=jpype.JClass('com.ibm.as400.access.AS400')
        CommandCall=jpype.JClass('com.ibm.as400.access.CommandCall')
        ProgramCall=jpype.JClass('com.ibm.as400.access.ProgramCall')
        SpooledFileList=jpype.JClass('com.ibm.as400.access.SpooledFileList')
        AS400Text=jpype.JClass('com.ibm.as400.access.AS400Text')
        AS400JDBCDriver=jpype.JClass('com.ibm.as400.access.AS400JDBCDriver')
        
        
        
        #java
        Connection=jpype.JClass('java.sql.Connection')
        DatabaseMetaData=jpype.JClass('java.sql.DatabaseMetaData')
        Statement=jpype.JClass('java.sql.Statement')
        self.ResultSet=jpype.JClass('java.sql.ResultSet')
        
        self.server,self.username,self.pwd = server,username,pwd
        self.RJobLog=jpype.JClass('com.ibm.as400.resource.RJobLog')
        self.AS400FTP=jpype.JClass('com.ibm.as400.access.AS400FTP')
        self.IFSFile=jpype.JClass('com.ibm.as400.access.IFSFile')
        self.ObjectDescription=jpype.JClass('com.ibm.as400.access.ObjectDescription')
        
        self.ProgramParameter=jpype.JClass('com.ibm.as400.access.ProgramParameter')
        self.DriverManager=jpype.JClass('java.sql.DriverManager')
        self.DriverManager.registerDriver(AS400JDBCDriver())
        
        
        self.system=AS400(server,username,pwd)
        self.cc=CommandCall(self.system)
        self.outqueue = SpooledFileList(self.system)
        self.pc = ProgramCall(self.system)
      
      def ShowIfs(self,ifspath):
        ifs=self.IFSFile(self.system,ifspath)
        print 'exists : ',ifs.exists()
        print 'isDirectory : ',ifs.isDirectory()
        print 'isFile : ',ifs.isFile()
        fs=ifs.listFiles()
        if len(fs)>0:
          for f in fs:
            print f.name
      
      def ShowObj2(self,lib,obj):
        od = self.ObjectDescription(system,lib,obj,"FILE")
        print od.CHANGE_DATE_AND_TIME
      
      def ShowObj(self,lib,obj,tmplib):
        cmdstr = "DSPOBJD OBJ(%s/%s) OBJTYPE(*PGM) OUTPUT(*OUTFILE) OUTFILE(%s/OBJD)" % (lib,obj,tmplib)
        msg = self.GetCmdMsg(cmdstr)
        if msg == "":
          cmdstr = "SELECT ODLBNM, ODOBNM, ODOBTP, ODOBAT,ODOBSZ , ODOBTX, ODLDAT, ODLTIM, ODOBSY, ODCRTU, ODJRST, ODJRNM, ODJRLB, ODJRIM, ODJREN,ODJRCN, ODJRDT, ODJRTI FROM %s.objd" % tmplib
          self.GetSQLResult(cmdstr)    
      
      def SaveFieldDef(self,flib,file,tmplib,ofile):
        cmdstr = "DSPFFD FILE(%s/%s) OUTPUT(*OUTFILE) OUTFILE(%s/FIELDDEF)" % (flib,file,tmplib)
        msg = self.GetCmdMsg(cmdstr)
        if msg == "":
          cmdstr = "SELECT WHFLDI, WHFTXT, WHFLDT, WHFLDD, WHFLDP,WHFLDB, WHFOBO FROM %s.FIELDDEF WHERE WHFLDI <> ' ' ORDER BY WHFOBO" % tmplib
          self.GetSQLResult(cmdstr,ofile)
      
      def SaveJobLog(self,jobstr,ofile):
        msg = self.GetJobLog(jobstr)
        with open(ofile,'w') as f:
          f.write(msg)
      
      def GetJobLog(self,jobstr):
        jobarr = jobstr.split('/')
        jobnum,jobuser,jobname=jobarr[0],jobarr[1],jobarr[2]
        return self.GetJobLogByNum(jobnum,jobuser,jobname)
        
      def GetJobLogByNum(self,jobnum,jobuser,jobname):
        joblog=self.RJobLog(self.system,jobname,jobuser,jobnum)
        joblog.open()
        joblog.waitForComplete()
        num=joblog.getListLength()
        msgs = []
        for i in range(0,num):
          qmsg=joblog.resourceAt(i)
          msgs.append(qmsg.getAttributeValue("MESSAGE_TEXT"))
        msg = '\n'.join(msgs)
        return msg
      
      
      def GetSQLResult(self,cmdstr,ofile=""):
        connection = self.DriverManager.getConnection("jdbc:as400://" + self.server, self.username, self.pwd)
        dmd = connection.getMetaData()
        select = connection.createStatement(self.ResultSet.TYPE_SCROLL_SENSITIVE,self.ResultSet.CONCUR_UPDATABLE)
        print cmdstr
        rs = select.executeQuery(cmdstr)
        strs = ""
        cols = rs.getMetaData().getColumnCount()
        while (rs.next()):
          rowstrs = []
          for i in range(1,cols+1):
            value = rs.getString(i)
            if ' ' in value:
              value = '"%s"' % value
            rowstrs.append(rs.getString(i))
          strs+=','.join(rowstrs)+'\n'
        connection.close();
        if ofile <> "":
          with open(ofile,'w') as f:
            f.write(strs)
        else:
          print strs
        
       
      def CallProgram(self,plib,pgm,paras):
        #WRKACTJOB SBS(QUSRWRK) JOB(QZRCSRVS) - dump not work
        #paras=["Y","12345","   "]  
        pgmparas=[]
        for para in paras:
          pgmparas.append(ProgramParameter(para))
          print str(pgmparas.getInputData())
        self.pc.setProgram("/QSYS.LIB/%s.LIB/%s.PGM" % (plib,pgm),pgmparas)
        successfully = self.pc.run()
        msg = ''
        job = pc.getJob()
        print pc.toString()
        print job.toString()
        if successfully <> True:
          ml=self.pc.getMessageList()
          for m in ml:
            msg += m.getText() +'\n'
          print msg
          self.system.disconnectAllServices()
        return msg
        
      def GetCmdMsg(self,cmdstr):
        msg = ''
        print cmdstr
        successfully = self.cc.run(cmdstr)
        if successfully <> True:
          ml=self.cc.getMessageList()
          for m in ml:
            msg += m.getText() +'\n'
          print msg
        return msg
      
      def CheckObjExists(self,lib,file,type="*FILE"):
        str = "CHKOBJ OBJ(%s/%s) OBJTYPE(%s)" % (lib,file,type)
        return self.GetCmdMsg(str)
    
      def DeleteObj(self,lib,file):  
        str = "DLTF FILE(%s/%s)" % (lib,file)
        return self.GetCmdMsg(str)
        
        
      def FileToIfs(self,lib,file,mem,ifspath):
        # don't use RMVBLANK(*TRAILING) ,will cause numeric field contains blank characters error when put ifs to file
        str = "CPYTOIMPF FROMFILE(%s/%s %s) TOSTMF('%s') MBROPT(*REPLACE) STMFCCSID(*STMF) RCDDLM(*CRLF) DTAFMT(*DLM) STRDLM(*NONE)" % (lib,file,mem,ifspath)
        print lib,file,mem,"->",ifspath
        return self.GetCmdMsg(str)
        
      def IfsToFile(self,ifspath,lib,file,mem):
        str = "CPYFRMIMPF FROMSTMF('%s') TOFILE(%s/%s %s) MBROPT(*REPLACE) RCDDLM(*CRLF) STRDLM(*NONE) FLDDLM(',') ERRRCDOPT(*REPLACE) RPLNULLVAL(*FLDDFT)" % (ifspath,lib,file,mem)
        print ifspath,"->",lib,file,mem
        return self.GetCmdMsg(str)
        
      def FileToPc(self,lib,file,mem,ofile):
        tmpifs = "QDLS/TEMP/%s.CSV" % mem
        self.FileToIfs(lib,file,mem,tmpifs)
        self.FtpGetIfsFile(tmpifs,ofile)
      
      def PcToFile(self,ifile,lib,file,mem):
        tmpifs = "QDLS/TEMP/%s.CSV" % mem
        self.FtpPutIfsFile(ifile,tmpifs)
        self.IfsToFile(tmpifs,lib,file,mem)
        
    
      def FtpGetIfsFile(self,ifspath,ofile):
        ftp=self.AS400FTP(self.system)
        successfully = ftp.get(ifspath,ofile)
        print ifspath,"->",ofile
        return successfully
        
      def FtpGetText(self,lib,srcf,mem,dest=r"d:\temp"):
        ftp=self.AS400FTP(self.system)
        target="/QSYS.LIB/%s.LIB/%s.FILE/%s.MBR" % (lib,srcf,mem)
        if os.path.isdir(dest):
          dest=os.path.join(dest,mem+".txt")
        print target,"->",dest
        successfully = ftp.get(target,dest)
        return successfully
        
      def FtpGetSavf(self,lib,savf,dest=r"d:\temp"):
        ftp=self.AS400FTP(self.system)
        target="/QSYS.LIB/%s.LIB/%s.SAVF" % (lib,savf)
        # QUOTE SITE NAMEFMT 0 QGPL/QCLSRC.TEST
        # QUOTE SITE NAMEFMT 1 /QSYS.lib/Libname.lib/Fname.file/Mname.mbr
        ftp.issueCommand("quote site namefmt 1")
        if os.path.isdir(dest):
          dest=os.path.join(dest,savf+".SAVF")
        # can not get it if not set data transfer type
        ftp.setDataTransferType(1)
        successfully = ftp.get(target,dest)
        return successfully
       
      
      def FtpPutIfsFile(self,ifile,ifspath):
        ftp=self.AS400FTP(self.system)
        successfully = ftp.put(ifile,ifspath)
        print ifile,"->",ifspath
        return successfully
           
      def FtpPutText(self,ifile,lib,srcf,mem):
        ftp=self.AS400FTP(self.system)
        dest="/QSYS.LIB/%s.LIB/%s.FILE/%s.MBR" % (lib,srcf,mem)
        successfully = ftp.put(ifile,dest)
        print ifile,"->",lib,srcf,mem
        return successfully
      
      def GetOutQList(self,outqlib,outq):
        print "OutQueue : %s/%s" % (outqlib,outq)
        self.outqueue.setQueueFilter("/QSYS.LIB/%s.LIB/%s.OUTQ" % (outqlib,outq))
        self.outqueue.setUserFilter("*ALL")
        self.outqueue.openSynchronously()
        enums=self.outqueue.getObjects()
        i = 1
        info = ""
        while (enums.hasMoreElements()):
          splf=enums.nextElement()
          if(splf<>None):
            strs=[]
            strs.append("System :%s , File : %s , File Number : %s , Progarm :%s , Date : %s" % (splf.getStringAttribute(271),splf.getStringAttribute(104),splf.getIntegerAttribute(105).toString(),splf.getStringAttribute(272),splf.getStringAttribute(34)))
            strs.append("Number/User/Job : %s/%s/%s" % (splf.getStringAttribute(60),splf.getStringAttribute(62),splf.getStringAttribute(59)))
            strs.append("File Pages: %s , Print quality : %s , Printer device type : %s , Page size length : %d " % (splf.getIntegerAttribute(111).toString(),splf.getStringAttribute(48),splf.getStringAttribute(90),splf.getFloatAttribute(78).intValue()))
            info += '\n'.join(strs)+'\n'
            i+=1
        self.system.disconnectAllServices()
        print "total spool files : ",i
        print info
      
      def GetSpoolFile(self,sflib,sffile,sfname,sfjobnum,fnum,dest):
        if self.CheckObjExists(sflib,sffile)<>"":
          # IGCDTA parameter is for DBCS file
          self.GetCmdMsg("CRTPF FILE(%s/%s) RCDLEN(160) IGCDTA(*YES)" % (sflib,sffile))
        str = "CPYSPLF FILE(%s) TOFILE(%s/%s) JOB(%s) SPLNBR(%d)" % (sfname,sflib,sffile,sfjobnum,fnum)
        msg = self.GetCmdMsg(str)
        if msg == "":
          self.FtpGetText(sflib,sffile,sffile,dest)
          print "download successfully!"
        def PutMsg(self,qlib,qname,msg):    qstr = "/QSYS.LIB/%s.LIB/%s.DTAQ" % (qlib,qname)    dataqueue=self.DataQueue(self.system,qstr)    dataqueue.write(msg)      def GetMsg(self,qlib,qname):    qstr = "/QSYS.LIB/%s.LIB/%s.DTAQ" % (qlib,qname)    dataqueue=self.DataQueue(self.system,qstr)    dqdata = dataqueue.read()    dqdatastr = 'No data'    if dqdata <> None:      dqdatastr = dqdata.getString()    print dqdatastr    return dqdatastr
        
    if __name__ == '__main__':
      pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值