2014-05-12 如何於 java 環境中透過 QTEMP library 取得執行指令所輸出的報表內容?
AS400CommandOutput.java -- AS400 command output spooled file to TEXT file within QTEMP
Many CLP to get command spooled output to QTEMP outfile in CLP, but when the CLP call by Java command server,
could not get the QTEMP file.
The AS400CommandOutput will run your command output to spooled and use CPYSPLF command to copy spooled to
QTEMP outfile and read all record to TEXT file within QTEMP use AS400File.runCommand() method.
AS400CommandOutput.java
package com.free400.vengoal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Exception;
import com.ibm.as400.access.AS400File;
import com.ibm.as400.access.AS400FileRecordDescription;
import com.ibm.as400.access.AS400Message;
import com.ibm.as400.access.CommandCall;
import com.ibm.as400.access.Job;
import com.ibm.as400.access.QSYSObjectPathName;
import com.ibm.as400.access.Record;
import com.ibm.as400.access.RecordFormat;
import com.ibm.as400.access.SequentialFile;
import com.ibm.as400.access.SpooledFile;
import com.ibm.as400.access.SpooledFileList;
public class AS400CommandOutput {
private static final String FILE_SEPARATOR_PROP = "file.separator";
public static java.text.SimpleDateFormat datetimeFmt = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private AS400 as400;
private CommandCall commandCall;
private SequentialFile seqfile;
private String lastSplfName=null, lastSplfJob=null, lastSplfUsr=null, lastSplfJobNbr=null;
private int lastSplfNbr=0;
private String file;
private String commandJobNbr;
private String ddmJobNbr;
private File toFile = null;
private PrintWriter writer_;
private FileOutputStream os;
private boolean fileOpened = false;
public AS400CommandOutput(AS400 as400){
this.as400 = as400;
this.commandCall = new CommandCall(this.as400);
}
public AS400CommandOutput(AS400 as400, File toFile){
this.as400 = as400;
this.toFile = toFile;
this.commandCall = new CommandCall(this.as400);
}
public AS400 getSystem(){
return as400;
}
public String getCommandJobNbr(){
String cmdJobNbr = null;
try {
as400.connectService(AS400.COMMAND);
Job[] as400Jobs = as400.getJobs(AS400.COMMAND);
for(int i=0; i < as400Jobs.length; i++){
cmdJobNbr = as400Jobs[i].getNumber();
System.out.println("Linking to AS400 job: " + as400Jobs[i].getNumber() + "/" + as400Jobs[i].getUser() + "/" + as400Jobs[i].getName());
}
} catch (Exception e) {
e.printStackTrace();
}
return cmdJobNbr;
}
public String getDDMJobNbr(){
String ddmJobNbr = null;
try {
as400.connectService(AS400.RECORDACCESS);
Job[] as400Jobs = as400.getJobs(AS400.RECORDACCESS);
for(int i=0; i < as400Jobs.length; i++){
ddmJobNbr = as400Jobs[i].getNumber();
System.out.println("Linking to AS400 job: " + as400Jobs[i].getNumber() + "/" + as400Jobs[i].getUser() + "/" + as400Jobs[i].getName());
}
} catch (Exception e) {
e.printStackTrace();
}
return ddmJobNbr;
}
public void getLastSplfInfo(String selectSplfName, boolean deleteSplf) throws Exception{
String splfName, splfJob, splfUsr, splfJobNbr, splfDate,splfTime;
int splfNbr;
String lastSplfDateTime=" ";
String splfDateTime;
SpooledFileList splfList = new SpooledFileList( as400 );
// set filters, all users, on all queues
splfList.setUserFilter(as400.getUserId());
splfList.setQueueFilter("/QSYS.LIB/%ALL%.LIB/%ALL%.OUTQ");
// open list, openSynchronously() returns when the list is completed.
splfList.openSynchronously();
Enumeration enumer = splfList.getObjects();
while( enumer.hasMoreElements() )
{
SpooledFile splf = (SpooledFile)enumer.nextElement();
if ( splf != null )
{
// output this spooled file's name
splfName = splf.getStringAttribute(SpooledFile.ATTR_SPOOLFILE);
splfJob = splf.getStringAttribute(SpooledFile.ATTR_JOBNAME);
splfUsr = splf.getStringAttribute(SpooledFile.ATTR_JOBUSER);
splfJobNbr = splf.getStringAttribute(SpooledFile.ATTR_JOBNUMBER);
splfDate = splf.getStringAttribute(SpooledFile.ATTR_DATE);
splfTime = splf.getStringAttribute(SpooledFile.ATTR_TIME);
splfNbr = splf.getIntegerAttribute(SpooledFile.ATTR_SPLFNUM);
splfDateTime = splfDate + splfTime;
//System.out.println("splfDate:" + splfDate + " splfTime:" + splfTime + " job:" + splfJobNbr + "/"+ splfUsr + "/" + splfJob + " spooled file = " + splfName + " splfNbr=" + splfNbr);
if(splfName.equalsIgnoreCase(selectSplfName) && splfJob.equalsIgnoreCase("QPRTJOB")){
if (deleteSplf){
splf.delete();
} else if (splfDateTime.compareTo(lastSplfDateTime) > 0){
lastSplfDateTime = splfDateTime;
lastSplfName = splfName;
lastSplfJob = splfJob;
lastSplfUsr = splfUsr;
lastSplfJobNbr=splfJobNbr;
lastSplfNbr = splfNbr;
}
}
}
//System.out.println("last SPLFInfo: job " + lastSplfJobNbr + "/"+ lastSplfUsr + "/" + lastSplfJob + " lastSplfName:" + lastSplfName + " lastSplfNbr:" + lastSplfNbr);
}
// clean up after we are done with the list
splfList.close();
}
public void cpysplfWithQtemp(String splfName, boolean deleteTempFile) throws Exception{
if(seqfile == null){
seqfile = new SequentialFile();
seqfile.setSystem(as400);
seqfile.setPath("/QSYS.LIB/QGPL.LIB/QDDSSRC.FILE"); // for run following command use;
}
if(ddmJobNbr == null)
ddmJobNbr = getDDMJobNbr();
file = splfName.substring(0, 4) + ddmJobNbr;
getLastSplfInfo(splfName, false);
CPYSPLF(seqfile, lastSplfName, lastSplfJob, lastSplfUsr, lastSplfJobNbr, lastSplfNbr, true, "QTEMP", file, "M000000000", 201);
seqfile.setPath(new QSYSObjectPathName("QTEMP", file, "M000000000", "MBR").getPath());
setRecordFormat();
if(toFile == null)
readAll();
else
readAll(toFile);
getLastSplfInfo(splfName, true);
}
public void readAll(){
readAll(null);
}
public void readAll(File toFile){
try {
seqfile.open(AS400File.READ_ONLY, 100, AS400File.COMMIT_LOCK_LEVEL_NONE);
Record dataRcd = seqfile.readNext();
while (dataRcd != null) {
if(toFile == null)
onRecord(dataRcd);
else
onRecord(toFile, dataRcd);
dataRcd = seqfile.readNext();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
seqfile.close();
if(fileOpened){
writer_.close();
os.close();
fileOpened = false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void onRecord(Record record) {
System.out.println(getClass() + ":" + record);
}
public void onRecord(File file, Record record) throws IOException{
if(!fileOpened){
os = new FileOutputStream(file, file.exists());
writer_ = new PrintWriter(os, true);
fileOpened = true;
}
writer_.println(record);
writer_.flush();
}
public void setRecordFormat() throws Exception{
AS400FileRecordDescription recordDescription = new AS400FileRecordDescription(as400, seqfile.getPath());
RecordFormat[] formats = recordDescription.retrieveRecordFormat();
RecordFormat recordFormat = formats[0];
seqfile.setRecordFormat(recordFormat);
}
public void CPYSPLF(SequentialFile seqFile, String splfName, String splfJob, String splfUsr, String splfJobNbr, int splfNbr , boolean includeIGCData, String toLibrary, String toFile, String toMbr, int toFileRecordLength){
String cmdCRTPF = "CRTPF FILE("
+ toLibrary.toUpperCase().trim()
+ "/"
+ toFile.toUpperCase().trim()
+ ") RCDLEN("
+ toFileRecordLength
+ ") MBR("
+ toMbr.toUpperCase().trim()
+ ") MAXMBRS(*NOMAX) SIZE(*NOMAX)";
String cmdCPYSPLF = "CPYSPLF FILE("
+ splfName
+ ") TOFILE("
+ toLibrary.toUpperCase().trim()
+ "/"
+ toFile.toUpperCase().trim()
+ ") JOB("
+ splfJobNbr
+ "/"
+ splfUsr
+ "/"
+ splfJob
+ ") SPLNBR("
+ splfNbr
+ ") MBROPT(*REPLACE)";
try {
if(!chkObjExist(seqFile, toLibrary, toFile, "*FILE"))
seqFile.runCommand(cmdCRTPF);
AS400Message[] messagelist = seqFile.runCommand(cmdCPYSPLF);
for (int i = 0; i < messagelist.length; i++) {
if (messagelist[i].getID() != null){
if(messagelist[i].getID().equalsIgnoreCase("CPF3485")){
System.out.println(cmdCPYSPLF +" Command successful");
} else
System.out.println(messagelist[i].getID() + " " + messagelist[i].getText());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean chkObjExist(SequentialFile seqFile, String objLib, String objName, String objType) throws Exception {
boolean objectExist = true;
String cmdChkObj;
cmdChkObj = "CHKOBJ OBJ(" + objLib + "/" + objName + ") OBJTYPE(" + objType + ")";
AS400Message[] messagelist = seqFile.runCommand(cmdChkObj);
for (int i = 0; i < messagelist.length; i++) {
if (messagelist[i].getID() != null){
System.out.println(messagelist[i].getID() + " " + messagelist[i].getText());
if (messagelist[i].getID().equalsIgnoreCase("CPF9801")){
objectExist = false;
}
}
}
return objectExist;
}
public boolean runCmd(String commandString) {
boolean success = false;
try {
// Run the command.
if (success = commandCall.run(commandString)){
//System.out.println(commandString + " Command successful");
}else{
System.out.println(commandString + " Command failed");
throw new AS400Exception(commandCall.getMessageList());
}
} catch (Exception e) {
System.out.println("Command " + commandCall.getCommand() + " did not run");
e.printStackTrace();
}
return success;
}
public static void main(String[] args) {
try {
AS400 as400 = new AS400("as400ip", "user", "userpass");
AS400CommandOutput get400ACTJOB = new AS400CommandOutput(as400, new File("d:\\temp\\WRKACTJOB.TXT"));
get400ACTJOB.runCmd("WRKACTJOB OUTPUT(*PRINT) RESET(*YES) SEQ(*CPUPCT)");
Thread.sleep(5000);
get400ACTJOB.runCmd("WRKACTJOB OUTPUT(*PRINT) SEQ(*CPUPCT)");
get400ACTJOB.cpysplfWithQtemp("QPDSPAJB", true);
get400ACTJOB.runCmd("WRKSYSSTS OUTPUT(*PRINT)");
get400ACTJOB.cpysplfWithQtemp("QPDSPSTS", true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期四, 11月 09, 2023
2014-05-12 如何於 java 環境中透過 QTEMP library 取得執行指令所輸出的報表內容?(AS400CommandOutput.java)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言