In the following example program an external RFC client connects to an SAP system and calls the function module BAPI_COMPANY_GETDETAIL:
#include <stdlib.h>
#include <stdio.h>
#include "sapnwrfc.h"
void errorHandling(RFC_RC rc, SAP_UC description[], RFC_ERROR_INFO*
errorInfo, RFC_CONNECTION_HANDLE connection){
printfU(cU("%s: %d\n"), description, rc);
printfU(cU("%s: %s\n"), errorInfo->key, errorInfo->message);
/* It's better to close the TCP/IP connection cleanly, than to
just let the backend get a "Connection reset by peer" error...*/
if (connection != NULL) RfcCloseConnection(connection, errorInfo);
exit(1);
}
int mainU(int argc, SAP_UC** argv){
RFC_RC rc = RFC_OK;
RFC_CONNECTION_PARAMETER loginParams[6];
RFC_ERROR_INFO errorInfo;
RFC_CONNECTION_HANDLE connection;
RFC_FUNCTION_DESC_HANDLE bapiCompanyDesc;
RFC_FUNCTION_HANDLE bapiCompany;
RFC_STRUCTURE_HANDLE returnStructure;
SAP_UC message[221];
RFC_BYTE buffer[1105];
unsigned utf8Len = 1105, resultLen;
FILE* outFile;
-----------------------------------------------
/*OPEN CONNECTION*/
-----------------------------------------------
/*Create logon parameter list*/
loginParams[0].name = cU("ashost"); loginParams[0].value =
cU("hs0023");
loginParams[1].name = cU("sysnr"); loginParams[1].value = cU("05");
loginParams[2].name = cU("client"); loginParams[2].value =
cU("800");
loginParams[3].name = cU("user"); loginParams[3].value =
cU("alice");
loginParams[4].name = cU("lang"); loginParams[4].value =
cU("EN");
loginParams[5].name = cU("passwd"); loginParams[5].value =
cU("secret");
/*Open connection*/
connection = RfcOpenConnection(loginParams, 6, &errorInfo);
if (connection == NULL) errorHandling(rc, cU("Error during logon"),
&errorInfo, NULL);
-----------------------------------------------
/* DYNAMIC METADATA retrieval (can also be executed using STATIC functions)*/
-----------------------------------------------
bapiCompanyDesc = RfcGetFunctionDesc(connection,
cU("BAPI_COMPANY_GETDETAIL"), &errorInfo);
if (bapiCompanyDesc == NULL) errorHandling(rc, cU("Error during
metadata lookup"), &errorInfo, connection);
-----------------------------------------------
/*FUNCTION CALL/*
-----------------------------------------------
/*Create function instance*/
bapiCompany = RfcCreateFunction(bapiCompanyDesc, &errorInfo);
/*Parameter setting*/
RfcSetChars(bapiCompany, cU("COMPANYID"), cU("000007"), 6,
&errorInfo);
/*Call*/
rc = RfcInvoke(connection, bapiCompany, &errorInfo);
if (rc != RFC_OK) errorHandling(rc, cU("Error calling
BAPI_COMPANY_GETDETAIL"), &errorInfo, connection);
/*Getting parameters*/
RfcGetStructure(bapiCompany, cU("RETURN"), &returnStructure,
&errorInfo);
RfcGetString(returnStructure, cU("MESSAGE"), message, 221,
&resultLen, &errorInfo);
/*After having finished the procedure: release memory only if a ‘create’ function was invoked before*/
RfcDestroyFunction(bapiCompany, &errorInfo);
/*Final UTF8-UTF16 conversion*/
windows.h utf8Len = WideCharToMultiByte(CP_UTF8, 0, message,
strlenU(message), buffer, 1105, NULL, NULL);
RfcSAPUCToUTF8(message, strlenU(message), buffer, &utf8Len,
&resultLen, &errorInfo);
outFile = fopen("message.xml", "w");
fputs("<?xml version=\"1.0\"?>\n<message>", outFile);
fputs(buffer, outFile);
fputs("</message>", outFile);
fclose(outFile);
return 0;
}