''[JMeh] 11 Jul 2017'' - RfcNwTcl
SAP NetWeaver RFC Tcl-API - Rev. 1.12 from 27. Nov 2014
Tcl-Library for executing RFC (Remote Function Calls) functions in and from a
SAP R/3 NetWeaver Server. Data can be transfered in both directions on each call
and can contain simple values, complex structures or tables (multiple rows of
structures). Each field in a structure or table can itself be a structure or
table. This allows nested tables to be transfered on a single RFC call.
The C source compiles on Windows and UNIX systems.<
>
You can download the C sources and some examples here:
http://sesam-gmbh.org/images/Downloads/Public/rfcnwtcl.zip
You need to install the SAP NetWeaver Library (with includes) which you get from
the SAP AG (if you are a customer). The libs are named libsapnwrfc.so and
libsapucum.so (see Makefile). The corersponding SAP installation package also
contains a Perl script for precompiling the source (see Makefile).
Nearly all RFC functions return with the text "RFC_OK" on success or "RFC_ERROR"
on failure.
The library is well tested with several RFC applications (client and server)
running on AIX, Linux and Windows. They transfer many megabytes of data each day.
Here is a simple client example to call a SAP function (Z_RFC_TEST01) on the SAP
server and send a text as a function parameter (REQUTEXT = "A simple test.").
The RFC function must be defined in the SAP system and you must have the rights
to make this call.:
======tcl
package require RfcNwTcl
Rfc::Init
Rfc::OpenConnection {DEST TST1}
Rfc::InvokeFunction Z_RFC_TEST01 {REQUTEXT "A simple test."}
Rfc::CloseConnection
======
Here is a server example to allow SAP to call the Tcl function named "MyCallback"
from a SAP server. The name of the callback function from SAP view is Z_RFC_TEST02.
It will be installed by invoking InstallServerFunction with both names.
The return value of the Tcl function in this example is a table named "TABDAT"
containing two rows with three columns. The structure of the function with their
parameters must also be defined in the SAP system!
======tcl
proc MyCallback {connAttr params} {
return {TABDATA {{123 456 "Row 1"} {789 321 "Row 2"}}}
}
package require RfcNwTcl
Rfc::Init
Rfc::OpenConnection {DEST TST1}
Rfc::InstallServerFunction Z_RFC_TEST02 MyCallback
Rfc::CloseConnection
while 1 {
if {[Rfc::RegisterServer {DEST TST1}] != "RFC_OK"} break
set retry true
while {$retry} {
switch [Rfc::ListenAndDispatch 600] {
RFC_OK - RFC_RETRY - RFC_ABAP_EXCEPTION {
set retry true
}
default {
set retry false
}
}
}
Rfc::CloseConnection
}
======
For all above examples the SAP connection requires to have a NetWeaver INI file
named "sapnwrfc.ini" with the following contents:
======none
DEST=TST1
TYPE=A
PROGRAM_ID=NWTEST1
GWHOST=192.168.0.100
GWSERV=sapservice
ASHOST=192.168.0.100
SYSNR=123
CLIENT=001
USER=sapuser
PASSWD=sappasswd
LANG=DE
TRACE=0
======
The contents must be modified to match your SAP server requirements.
Functions:
'''Rfc::DictToString dictValue'''<
>
Convert dictionary to readable text.<
>
Example:
======tcl
set info [Rfc::DescribeFunction Z_RFC_TEST01]
puts [Rfc::DictToString $info]
======
'''Rfc::GetVersion'''<
>
Return the version number of the C-library.<
>
Example:
======tcl
set info [Rfc::GetVersion]
======
'''Rfc::Init'''<
>
Initialize the Library. Must be the first RFC-function to call.<
>
Example:
======tcl
set rc [Rfc::Init]
======
'''Rfc::OpenConnection destination'''<
>
Opens a client connection to the SAP server. The parameter must specify a destination
of the INI file (see above) or the whole destination definition (without the INI file).<
>
Example 1:
======tcl
set rc [Rfc::OpenConnection {DEST TST1}]
======
Example 2:
======tcl
set connectionInfo {
TYPE A
PROGRAM_ID NWTEST1
GWHOST 192.168.0.100
GWSERV sapservice
ASHOST 192.168.0.100
SYSNR 123
CLIENT 001
USER sapuser
PASSWD sappasswd
LANG DE
TRACE 0
}
set rc [Rfc::OpenConnection $connectionInfo]
======
'''Rfc::GetConnectionAttributes'''<
>
Read the connection attributes (as a Tcl dictionary) from an existing SAP connection.<
>
The following dict items will be filled:
* dest
* host
* partnerHost
* sysNumber
* sysId
* client
* user
* language
* trace
* isoLanguage
* codepag
* partnerCodepage
* rfcRole
* type
* partnerType
* release
* partnerRelease
* kernelRelease
* cpicConvId
* progName
* partnerBytesPerChar
* partnerSystemCodepage
Example:
======tcl
set info [Rfc::GetConnectionAttributes]
======
'''Rfc::DescribeFunction functionName'''<
>
Get a function description (as a Tcl dictionary) from an existing SAP function.<
>
The dict contains the following elements:
* name (name of the RFC function)
* params (number of params of the RFC function)
* param_I (with I as 0..params-1 for each parameter)
A parameter itself contains the following items:
* name (name of the parameter)
* type (the SAP data type name)
* direction (parameter direction):
** RFC_EXPORT
** RFC_IMPORT
** RFC_CHANGING
** RFC_TABLES
* optional (specifies whether the value for this parameter has to be filled)
* length (size of the parameter in bytes)
* info (info text / comment)
* struct (only if the parameter is a struct or a table):
** type (type as RFCTYPE_STRUCTURE or RFCTYPE_TABLE)
** name (name of the structure or table)
** fields (number of fields in the structure or table)
** field_J (with J as 0..fields-1 for each structure):
*** name (name of the field in the structure or table)
*** type (data type of the field)
*** length (byte length of the field)
*** offset (byte offset of the field)
The following RFC data types exist:
* RFCTYPE_CHAR (1-byte or multibyte character, fixed size, blank padded)
* RFCTYPE_DATE (Date YYYYYMMDD)
* RFCTYPE_BCD (Packed number, any length between 1 and 16 bytes)
* RFCTYPE_TIME (Time (HHMMSS)
* RFCTYPE_BYTE (Raw data, binary, fixed length, zero padded.)
* RFCTYPE_TABLE (Internal table)
* RFCTYPE_NUM (Digits, fixed size, leading '0' padded.)
* RFCTYPE_FLOAT (Floating point, double precision)
* RFCTYPE_INT (4-byte integer)
* RFCTYPE_ABAPOBJECT (ABAP object.)
* RFCTYPE_STRUCTURE (ABAP structure)
* RFCTYPE_DECF16 (IEEE 754r decimal floating point, 8 bytes)
* RFCTYPE_DECF34 (IEEE 754r decimal floating point, 16 bytes)
* RFCTYPE_XMLDATA (No longer used!)
* RFCTYPE_STRING (Variable-length, null-terminated string)
* RFCTYPE_XSTRING (Variable-length raw string, length in bytes)
* RFCTYPE_INT8 (8-byte integer)
* RFCTYPE_UTCLONG (timestamp/long, 8-byte integer)
* RFCTYPE_UTCSECOND (timestamp/second, 8-byte integer)
* RFCTYPE_UTCMINUTE (timestamp/minute, 8-byte integer)
* RFCTYPE_DTDAY (date/day , 4-byte integer)
* RFCTYPE_DTWEEK (date/week, 4-byte integer
* RFCTYPE_DTMONTH (date/month, 4-byte integer)
* RFCTYPE_TSECOND (time/second, 4-byte integer)
* RFCTYPE_TMINUTE (time/minute, 2-byte integer)
* RFCTYPE_CDAY (calendar day, 2-byte integer)
Example:
======tcl
set info [Rfc::DescribeFunction Z_RFC_TEST01]
puts [Rfc::DictToString $info]
======
'''Rfc::GetErrorInfo'''<
>
Get the error description of the last RFC error.<
>
Example:
======tcl
set info [Rfc::GetErrorInfo]
puts [Rfc::DictToString $info]
======
'''Rfc::InvokeFunction functionName parameterDict'''<
>
Call a RFC function in the SAP system. The parameterDict must be filled with parameter
values (see Rfc::DescribeFunction).<
>
Example:
======tcl
set params {
PARAMTEXT "Only a Test."
PARAMVAL1 4711
PARAMVAL2 3.14159
PARAMTAB {
{123 456 "Hello there"}
{789 321 "With german umlaut: äöüß ÄÖÜ"}
{893 111 "Third row"}
}
}
set result [Rfc::InvokeFunction Z_RFC_TEST01 $params]
======
'''Rfc::InstallServerFunction functionName callbackProc'''<
>
Installs a Tcl callback function which can be called from SAP to transfer data
to or from the client (or both).<
>
Example:
======tcl
proc MyCallback {connAttr params} {
return {TABDATA {{123 456 "Row 1"} {789 321 "Row 2"}}}
}
Rfc::InstallServerFunction Z_RFC_TEST02 MyCallback
======
'''Rfc::RegisterServer loginParams'''<
>
Connects to the SAP server and registers a server which can invoke Tcl functions.
The connection to the SAP system must be closed to call this function.
To install the callback function you have first connect to SAP as a client,
call DescribeFunction, disconnect from SAP and then call RegisterServer to connect
as a logical sever.<
>
Example:
======tcl
Rfc::OpenConnection {DEST TST1}
Rfc::InstallServerFunction Z_RFC_TEST02 MyCallback
Rfc::CloseConnection
set rc [Rfc::RegisterServer {DEST TST1}]
======
'''Rfc::ListenAndDispatch timeoutSeconds'''<
>
After calling RegisterServer we can wait for incoming calls from the SAP system.
This function is blocked until SAP makes a call or until a timeout event occurred.<
>
The following result values are defined:
* RFC_OK (success)
* RFC_RETRY (timeout)
* RFC_ABAP_EXCEPTION (ABAP-error)
* RFC_ABAP_MESSAGE (function terminated, read error text with GetErrorInfo)
* RFC_EXTERNAL_FAILURE (system error)
* RFC_COMMUNICATION_FAILURE (communication error)
* RFC_CLOSED (SAP has closed the connection)
* RFC_NOT_FOUND (callback function not found)
Example:
======tcl
set rc [Rfc::ListenAndDispatch 600]
if {$rc == "RFC_OK"} {
# yeah :-)
}
======
'''Rfc::Ping'''<
>
Make a RFC connection check to the SAP server.<
>
Example:
======tcl
set rc [Rfc::Ping]
======