We help IT Professionals succeed at work.
Get Started

Read spool files from iseries in C#

Francisco Leon
on
872 Views
Last Modified: 2015-10-13
I am trying to read spool files from iseries in C# with the cwbx library, to that avail i have read the api and called the QUSCRTUS API in order to create an user space and then QUSLSPL to fill the user space with my user's spool data.

So far so good, i can see the user space being filled with the info i need:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   Ø0100SPLF0100QUSLSPL   1151007110852C   h   {   Y   ¢   ø   
    Ç       ì                                                    FLEON     QGPL      SPLF0100*CURRENT  *ALL                *ALL
      *ALL                                                                                                                     
                                           xxxxxxxxFLEON     *ALL                FLEON     QGPL                                
*ALL    *ALL                        FLEON     PRTCAJOD20QGPL      *STD      FLEON      i   ?» pà'e ®ø  G W   µià'wÇô}       FLE
ON     PRTCONT01 QUSRSYS   *STD      SIPD93     i   "ë q @ lÚ   èM´    ié@ÑÆ/-       FLEON     PRTINF01  QUSRSYS   *STD      HJ
PD05     i   ø  qÀ¦ü¶³}  D Õ   àiÀ¥] É\       FLEON     PRTVILLA05QUSRSYS   CHEQUES   FLEON      i   r  pø_ ½ ø   Õ'   ãiø_ j \
       FLEON     RGI462    QUSRSYS   *STD      CLPD741    i   h  ºmi)oNø  åÕ    ÏimýS Aµ       FLEON     PRTCON0206QUSRSYS   *S
TD      HJPD27     i   +¿ rk:ôá{{         ik:T  °       FLEON     PRTPACO   QUSRSYS   *STD      SIPD93     i   "ë q @ lÚ   Ñã· 
   i<º3 ê\       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Open in new window


My problem is that i don't know how to call the QUSRTVUS API in order to read the user space. I don't want to call any service program or code something in the iseries, i want everything to be done in my C# application. When i call the api i only see some x's instead of the list entries i need to then call the final API to read the contents.

Here's the call i am doing:

                programPointer.LibraryName = "QSYS";
                programPointer.ProgramName = "QUSRTVUS";
                programPointer.system = system;

                ProgramParameters parametersPointer = new ProgramParameters();
                //nombre userspace creado anteriormente
                parametersPointer.Append("usrspcnam", cwbrcParameterTypeEnum.cwbrcInout, 20);
                stringConverterUsrspcnam.Length = 20;
                parametersPointer["usrspcnam"].Value = stringConverterUsrspcnam.ToBytes("FLEON     QGPL      ");
                //posicion
                parametersPointer.Append("posicion", cwbrcParameterTypeEnum.cwbrcInout, 4);     
                LongConverter packedCovertedPosicion = new cwbx.LongConverterClass();
                parametersPointer["posicion"].Value = packedCovertedPosicion.ToBytes(1);
                //longitud
                parametersPointer.Append("longitud", cwbrcParameterTypeEnum.cwbrcInout, 4);
                LongConverterClass packedConverterLongitud = new cwbx.LongConverterClass();
                parametersPointer["longitud"].Value = packedConverterLongitud.ToBytes(140);
                //receptor
                parametersPointer.Append("receptor", cwbrcParameterTypeEnum.cwbrcOutput, 4);
                programPointer.Call(parametersPointer);

                Structure sc = new Structure();
                sc.Fields.Append("userarea", 64);
                sc.Fields.Append("sizeheader", 4);
                sc.Fields.Append("structurelevel", 4);
                sc.Fields.Append("formatname", 8);
                sc.Fields.Append("apiused", 10);
                sc.Fields.Append("datecreated", 13);
                sc.Fields.Append("infostatus", 1);
                sc.Fields.Append("usersize", 4);
                sc.Fields.Append("offsetinput", 4);
                sc.Fields.Append("sizeinput", 4);
                sc.Fields.Append("offsetheader", 4);
                sc.Fields.Append("sizeheader", 4);
                sc.Fields.Append("offsetlist", 4);
                sc.Fields.Append("sizelist", 4);
                sc.Fields.Append("numberlist", 4);
                sc.Fields.Append("sizeentry", 4);
                sc.Bytes = parametersPointer["receptor"].Value;
                StringConverter datos = new cwbx.StringConverterClass();
                string dat = datos.FromBytes(sc.Fields["apiused"].Value);
                dat = datos.FromBytes(sc.Fields["datecreated"].Value);

Open in new window


I am using the SPLF0100 format. My problem could be that the API is expecting binary variables instead of char or integers, so i may not know how to properly convert the data in the parameters. I tried to use a structure as shown above but i don't know if the length of each field can be declared literally from the api, which shows each field type and size.

For reference, the api documentation is in http://www-01.ibm.com/support/knowledgecenter/ssw_i5_54/apis/qusrtvus.htm
Comment
Watch Question
This problem has been solved!
Unlock 1 Answer and 4 Comments.
See Answer
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE