ASNA WingsRPG™ Reference Manual |
Resetting the Current Library on Wings Interactive Jobs
When Wings establishes an interactive connection to the IBM i through DataGate, it creates
an Interactive job on behalf of the user. Interactive jobs are initiated via telnet, with the
DATAGATE
program given as the initial program to run and the DataGate library as the current
library (so that the DATAGATE
program can be found). Initiating the job this way has the side
effect of overriding the current library specified on the user profile.
If the job must have the current library set to the user profile's specifications, then a program must be called on the job to set the current library. One way of doing this is to create a small CL program that retrieves the current library value for the current user and sets it in the job and then call this program after the DataGate connection has been established. Here is a sample program:
0001.00 PGM 0002.00 DCL VAR(&INITLIB) TYPE(*CHAR) LEN(10) 0003.00 RTVUSRPRF CURLIB(&INITLIB) 0004.00 CHGCURLIB CURLIB(&INITLIB) 0005.00 ENDPGM
Alternatively, the same task can be accomplished from the DataGate client by invoking program QSYRUSRI
(IBM's API equivalent to RTVUSRPRF
) and then calling QCMDEXC
to change the current library. The following
C# code shows sample code on calling QSYSUSRI.
private string retreiveUserCurrentLibrary() { string programName = "QSYRUSRI"; int bufLen = 150; ProgParm RecVar = new ProgParm(new ProgParmType("RecVar", 0, FieldType.NewChar((int)bufLen)), DataDirection.Output); ProgParm RecVarLen = new ProgParm(new ProgParmType("RecVarLen", 0, FieldType.NewInteger(4)), DataDirection.Input); ProgParm FormatName = new ProgParm(new ProgParmType("FormatName", 0, FieldType.NewChar(8)), DataDirection.Input); ProgParm UserName = new ProgParm(new ProgParmType("UserName", 0, FieldType.NewChar(10)), DataDirection.Input); ProgParm ErrorCode = new ProgParm(new ProgParmType("ErrorCode", 0, FieldType.NewInteger(4)), DataDirection.InputOutput); As400Program rtvUserPrf = new As400Program(myDatabase.Connection, programName); rtvUserPrf.AppendParm(RecVar); rtvUserPrf.AppendParm(RecVarLen); rtvUserPrf.AppendParm(FormatName); rtvUserPrf.AppendParm(UserName); rtvUserPrf.AppendParm(ErrorCode); rtvUserPrf.ObjectToParm(RecVar, "" as object); rtvUserPrf.ObjectToParm(RecVarLen, bufLen as object); rtvUserPrf.ObjectToParm(FormatName, "USRI0300" as object); rtvUserPrf.ObjectToParm(UserName, "*CURRENT " as object); rtvUserPrf.ObjectToParm(ErrorCode, ((int)0) as object); string receiver = ""; try { rtvUserPrf.Execute(); receiver = rtvUserPrf.ParmToObject(RecVar, receiver.GetType()) as string; } catch (dgException dgEx) { throw dgEx; } return receiver.Substring(138, 10); }
After establishing the connection to the IBM i, the current library can be reset as follows:
... myDatabase.Open(); string currentLibrary = retreiveUserCurrentLibrary(); callQCmdExec("CHGCURLIB " + currentLibrary); ...