|
Hello Mihael,
> is it possible in rpg to return a value from a program. i don't mean to
> get a return value of a procedure.
Actually, that's not what you're looking for. Please read on...
> i like to do something in perl like this:
> $myvar = `system myrpgprogram`;
This code does not get the return value of your program. Instead, what it
does is load $myvar with any data that your program writes to STDOUT.
Again, assuming that you're working with QShell which is a
descriptor-based environment, you can write to STDOUT by writing data to
descriptor #1.
If you're not using QShell then you may have to use the QtmhWrStout to
write to stdout, or else enable descriptor I/O by setting the appropriate
environment variable. I haven't experimented with the environment
variable, though...
Also the QShell "system" program is for running CL commands, not calling
programs. You can call a program directly by using it's IFS pathname, you
don't need "system". For example, to call a program called "MYPGM" in
library "MYLIB" you'd specify:
/qsys.lib/MYLIB.lib/MYPGM.pgm
> but i don't know how i should define my prototype in the rpg program.
> the rpg program name is BS_SUBS. it tried it like this:
>
> DMain PR 10A EXTPGM('BS_SUBS')
> D subname 10A
> D sublib 10A
> *
> *Entry list (parameter)
> DMain PI 10A
> D subname 10A
> D sublib 10A
>
> but it says that a return value is not supported with EXTPGM key word.
That's correct. RPG cannot return a value from a program. However, the
perl code that you've posted doesn't use the return value anyway, so it
doesn't matter. It reads data from the program's stdout, as I mentioned
above.
Here's a sample ILE RPG program that writes data using descriptor I/O:
H DFTACTGRP(*NO)
DMain PR EXTPGM('BS_SUBS')
D subname 10A
D sublib 10A
*Entry list (parameter)
DMain PI
D subname 10A
D sublib 10A
D write PR 10I 0 extproc('write')
D fd 10I 0 value
D data 32767A options(*varsize) const
D len 10I 0 value
D mydata s 100A varying
*
* QShell null-terminates it's parms. Here we use the %str()
* bif to extract the full parm into a string that we can
* write to stdout:
c if %parms >= 2
c eval mydata = 'parms were '
c + %str(%addr(subname)) + ', '
c + %str(%addr(sublib))
c + x'0D25'
c else
c eval mydata = 'no parameters were passed!'
c + x'0D25'
c endif
*
* Write "mydata" to standard output. It is assumed that we
* are using descriptor 1 for stdout, for compatibility with
* Qshell...
*
c callp write(1: mydata: %len(mydata))
c eval *inlr = *on
I tested this program by calling it from the following trivial Perl
script:
$myvar = `/qsys.lib/MYLIBRARY.lib/bs_subs.pgm testparm1 testparm2`;
print $myvar
When that perl script is run from QShell, it executes the program called
BS_SUBS in library MYLIBRARY. It passed two parameters "testparm1" and
"testparm2"
If you run that perl script, the output looks like this:
----------------------------------------------------------------------------
QSH Command Entry
$
> perl test.pl
parms were testparm1, testparm2
$
----------------------------------------------------------------------------
Hope that helps...
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.