|
Jerrold_Bisera@countrywide.com wrote: > > Glenn, > > Could you post the source code? Thanks. I've attached it, it's probably a little big for the list. > > "James H. H. Lampert" wrote: > > > > Glenn Holmer wrote: > > > > How do you list the members in a file? > > > > > > Thanks, but what I'm looking for is how to do it in Java... :) > > > Should I run one of those CL commands and examine the output, or > > > is there a simpler way using Toolbox classes? > > > > Dear Mr. Holmer: > > > > There's an OPM system API for that. I haven't called it from Java, but I > > have from C and RPG. If you can call an OPM API, and retrieve the > > results from a *USRSPC, you've got it. > > Yup, it's QUSLMBR (and QUSRTVUS to read the contents of the user space). > IBM support turned me on to this today, it's done using PCML to directly > call an OS/400 API from a Java program. *Extremely* cool. > > If anybody wants to see the source code for the test program I wrote, > just ask. -- ____________________________________________________________ Glenn Holmer gholmer@weycogroup.com Programmer/Analyst phone: 414.908.1809 Weyco Group, Inc. fax: 414.908.1601
/**************************************************************************
ListMembers.java -- list members in an AS/400 file by directly calling
OS/400 APIs with PCML. See also ListMembers.pcml.
**************************************************************************/
import com.ibm.as400.access.*;
import com.ibm.as400.data.*;
import java.util.*;
/**
* A program that retrieves a list of the members in an AS/400 file.
* Uses PCML to make direct OS/400 API calls.
* @author Glenn Holmer ©Weyco Group, Inc. 2001
*/
public class ListMembers {
ProgramCallDocument pcml;
/**
* Constructor. Does everything.
*/
public ListMembers() {
AS400 weyco400;
Object o;
int ListOffset = 0, ListEntries = 0, i, j;
Vector MemberNames;
Enumeration enum;
System.out.println("\nListMembers.java -- lists members in file "
+ "SHADOW/RMIMETHODS using PCML.\n");
// connect to AS/400 and create PCML object
try {
System.out.println("connecting to office AS/400...");
weyco400 = new AS400("weyco400", "java", "java");
System.out.println("creating PCML object...");
pcml = new ProgramCallDocument(weyco400, "ListMembers");
} catch (PcmlException pe) {
System.out.println(pe.getLocalizedMessage());
pe.printStackTrace();
System.out.println("Your pathetic attempt at PCML died horribly.");
System.exit(1);
}
// call OS/400 API to get list of file members
System.out.println("calling QUSLMBR from OS/400...");
if (!callPCML("quslmbr")) {
System.exit(1);
}
// retrieve output from above (contained in user space object)
System.out.println("retrieving user space data...");
try {
System.out.println("step 1: get offset to list data");
pcml.setValue("qusrtvus1.StartPos", new Integer(125));
if (!callPCML("qusrtvus1")) {
System.exit(1);
} else {
o = pcml.getValue("qusrtvus1.Receiver");
ListOffset = ((Integer)o).intValue();
System.out.println("list offset is " + ListOffset);
}
System.out.println("step 2: get number of list entries");
pcml.setValue("qusrtvus1.StartPos", new Integer(133));
if (!callPCML("qusrtvus1")) {
System.exit(1);
} else {
o = pcml.getValue("qusrtvus1.Receiver");
ListEntries = ((Integer)o).intValue();
System.out.println("number of list entries is " + ListEntries);
}
// We know from the API docs that the length of an entry in
// format MBRL0100 is 10, so we can save ourselves a third call
// and go straight to getting the member list:
System.out.println("step 3: get member names into Vector");
MemberNames = new Vector();
for (i = ListOffset, j = 0; j < ListEntries; i += 10, j++) {
pcml.setValue("qusrtvus2.StartPos", new Integer(i));
if (!callPCML("qusrtvus2")) {
System.exit(1);
} else {
o = pcml.getValue("qusrtvus2.Receiver");
MemberNames.addElement(o);
}
}
for (enum = MemberNames.elements(); enum.hasMoreElements(); ) {
System.out.println("member: " + (String)enum.nextElement());
}
} catch (PcmlException pe) {
System.out.println(pe.getLocalizedMessage());
pe.printStackTrace();
System.out.println("Your pathetic attempt at PCML died horribly.");
System.exit(1);
}
System.exit(0);
}
/**
* Call program described in PCML file.
* @param ProgramName The program name tag in the PCML file. Note that
* this is not necessarily the actual program name.
* @return A boolean value representing success/failure.
*/
private boolean callPCML(String ProgramName) {
boolean rc;
AS400Message[] msgs;
int i;
try {
rc = pcml.callProgram(ProgramName);
if (rc == false) {
System.out.println("oops, error messages should follow:");
msgs = pcml.getMessageList(ProgramName);
for (i = 0; i < msgs.length; i++) {
System.out.println(msgs[i].getID() + ": " + msgs[i].getText());
}
return rc;
}
} catch (PcmlException pe) {
System.out.println(pe.getLocalizedMessage());
pe.printStackTrace();
System.out.println("Your pathetic attempt at PCML died horribly.");
return false;
}
return true;
}
/**
* Program entry point.
*/
public static void main(String argv[]) {
new ListMembers();
}
}
<pcml version="1.0">
<!-- PCML source for OS/400 API calls made from ListMembers.java -->
<!-- First two calls to QUSRTVUS: first call gets offset to list,
second gets number of entries. -->
<program name="qusrtvus1" path="/QSYS.LIB/QUSRTVUS.PGM">
<data name="UserSpace" type="char" length="20" usage="input"
init="USLMBR SHADOW"/>
<data name="StartPos" type="int" length="4" usage="input"/>
<data name="Length" type="int" length="4" usage="input"
init="4"/>
<data name="Receiver" type="int" length="4" usage="output"/>
</program>
<!-- Third and subsequent calls to QUSRTVUS: get member names
in a loop. -->
<program name="qusrtvus2" path="/QSYS.LIB/QUSRTVUS.PGM">
<data name="UserSpace" type="char" length="20" usage="input"
init="USLMBR SHADOW"/>
<data name="StartPos" type="int" length="4" usage="input"/>
<data name="Length" type="int" length="4" usage="input"
init="10"/>
<data name="Receiver" type="char" length="10" usage="output"/>
</program>
<!-- QUSLMBR returns output to a user space and does not need
a receiver: -->
<program name="quslmbr" path="/QSYS.LIB/QUSLMBR.PGM">
<data name="UserSpace" type="char" length="20" usage="input"
init="USLMBR SHADOW"/>
<data name="Format" type="char" length="8" usage="input"
init="MBRL0100"/>
<data name="FileName" type="char" length="20" usage="input"
init="RMIMETHLOGSHADOW "/>
<data name="MemberName" type="char" length="10" usage="input"
init="*ALL "/>
<data name="Override" type="char" length="1" usage="input"
init="0"/>
</program>
</pcml>
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.