?
Solved

Executing AS/400 CL from VB Application

Posted on 2004-03-31
12
Medium Priority
?
1,468 Views
Last Modified: 2010-05-18
I am having difficulty calling a simple CL Program on the AS/400 from a VB Application.  I have used the IBM Client Access example showing how to retrieve a library description and it works in our environment.  I mimiced my VB program after the IBM example and it appears to run but I do not get the results of the CL program on the AS/400.  I know that it is seeing the CL Program because if I change the VB to pass fewer parameters I get an error message saying that I am passing a wrong number of paramters.

The CL Program executes fine from a command line on the AS/400 both through a CALL with parameters and through a simple command I have created.  The CL program's purpose is to put an active job on HOLD or RELEASE base on the parameters passed.  It accepts a &CHGSTATUS parameter (HLD or RLS) and &JOBNAM parameter.  The &JOBNAM is passed through a common RPG module to retrieve the job number, etc so the correct job can be accessed.  

I am including both the VB and CL code for review.  I have tried putting a delay in the CL and then running the VB application in an attempt to find the JOB on the AS/400 and start an interactive debug against it so I can see what is happening.  However, I have never been able to find the job on the system.

Thanks in advance for all comments and assistance.

'******VB CODE************

Private Function A400TST()
Dim systemNames As New cwbx.systemNames
Dim as400 As New cwbx.AS400System
Dim pgmCatNRls As New cwbx.Program
Dim parms As New cwbx.ProgramParameters
Dim strCvtr As New cwbx.StringConverter

as400.Define systemNames.DefaultSystem

Set pgmCatNRls.System = as400

pgmCatNRls.LibraryName = "KLDEVELOP"
pgmCatNRls.ProgramName = "CATCHNRELS"

strCvtr.Length = 3
parms.Append "CHGSTATUS", cwbrcInput
parms("CHGSTATUS") = strCvtr.ToBytes("HLD")
strCvtr.Length = 10
parms.Append "JOBNAM", cwbrcInput
parms("JOBNAM") = strCvtr.ToBytes("TWEBOS")

GetLibraryDesc.Call parms

End Function



'********** AS/400 CL ***********
 HLDTRGMON:  PGM        PARM(&CHGSTATUS &JOBNAM)                                
                                                                               
 /********************************************************************/        
 /********************************************************************/        
 /*                                                                  */        
 /*                                                                  */        
 /*    DATE      PROJ              DESCRIPTION           PROGRAMMER  */        
 /*  --------   -----    ------------------------------  ----------  */        
 /*  03/13/04   Weboes   NEW APPLICATION                 K. Latoz    */        
 /*                                                                  */        
 /*                                                                  */        
 /*                                                                  */        
 /********************************************************************/        
 /********************************************************************/        
             DCL        VAR(&CHGSTATUS)  TYPE(*CHAR) LEN(3)                    
             DCL        VAR(&JOBNAM)  TYPE(*CHAR) LEN(10)                      
             DCL        VAR(&PASSINFO)   TYPE(*CHAR) LEN(275)                  
             DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(10)                      
             DCL        VAR(&JOBUSR) TYPE(*CHAR) LEN(10) +                      
                          VALUE('*ALL')                                        
             DCL        VAR(&JOBNUM) TYPE(*CHAR) LEN(6) VALUE('*ALL')          
             DCL        VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) VALUE('*')            
             DCL        VAR(&JOBSTS) TYPE(*CHAR) LEN(10) +                      
                          VALUE('*ACTIVE')                                      
             DCL        VAR(&ENTRYNBR) TYPE(*DEC) LEN(5 0) VALUE(0)            
             DCL        VAR(&ENTRYAVL) TYPE(*DEC) LEN(5 0) VALUE(0)            
             DCL        VAR(&RTNJOBNAM)  TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&RTNUSRPRF)  TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&RTNJOBNBR)  TYPE(*CHAR) LEN(6)                    
             DCL        VAR(&RTNJOBTYP)  TYPE(*CHAR) LEN(1)                    
             DCL        VAR(&RTNSUBTYP)  TYPE(*CHAR) LEN(1)                    
             DCL        VAR(&RTNJOBSTS)  TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&ACTSTS)     TYPE(*CHAR) LEN(4)                    
             DCL        VAR(&CURUSER)    TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&COMPSTS)    TYPE(*CHAR) LEN(1)                    
             DCL        VAR(&TIMEACT)    TYPE(*CHAR) LEN(13)                    
             DCL        VAR(&TIMEENT)    TYPE(*CHAR) LEN(13)                    
             DCL        VAR(&FUNCTYP)    TYPE(*CHAR) LEN(1)                    
             DCL        VAR(&FUNCNAM)    TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&GRPPRF)     TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&JOBACCT)    TYPE(*CHAR) LEN(15)                    
             DCL        VAR(&JOBDLIB)    TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&JOBDNAME)   TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&JOBQLIB)    TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&JOBQNAME)   TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&JOBQSTS)    TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&SBSDLIB)    TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&SBSDNAME)   TYPE(*CHAR) LEN(10)                    
             DCL        VAR(&RTNINTNBR)  TYPE(*CHAR) LEN(16)                    
             DCL        VAR(&XLDMSGDTA)  TYPE(*CHAR) LEN(26)                    
             DCL        VAR(&XLDMSGINF)  TYPE(*CHAR) LEN(10)                    
                                                                               
             DCL        VAR(&DATALIB) TYPE(*CHAR) LEN(10)                      
             DCL        VAR(&SRCLIB)  TYPE(*CHAR) LEN(10)                      
             DCL        VAR(&LIBPTR)  TYPE(*DEC) LEN(4) VALUE(1)                
             DCL        VAR(&GOODEOJ)   TYPE(*CHAR) LEN(01) VALUE(N)            
                                                                               
             MONMSG     MSGID(CPF0000 CPF9999 MCH0000 MCH9999 +                
                        CPD0000 CPD9999 LBL0000 LBL9999 RPG0000) +              
                        EXEC(GOTO CMDLBL(ERREXIT))                              
                                                                               
             CHGJOB     LOG(4 0 *SECLVL) INQMSGRPY(*RQD)                        
                                                                               
       /*    CLRLIB     LIB(QTEMP)  */                                          
             CHGCURLIB  CURLIB(*CRTDFT)                                        
             RTVDTAARA  DTAARA(*LIBL/LIBDTAARA (&LIBPTR 10 )) +                
                          RTNVAR(&DATALIB)                                      
             CHGVAR     VAR(&LIBPTR) VALUE(&LIBPTR + 20)                        
             RTVDTAARA  DTAARA(*LIBL/LIBDTAARA (&LIBPTR 10 )) +                
                          RTNVAR(&SRCLIB)                                      
             CRTDTAARA  DTAARA(QTEMP/RETCODEDTA) TYPE(*CHAR) LEN(4) +          
                          VALUE('0000')                                        
             MONMSG     MSGID(CPF1023)                                          
             CHGVAR     VAR(&JOBNAME) VALUE(&JOBNAM)                            
                                                                               
             DLYJOB     DLY(1)                                                  
/********************************************************************/          
/********************************************************************/          
/*   THIS SUBROUTINE WILL CALL A COMMON MODULE TO RETRIEVE INFO     */          
/*   FOR SPECIFIC JOB(S).                                           */          
/********************************************************************/          
/********************************************************************/          
JOBINFO:                                                                        
             CHGVAR     VAR(%SST(&PASSINFO   1  10)) VALUE(&JOBNAME)            
             CHGVAR     VAR(%SST(&PASSINFO  11  10)) VALUE(&JOBUSR)            
             CHGVAR     VAR(%SST(&PASSINFO  21   6)) VALUE(&JOBNUM)            
             CHGVAR     VAR(%SST(&PASSINFO  27   1)) VALUE(&JOBTYPE)            
             CHGVAR     VAR(%SST(&PASSINFO  28  10)) VALUE(&JOBSTS)            
             CHGVAR     VAR(%SST(&PASSINFO  38   5)) VALUE(&ENTRYNBR)          
             CHGVAR     VAR(%SST(&PASSINFO  43   5)) VALUE(&ENTRYAVL)          
                                                                               
             CALL       PGM(N990080C) PARM(&PASSINFO)                          
                                                                               
             CHGVAR     VAR(&JOBNAME)   VALUE(%SST(&PASSINFO   1 10))          
             CHGVAR     VAR(&JOBUSR)    VALUE(%SST(&PASSINFO  11 10))          
             CHGVAR     VAR(&JOBNUM)    VALUE(%SST(&PASSINFO  21  6))          
             CHGVAR     VAR(&JOBTYPE)   VALUE(%SST(&PASSINFO  27  1))          
             CHGVAR     VAR(&JOBSTS)    VALUE(%SST(&PASSINFO  28 10))          
             CHGVAR     VAR(&ENTRYNBR)  VALUE(%SST(&PASSINFO  38  5))          
             CHGVAR     VAR(&ENTRYAVL)  VALUE(%SST(&PASSINFO  43  5))          
             CHGVAR     VAR(&RTNJOBNAM) VALUE(%SST(&PASSINFO  48 10))          
             CHGVAR     VAR(&RTNUSRPRF) VALUE(%SST(&PASSINFO  58 10))          
             CHGVAR     VAR(&RTNJOBNBR) VALUE(%SST(&PASSINFO  68  6))          
             CHGVAR     VAR(&RTNJOBTYP) VALUE(%SST(&PASSINFO  74  1))          
             CHGVAR     VAR(&RTNSUBTYP) VALUE(%SST(&PASSINFO  75  1))          
             CHGVAR     VAR(&RTNJOBSTS) VALUE(%SST(&PASSINFO  76 10))          
             CHGVAR     VAR(&ACTSTS)    VALUE(%SST(&PASSINFO  86  4))          
             CHGVAR     VAR(&CURUSER)   VALUE(%SST(&PASSINFO  90 10))          
             CHGVAR     VAR(&COMPSTS)   VALUE(%SST(&PASSINFO 100  1))          
             CHGVAR     VAR(&TIMEACT)   VALUE(%SST(&PASSINFO 101 13))          
             CHGVAR     VAR(&TIMEENT)   VALUE(%SST(&PASSINFO 114 13))          
             CHGVAR     VAR(&FUNCTYP)   VALUE(%SST(&PASSINFO 127  1))          
             CHGVAR     VAR(&FUNCNAM)   VALUE(%SST(&PASSINFO 128 10))          
             CHGVAR     VAR(&GRPPRF)    VALUE(%SST(&PASSINFO 138 10))          
             CHGVAR     VAR(&JOBACCT)   VALUE(%SST(&PASSINFO 148 15))          
             CHGVAR     VAR(&JOBDNAME)  VALUE(%SST(&PASSINFO 163 10))          
             CHGVAR     VAR(&JOBDLIB)   VALUE(%SST(&PASSINFO 173 10))          
             CHGVAR     VAR(&JOBQNAME)  VALUE(%SST(&PASSINFO 183 10))          
             CHGVAR     VAR(&JOBQLIB)   VALUE(%SST(&PASSINFO 193 10))          
             CHGVAR     VAR(&JOBQSTS)   VALUE(%SST(&PASSINFO 203 10))          
             CHGVAR     VAR(&SBSDNAME)  VALUE(%SST(&PASSINFO 213 10))          
             CHGVAR     VAR(&SBSDLIB)   VALUE(%SST(&PASSINFO 223 10))          
             CHGVAR     VAR(&RTNINTNBR) VALUE(%SST(&PASSINFO 233 16))          
                                                                               
                                                                               
             IF         COND(&CHGSTATUS *EQ 'HLD') THEN(DO)                    
                HLDJOB     JOB(&RTNJOBNBR/&RTNUSRPRF/&RTNJOBNAM)                
             ENDDO                                                              
             ELSE DO                                                            
                IF COND(&CHGSTATUS *EQ 'RLS') THEN(DO)                          
                   RLSJOB JOB(&RTNJOBNBR/&RTNUSRPRF/&RTNJOBNAM)                
                ENDDO                                                          
                ELSE DO                                                        
                   GOTO CMDLBL(ERRCHK)                                          
                ENDDO                                                          
             ENDDO                                                              
 GOODEND:                                                                      
             CHGVAR     VAR(&GOODEOJ) VALUE('Y')                                
 ERRCHK:     IF         COND(&GOODEOJ *EQ 'Y') THEN(GOTO ERREXIT)              
                                                                               
             RTVJOBA    NBR(&XLDMSGINF)                                        
             CHGVAR     VAR(&XLDMSGDTA) VALUE(&XLDMSGINF)                      
             RTVJOBA    USER(&XLDMSGINF)                                        
             CHGVAR     VAR(%SST(&XLDMSGDTA  7 10)) VALUE(&XLDMSGINF)          
             RTVJOBA    JOB(&XLDMSGINF)                                        
             CHGVAR     VAR(%SST(&XLDMSGDTA 17 10)) VALUE(&XLDMSGINF)          
                                                                               
             SNDPGMMSG  MSGID(XLD0001) MSGF(QABORT) +                          
                          MSGDTA(&XLDMSGDTA) TOUSR(*SYSOPR) +                  
                          MSGTYPE(*ESCAPE)                                      
             MONMSG     MSGID(CPF0000 MCH0000)                                  
                                                                               
             SNDPGMMSG  MSGID(XLD0001) MSGF(QABORT) +                          
                          MSGDTA(&XLDMSGDTA) MSGTYPE(*ESCAPE)                  
             MONMSG     MSGID(CPF0000 MCH0000)                                  
                                                                               
 ERREXIT:                                                                      
             ENDPGM                                                            

0
Comment
Question by:apklatoz
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 3
  • 2
12 Comments
 
LVL 14

Expert Comment

by:daveslater
ID: 10731357
Hi
I can have a look next week if no one else responds

Dave
0
 
LVL 2

Expert Comment

by:MrPan
ID: 10739551
You have an unreferenced variable change the last line to be

pgmCatNRls.Call parms
0
 
LVL 1

Author Comment

by:apklatoz
ID: 10740806
Thanks - that was in there incorrectly.  It was a left over from trial and retrial.  However, even after changing the line I still get the same results.  The VB appears to execute correctly but the AS/400 CL doesn't seem to perform it's function of putting the application on Hold.  Again the CL works from a command line on the AS/400.

Thanks
0
Veeam Disaster Recovery in Microsoft Azure

Veeam PN for Microsoft Azure is a FREE solution designed to simplify and automate the setup of a DR site in Microsoft Azure using lightweight software-defined networking. It reduces the complexity of VPN deployments and is designed for businesses of ALL sizes.

 
LVL 14

Expert Comment

by:daveslater
ID: 10740825
Hi
just a quick thought. When processed from VB does the user have the authority to change the job?

Dave
0
 
LVL 14

Expert Comment

by:daveslater
ID: 10740849
Ps
for a quick test you could re-create the cl using adopted authority, and set the usrprf to *owner and set the owner to some one who has a bit of authority.

Dave
0
 
LVL 1

Author Comment

by:apklatoz
ID: 10740921
I tried this and did not get any different results.  I would've expected that if it was an authority issue I wouldn't be able to see the program at all and it appears that I am able to see the program since I can create an error message when I change the number of Parms the CL is expecting.

I appreciate your continued suggestions
0
 
LVL 14

Expert Comment

by:daveslater
ID: 10741063
Hi
you have declared you program as

Dim pgmCatNRls As New cwbx.Program

but you are trying to run  program

GetLibraryDesc.Call parms

try
pgmCatNRls.call parms

Dave
0
 
LVL 14

Expert Comment

by:daveslater
ID: 10741167
Hi
change the CL to send a message to yourself before and after the call to

CALL       PGM(N990080C) PARM(&PASSINFO)

you can then tell if the &passinfo is populated correctly

Dave
0
 
LVL 14

Accepted Solution

by:
daveslater earned 750 total points
ID: 10741185
The job name will be

QZRCSRVS under QUSER

dave
0
 
LVL 2

Expert Comment

by:MrPan
ID: 10741193
I think it might be special authorities you would have to

CHGUSRPRF USRPRF(XXXX) SPCAUT(*JOBCTL)

where xxx is the user running the JOb

Or you could compile your cl with a user who has authority and make it

 CHGPGM PGM(A) USRPRF(*OWNER)

You might then have to grant access for other users to use it.

Either of these should get around your problem
0
 
LVL 1

Author Comment

by:apklatoz
ID: 10742259
Thanks to all.  I awarded points to daveslater because his info on the location of the JOB on the AS/400 and the SNDUSRMSG both contributed to my finding the problem.  With his information I was able to find a job log and realized that QUSER user profile didn't have the correct libraries in its profile to setup the job environment.  When I hard coded the libraries into the job it took off like a champ.  I get queazy hard coding libraries with Test and Production environments but I'm going to get around it by adding a "MODE" parameter which will let the program know T or P and add the appropriate libraries.  

Thanks to all for their time and Help!
0
 
LVL 14

Expert Comment

by:daveslater
ID: 10744330
Hi
Thanks for the points, but in my opinion this was a joint effort in sorting the problem.
There is  a facility to split the points between experts.
I think a 60 / 40 split would have been fair.

Dave
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Ready to improve network connectivity? Watch this webinar to learn how SD-WANs and a one-click instant connect tool can boost provisions, deployment, and management of your cloud connection.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article will show how Aten was able to supply easy management and control for Artear's video walls and wide range display configurations of their newsroom.
The Summer 2017 Scholarship Winners have been announced!
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
In this video, Percona Director of Solution Engineering Jon Tobin discusses the function and features of Percona Server for MongoDB. How Percona can help Percona can help you determine if Percona Server for MongoDB is the right solution for …

764 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question