Show TOC

Calling a Function in SAP SystemsLocate this document in the navigation structure

Use

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, );
        if (connection == NULL) errorHandling(rc, cU("Error during logon"),
, NULL);




----------------------------------------------- 
/* DYNAMIC METADATA retrieval (can also be executed using STATIC functions)*/
----------------------------------------------- 

        bapiCompanyDesc = RfcGetFunctionDesc(connection,
cU("BAPI_COMPANY_GETDETAIL"), );
        if (bapiCompanyDesc == NULL) errorHandling(rc, cU("Error during
metadata lookup"), , connection);

-----------------------------------------------
/*FUNCTION CALL/*
-----------------------------------------------
        
/*Create function instance*/
        
bapiCompany = RfcCreateFunction(bapiCompanyDesc, );

        /*Parameter setting*/ 

        RfcSetChars(bapiCompany, cU("COMPANYID"), cU("000007"), 6,
);

        /*Call*/

        rc = RfcInvoke(connection, bapiCompany, );
        if (rc != RFC_OK) errorHandling(rc, cU("Error calling
BAPI_COMPANY_GETDETAIL"), , connection);

        /*Getting parameters*/

        RfcGetStructure(bapiCompany, cU("RETURN"), ,
);
        RfcGetString(returnStructure, cU("MESSAGE"), message, 221,
, );

        /*After having finished the procedure: release memory only if a 'create' function was invoked before*/

        RfcDestroyFunction(bapiCompany, );

        /*Final UTF8-UTF16 conversion*/

        windows.h utf8Len = WideCharToMultiByte(CP_UTF8, 0, message,
strlenU(message), buffer, 1105, NULL, NULL);
        RfcSAPUCToUTF8(message,  strlenU(message), buffer, ,
, );

        outFile = fopen("message.xml", "w");
        fputs("<?xml version=\"1.0\"?>\n<message>", outFile);
        fputs(buffer, outFile);
        fputs("</message>", outFile);
        fclose(outFile);
        return 0;
}