cancel
Showing results for 
Search instead for 
Did you mean: 

BSI New RFC Wrapper on System i

Former Member
0 Kudos

We currently use the Unicode version of the NWRFC libraries for calls to rfcexec and startrfc. (i.e. SERVER_EXEC). However, the pending changes to the BSI programs will require us to use the EBCDIC libraries for their RFC calls. If I understand OSS note 1097797 correctly, we can have both at the same time. From that note, “In this case, you may have installed two variants of the SDK on your server in parallel; the EBCDIC/UNICODE (ILE) variant in its function as SDK and the UNICODE (PASE) variant as supplement to the SAP kernel.” I am not completely clear how I will do that. Can anyone explain further? Do I need to add the new library (in my case R3720NWRFC) to the library list of the job description for user TF10 (the BSI user on the system i). Something else? Something additional? Does anyone actually have BSI10, Cyclic J, New RFC Wrapper actually working?

Accepted Solutions (0)

Answers (1)

Answers (1)

joachim_kern
Explorer
0 Kudos

Hello Rick,

first of all the correct number of the SAP Note is 1097997.

If I understand you right, you are currently using the PASE UNICODE NWRFCSDK to use the programs startrfc and rfcexec.

Now you want to install an additional ILE EBCDIC NWRFCSDK beside.

Just follow the description in the section 'Installation of the EBCDIC ILE version'.

Please avoid collisions with already existing libraries or ifs directories. In this case use your own names.

Before you start any program using the EBCDIC NWRFCSDK please ensure that the current library and the current ifs directory appropriately. If you want you can add it to the job description of the user running the job. I would prefer to write a small CL that does the CD and the CHGCURLIB and then calls the NWRFC program.

Best regards

Joachim

Former Member
0 Kudos

Joachim - thank you for correcting the note number. The only time the NWRFC EBCDIC modules are being called is through the BSI tax interface so a frontend CL is probably not in the cards. I believe I have followed the instructions for installing same correctly. However, when I run RPUTLTU0 to test the Tax Locator or RPUBTCU0 to test Tax Factory , I get "Communication error, CPIC return code 020, SAP return code 223" in SM21 which doesn't tell me much. However, when I look at the joblog on the 400 side, I am getting a decimal data error (MCH1202) to module SAPFUNC. to procedure bsi2sapAMOUNT. At this point, I am thinking about copying all of the service programs and programs from the NWRFC library into the BSI library (TF10), but I'm not super confident that will help. Also, adding the library to the job description of the user is probably a non-starter as well, since the programs actually run under the instance ADM profile. Altering that library list might just be asking for more trouble. I was hoping someone had already been through the installation of the BSI cyclic J with the new RFC wrapper and might have seen this already.

Former Member
0 Kudos

After getting my intelligence insulted by SAP for the last few months, I have returned in the hopes you can help me out. I've elected to try the frontend CL route as you suggested. However, when I use that CL program in the program for the RFC destination, it dumps on the 400 with " Program QP0ZPCPN attempted to call program TF10RFC with 13 parameters. Program TF10RFC expects a minimum of 0 and a maximum of 0". Do you (or anyone) know what those 13 parameters might be? Or is there a way to code around that? Thanks - Rick

joachim_kern
Explorer
0 Kudos

Hi Rick,

please attach the source code of the CL.

best regards

Joachim

Former Member
0 Kudos

Pretty basic stuff - error handlers and three lines "work" - Here you go.

    PGM

/*  SYNOPSIS:                                                          */

/*  Change current directory to /R3720NWRFC

/*  Change current library to   R3720NWRFC                            */

/*  Call program TF10                                                 */

/*  to make it work.                                                  */

/* For retrieving attributes of this job:                            */

             DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)

             DCL        VAR(&USER) TYPE(*CHAR) LEN(10)

             DCL        VAR(&NBR) TYPE(*CHAR) LEN(6)

             DCL        VAR(&LOGLVL) TYPE(*CHAR) LEN(1)

             DCL        VAR(&LOGSEVN) TYPE(*DEC) LEN(2 0)

             DCL        VAR(&LOGTYPE) TYPE(*CHAR) LEN(10)

             DCL        VAR(&LOGCLPGM) TYPE(*CHAR) LEN(10)

             DCL        VAR(&INQMSGRPY) TYPE(*CHAR) LEN(10)

             DCL        VAR(&OUTQ) TYPE(*CHAR) LEN(10)

             DCL        VAR(&OUTQLIB) TYPE(*CHAR) LEN(10)

             DCL        VAR(&ACGCDE) TYPE(*CHAR) LEN(15)

             DCL        VAR(&DATE) TYPE(*CHAR) LEN(6)

             DCL        VAR(&SWS) TYPE(*CHAR) LEN(8)

             DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)

             DCL        VAR(&RTNCDEN) TYPE(*DEC) LEN(5 0)

             DCL        VAR(&ENDSTS) TYPE(*CHAR) LEN(1)

             DCL        VAR(&RUNPTYN) TYPE(*DEC) LEN(2 0)

             DCL        VAR(&TIMESLICEN) TYPE(*DEC) LEN(7 0)

             DCL        VAR(&PURGE) TYPE(*CHAR) LEN(10)

             DCL        VAR(&DFTWAITN) TYPE(*DEC) LEN(7 0)

             DCL        VAR(&USRLIBL) TYPE(*CHAR) LEN(275)

             DCL        VAR(&SBMMSGQ) TYPE(*CHAR) LEN(10)

             DCL        VAR(&SBMMSGQLIB) TYPE(*CHAR) LEN(10)

             DCL        VAR(&PRTTXT) TYPE(*CHAR) LEN(30)

             DCL        VAR(&DDMCNV) TYPE(*CHAR) LEN(5)

             DCL        VAR(&BRKMSG) TYPE(*CHAR) LEN(7)

             DCL        VAR(&DATFMT) TYPE(*CHAR) LEN(4)

             DCL        VAR(&DATSEP) TYPE(*CHAR) LEN(1)

             DCL        VAR(&CURLIB) TYPE(*CHAR) LEN(10)

             DCL        VAR(&PRTDEV) TYPE(*CHAR) LEN(10)

             DCL        VAR(&SYSLIBL) TYPE(*CHAR) LEN(165)

             DCL        VAR(&CURUSER) TYPE(*CHAR) LEN(10)

             DCL        VAR(&SUBTYPE) TYPE(*CHAR) LEN(1)

             DCL        VAR(&PRTKEYFMT) TYPE(*CHAR) LEN(10)

             DCL        VAR(&TIMSEP) TYPE(*CHAR) LEN(1)

             DCL        VAR(&TSEPOOL) TYPE(*CHAR) LEN(10)

             DCL        VAR(&DEVRCYACN) TYPE(*CHAR) LEN(13)

             DCL        VAR(&STSMSG) TYPE(*CHAR) LEN(7)

             DCL        VAR(&CCSIDN) TYPE(*DEC) LEN(5 0)

/* Program variables */

/* NON - Standard error routine */

             DCL        VAR(&ERRORSW   ) TYPE(*LGL )

             DCL        VAR(&EMSGID) TYPE(*CHAR) LEN(7)

             DCL        VAR(&EMSGDTA) TYPE(*CHAR) LEN(100)

             DCL        VAR(&EMSGF) TYPE(*CHAR) LEN(10)

             DCL        VAR(&EMSGFLIB) TYPE(*CHAR) LEN(10)

             MONMSG     MSGID(CPD0000 CPF0000 UEX0000 Y2U0000 +

                          RPG0000 MCH0000 SAP0000) EXEC(GOTO +

                          CMDLBL(STDERR1))

/* Retrieve attributes of this job (for debug analysis - visible in CL dump)  */

             RTVJOBA    JOB(&JOB) USER(&USER) NBR(&NBR) +

                          LOGLVL(&LOGLVL) LOGSEV(&LOGSEVN) +

                          LOGTYPE(&LOGTYPE) LOGCLPGM(&LOGCLPGM) +

                          INQMSGRPY(&INQMSGRPY) OUTQ(&OUTQ) +

                          OUTQLIB(&OUTQLIB) ACGCDE(&ACGCDE) +

                          DATE(&DATE) SWS(&SWS) TYPE(&TYPE) +

                          RTNCDE(&RTNCDEN) ENDSTS(&ENDSTS) +

                          RUNPTY(&RUNPTYN) TIMESLICE(&TIMESLICEN) +

                          PURGE(&PURGE) DFTWAIT(&DFTWAITN) +

                          USRLIBL(&USRLIBL) SBMMSGQ(&SBMMSGQ) +

                          SBMMSGQLIB(&SBMMSGQLIB) PRTTXT(&PRTTXT) +

                          DDMCNV(&DDMCNV) BRKMSG(&BRKMSG) +

                          DATFMT(&DATFMT) DATSEP(&DATSEP) +

                          CURLIB(&CURLIB) PRTDEV(&PRTDEV) +

                          SYSLIBL(&SYSLIBL) CURUSER(&CURUSER) +

                          SUBTYPE(&SUBTYPE) PRTKEYFMT(&PRTKEYFMT) +

                          TIMSEP(&TIMSEP) TSEPOOL(&TSEPOOL) +

                          DEVRCYACN(&DEVRCYACN) STSMSG(&STSMSG) +

                          CCSID(&CCSIDN)

             CD         DIR('/R3720NWRFC')

             CHGCURLIB  CURLIB(R3720NWRFC)

             CALL       PGM(TF10)

             RCLRSC

             RETURN     /* Normal end of program                   */

/**********                                                    ***********/

STDERR1:               /* Standard error handling routine */

             IF         COND(&ERRORSW) THEN(SNDPGMMSG MSGID(CPF9999) +

                          MSGF(QCPFMSG) MSGTYPE(*ESCAPE)) /* Fn chk */

             CHGVAR     VAR(&ERRORSW) VALUE('1') /* Set to fail if +

                          another error occurs */

/* Send messages back to caller                                          */

STDERR2:    RCVMSG     MSGTYPE(*DIAG) MSGDTA(&EMSGDTA) +

                          MSGID(&EMSGID) MSGF(&EMSGF) +

                          SNDMSGFLIB(&EMSGFLIB)

             IF         COND(&EMSGID *EQ '       ') THEN(GOTO +

                          CMDLBL(STDERR3))

             SNDPGMMSG  MSGID(&EMSGID) MSGF(&EMSGFLIB/&EMSGF) +

                          MSGDTA(&EMSGDTA) TOPGMQ(*EXT) MSGTYPE(*DIAG)

             GOTO       CMDLBL(STDERR2) /* Loop back for addl +

                          diagnostics */

STDERR3:    RCVMSG     MSGTYPE(*EXCP) MSGDTA(&EMSGDTA) +

                          MSGID(&EMSGID) MSGF(&EMSGF) +

                          SNDMSGFLIB(&EMSGFLIB)

             SNDPGMMSG  MSGID(&EMSGID) MSGF(&EMSGFLIB/&EMSGF) +

                          MSGDTA(&EMSGDTA) TOPGMQ(*EXT) MSGTYPE(*COMP)

             RETURN     /* Error end of program                   */

     ENDPGM

joachim_kern
Explorer
0 Kudos

Hi Rick,

I seemed to missunderstood the problem.

Is TF10RFC the CL wrapper?

If so the call of the wrapper produces the error and not the call of TF10 by the wrapper. This was my missunderstanding.

OK the CL wrapper consumes no argument and CL programs are not variable with their arguments as C programs are. The C program gets its argv vector and can do what it wants including ignoring it. A CL program cannot. So the CL program is registered in the system and called with 13 arguments, which should be propagated to TF10.

OK now I'm realizing that my idea of a CL wrapper was not a good solution.

Could you please provide the information in detail how your BSI cyclic is registered in the system. Maybe I could find a solution here.

Sorry for the inconveniences.

Best regards

Joachim