Because the AS/400 supports so many media types, and no particular type is used by a majority of AS/400 installations, it can be difficult to distribute information between systems. If you don't need to distribute an inordinate amount of information, you can easily solve this problem by placing your AS/400 information on PC media.
The technique for transferring AS/400 objects using PC media is to save an AS/400 object to a save file and then convert it to a database file. Once you have the database file representation of the object, transfer the file to PC media with any of the many AS/400 to PC file transfer programs, such as RTOPC, found in Client Access/400. Once on PC media, you increase the number of potential target AS/400s that can import the object. To get the information from the PC media to the AS/400, you reverse the process.
To help you carry out this procedure, a set of tools in the QUSRTOOL library (CPYTOSAVF and CPYFRMSAVF) uses RPG programs to convert the save files to database files. Unfortunately, the QUSRTOOL library will no longer be shipped with the operating system beginning with V3R6. It is being replaced by the TAATOOL library, which is chargeable.
I have created an alternative technique that uses only native AS/400 commands to accomplish the same thing, eliminating the need for the QUSRTOOL utility. My solution is made up of two commands: Convert To Database File (CVTTODBF) and Convert From Database File (CVTFRMDBF). The commands both rely on the OS/400 Send Network File (SNDNETF) and Receive Network File (RCVNETF) commands. The source code for CVTTODBF and its command processing program (CPP), DBF001CL, are shown in Figures 1 and 2. The source code for CVTFRMDBF and its CPP, DBF002CL, are shown in Figures 3 and 4.
The CVTTODBF needs the name and library of the object and the name and library of the database file you are going to convert the object to. The program DBF001CL does a SNDNETF to send the file to the directory entry assoicated with your user profile. Then the program receives the network file into your database file. The program DBF002CL reverses that process. It again sends the file using SNADS, which the program then receives into your save file.
If you decide to use this utility, just make sure that your user profile has a directory entry in the system distribution directory and that you've started the QSNADS subsystem before you use the commands.
? Michael Hagey
TechTalk: Converting Objects to Database Files
Figure 1: CVTTODBF Command Source
/*==================================================================*/ /* To compile: */ /* */ /* CRTCMD CMD(XXX/CVTTODBF) PGM(XXX/DBF001CL) + */ /* SRCFILE(XXX/QCMDSRC) */ /* */ /*==================================================================*/ CVTTODBF: CMD PROMPT('Convert to Database File') PARM KWD(OBJ) TYPE(OBJ) MIN(1) PROMPT('Object name') PARM KWD(DBF) TYPE(DBF) MIN(1) PROMPT('Database + file name') OBJ: QUAL TYPE(*NAME) LEN(10) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL) (*CURLIB)) PROMPT('Library') DBF: QUAL TYPE(*NAME) LEN(10) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL) (*CURLIB)) PROMPT('Library')
TechTalk: Converting Objects to Database Files
Figure 2: Command Processing Program DBF001CL
/*==================================================================*/ /* To compile: */ /* */ /* CRTCLPGM PGM(XXX/DBF001CL) SRCFILE(XXX/QCLSRC) */ /* */ /*==================================================================*/ PGM PARM(&OBJ &DBF) DCL VAR(&OBJ) TYPE(*CHAR) LEN(20) DCL VAR(&DBF) TYPE(*CHAR) LEN(20) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&SAVF) TYPE(*CHAR) LEN(10) VALUE('WRKSAVF') DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(80) DCLF FILE(QAOSDIRO) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) OVRDBF FILE(QAOSDIRO) TOFILE(QTEMP/DSPDIRE) RTVJOBA USER(&USER) DSPDIRE USER(&USER) OUTPUT(*OUTFILE) + OUTFILE(QTEMP/DSPDIRE) RCVF CRTSAVF FILE(QTEMP/&SAVF) MONMSG MSGID(CPF7302) EXEC(CLRSAVF FILE(QTEMP/&SAVF)) SAVOBJ OBJ(%SST(&OBJ 1 10)) LIB(%SST(&OBJ 11 10)) + DEV(*SAVF) SAVF(QTEMP/&SAVF) SNDNETF FILE(QTEMP/&SAVF) TOUSRID((&WOSDDEN &WOSDDGN)) CRTPF FILE(%SST(&DBF 11 10)/%SST(&DBF 1 10)) + RCDLEN(528) MBR(*NONE) RCVNETF FROMFILE(&SAVF) TOFILE(%SST(&DBF 11 + 10)/%SST(&DBF 1 10)) MONMSG MSGID(CPF8060) EXEC(DO) DLYJOB DLY(10) RCVNETF FROMFILE(&SAVF) TOFILE(%SST(&DBF 11 + 10)/%SST(&DBF 1 10)) ENDDO DLTF FILE(QTEMP/&SAVF) GOTO CMDLBL(ENDPGM) ERROR: RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) SNDPGMMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + MSGTYPE(*ESCAPE) ENDPGM: ENDPGM
TechTalk: Converting Objects to Database Files
Figure 3: CVTFRMDBF Command Source
/*==================================================================*/ /* To compile: */ /* */ /* CRTCMD CMD(XXX/CVTFRMDBF) PGM(XXX/DBF002CL) + */ /* SRCFILE(XXX/QCMDSRC) */ /* */ /*==================================================================*/ CVTFRMDBF: CMD PROMPT('Convert from Database File') PARM KWD(OBJECT) TYPE(*NAME) MIN(1) + PROMPT('Object name') PARM KWD(SVDLIB) TYPE(*NAME) MIN(1) PROMPT('Saved + library') PARM KWD(DBF) TYPE(DBF) MIN(1) PROMPT('Database + file name') PARM KWD(TGTLIB) TYPE(*NAME) DFT(*SVDLIB) + SPCVAL((*SVDLIB ' ')) MIN(0) + PROMPT('Target library') DBF: QUAL TYPE(*NAME) LEN(10) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL) (*CURLIB)) PROMPT('Library')
TechTalk: Converting Objects to Database Files
Figure 4: Command Processing Program DBF002CL
/*==================================================================*/ /* To compile: */ /* */ /* CRTCLPGM PGM(XXX/DBF002CL) SRCFILE(XXX/QCLSRC) */ /* */ /*==================================================================*/ PGM PARM(&OBJECT &SAVLIB &FILE &TGTLIB) DCL VAR(&OBJECT) TYPE(*CHAR) LEN(10) DCL VAR(&SAVLIB) TYPE(*CHAR) LEN(10) DCL VAR(&SAVF) TYPE(*CHAR) LEN(10) VALUE('WRKSAVF') DCL VAR(&FILE) TYPE(*CHAR) LEN(20) DCL VAR(&LIB) TYPE(*CHAR) LEN(10) DCL VAR(&TGTLIB) TYPE(*CHAR) LEN(10) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(80) DCLF FILE(QAOSDIRO) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) IF COND(&TGTLIB *EQ ' ') THEN(CHGVAR + VAR(&TGTLIB) VALUE(&SAVLIB)) OVRDBF FILE(QAOSDIRO) TOFILE(QTEMP/DSPDIRE) RTVJOBA USER(&USER) DSPDIRE USER(&USER) OUTPUT(*OUTFILE) + OUTFILE(QTEMP/DSPDIRE) RCVF SNDNETF FILE(%SST(&FILE 11 10)/%SST(&FILE 1 10)) + TOUSRID((&WOSDDEN &WOSDDGN)) CRTSAVF FILE(QTEMP/&SAVF) MONMSG MSGID(CPF7302) EXEC(CLRSAVF FILE(QTEMP/&SAVF)) RCVNETF FROMFILE(%SST(&FILE 1 10)) TOFILE(QTEMP/&SAVF) MONMSG MSGID(CPF8060) EXEC(DO) DLYJOB DLY(10) RCVNETF FROMFILE(%SST(&FILE 1 10)) TOFILE(QTEMP/&SAVF) ENDDO RSTOBJ OBJ(&OBJECT) SAVLIB(&SAVLIB) DEV(*SAVF) + SAVF(QTEMP/&SAVF) OPTION(*NEW) + RSTLIB(&TGTLIB) DLTF FILE(QTEMP/&SAVF) GOTO CMDLBL(ENDPGM) ERROR: RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) SNDPGMMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + MSGTYPE(*ESCAPE) ENDPGM: ENDPGM
LATEST COMMENTS
MC Press Online