×

Good News Everybody!

The new search engine is LIVE!

Please report any problems to david (at) midrange.com.




Hi John,

Actually Zend finally did get back to me with the solution late yesterday.

In order to work with the individual elements of a data structure array from
RPG, you have to do it like this.

First, given the following PCML:

<struct name="OUT_ARRAY">
<data name="OUT_NAME1" type="char" length="30" usage="inherit" />
<data name="OUT_TICKET1" type="char" length="14" usage="inherit" />
</struct>
<program name="ATESTX1" path="/QSYS.LIB/ALIB.LIB/ATESTX1.PGM">
<data name="KSOCKCN" type="char" length="2" usage="inputoutput" />
<data name="KSOCKYR" type="char" length="2" usage="inputoutput" />
<data name="KSOCKTY" type="char" length="2" usage="inputoutput" />
<data name="KSOCKNO" type="char" length="7" usage="inputoutput" />
<data name="OUT_NAME" type="char" length="30" usage="inputoutput" />
<data name="OUT_TICKET" type="char" length="14" usage="inputoutput" />
<data name="OUT_ARRAY" type="struct" struct="OUT_ARRAY" count="5"
usage="inputoutput" />
</program>



And given that you want to access the individual elements within OUT_ARRAY,
the data structure array, you define it in PHP like this:


$out_parameters = array(
"OUT_NAME"=>"OUT_NAME",
"OUT_TICKET"=>"OUT_TICKET",
"OUT_ARRAY"=>"OUT_ARRAY");


Rather than defining it like a normal multidimensional PHP array which would
have been like this:


$out_parameters = array(
"OUT_NAME"=>"OUT_NAME",
"OUT_TICKET"=>"OUT_TICKET",
"OUT_ARRAY"=>array("OUT_NAME1"=>"OUT_NAME1",
"OUT_TICKET1"=>"OUT_TICKET1"));


Then to get to the results after the I5_Program_Call you would do this:

print "The value of Out_NAME1 is: ".$OUT_ARRAY[0]["OUT_NAME1"];
print "The value of Out_NAME1 is: ".$OUT_ARRAY[0]["OUT_TICKET1"];
print "The value of Out_NAME1 is: ".$OUT_ARRAY[1]["OUT_NAME1"];
print "The value of Out_NAME1 is: ".$OUT_ARRAY[1]["OUT_TICKET1"];

etc...


I would have never thought of that particular combination to make this work,
but work it does. Very slick actually and makes passing a large number of
records in a single I5_Program_Call really simple.

Thanks for you suggestion too!

Shannon O'Donnell


-----Original Message-----
From: web400-bounces@xxxxxxxxxxxx [mailto:web400-bounces@xxxxxxxxxxxx] On
Behalf Of Jon Paris
Sent: Friday, February 27, 2009 7:09 PM
To: web400@xxxxxxxxxxxx
Subject: Re: [WEB400] PHP Syntax Question


On 27-Feb-09, at 1:00 PM, web400-request@xxxxxxxxxxxx wrote:

I am having trouble understanding why I cannot print the contents of a
returned PHP array from an I5_Program_Call.

Shannon,

The example below works - it is not as complex a situation as yours (I
always work from simple - it suits my brain!) but you should be able
to adapt. I'm also going to copy my Zend contacts on this because
there are no examples of using an array that I can find and there are
things like countref that are available in the interface that I can
find nothing about at all.

Anyway - here's the PHP:

<?php
include("conn.php");
/* connection step */
$Hdlcon = i5_connect($connect,$user, $pass,
array(I5_OPTIONS_JOBNAME=>"I5JOB"));

$description = file_get_contents("/www/zendcore/htdocs/ARRAY.pcml")
or trigger_error("Error while opening PCML file", E_USER_ERROR);

// Prepare the program
($hdlPgm = i5_program_prepare_PCML($description))
or trigger_error("Error while parsing PCML: " . i5_errormsg(),
E_USER_ERROR);

// Define input values
$in_parameters = Array("IOARRAY"=>array("One","Two","Three","Four"));

// And output variables
$out_parameters = array("IOARRAY"=>"IOARRAY");

echo "<br>Here's the input parms: ";
var_dump($in_parameters);

// Make the call
i5_program_call($hdlPgm, $in_parameters, $out_parameters)
or trigger_error("Error while executing program: " . i5_errormsg(),
E_USER_ERROR);

echo "<br><br>And here's the resulting output: ";
var_dump($IOARRAY);

?>

And here's the RPG program. The Printer part was introduced because I
couldn't tell where the failures were occurring.

FQprint O F 132 Printer

D Array Pr ExtPgm('ARRAY/PARTNER400')
D IOArray 5a Dim(4)

D Array PI
D IOArray 5a Dim(4)

D x S 5i 0

/Free
except info;
For x = 1 to %Elem(IOArray);
IOArray(x) = %Char(x);
EndFor;
except info;

*InLR = *On;
/End-Free

OQprint E info 2
O IOArray(1) 12
O IOArray(2) 24

Hope this helps.

We could certainly do with a few more examples of this type of program
call.


Jon Paris

www.Partner400.com
www.SystemiDeveloper.com



As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2026 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.