Show TOC

Procedure documentationPassing Structures and Tables Locate this document in the navigation structure

Procedure

This programming example shows how to pass structures and tables from the ABAP function module STFC_STRUCTURE to an external RFC Client program:

RFC_RC STFC_STRUCTURE(RFC_CONNECTION_HANDLE rfcHandle,

RFC_FUNCTION_DESC_HANDLE funcDesc)

{

RFC_ERROR_INFO error;

RFC_RC rc = RFC_OK;

RFC_FLOAT test_float = 12345.6789, veri_float;

RFC_INT test_int = 12345, veri_int;

RFC_BYTE test_rfchex3[3] = {0x41, 0x42, 0x43}; // "ABC"

RFC_BYTE veri_rfchex3[3] = {0, 0, 0};

const SAP_UC* test_data1 = cU("Hello World");

SAP_UC veri_data1[50 + 1] = iU("");

/*Create a function handle*/

RFC_FUNCTION_HANDLE funcHandle = NULL;

funcHandle = RfcCreateFunction(funcDesc, &error);

/*Create a structure handle: do not create using RfcCreateStructure, but just call*/

RFC_STRUCTURE_HANDLE structHandle = NULL;

rc = RfcGetStructure(funcHandle,cU("IMPORTSTRUCT"), &structHandle, &error);

RfcSetFloat(structHandle, cU("RFCFLOAT"), test_float, 0);

RfcGetFloat(structHandle, cU("RFCFLOAT"), &veri_float, 0);

RfcSetInt(structHandle, cU("RFCINT4"), 12345, 0);

RfcGetInt(structHandle, cU("RFCINT4"), &veri_int, 0);

RfcSetBytes(structHandle, cU("RFCHEX3"), test_rfchex3,

sizeofR(test_rfchex3), 0);

RfcGetBytes(structHandle, cU("RFCHEX3"), veri_rfchex3,

sizeofR(veri_rfchex3), 0);

RfcSetChars(structHandle, cU("RFCDATA1"), test_data1,

strlenU(test_data1), 0);

RfcGetChars(structHandle, cU("RFCDATA1"), veri_data1,

sizeofU(veri_data1), 0);

/*Create a structure handle: do not create using RfcCreateTable, but just call*/

RFC_TABLE_HANDLE tableHandle = NULL;

rc = RfcGetTable(funcHandle,cU("RFCTABLE"), &tableHandle, 0);

for(unsigned i = 0; i < count; i++)

{

RfcAppendRow(tableHandle, structHandle, 0);

}

SAP_UC buffer[256] = iU("");

printfU( cU("RFC test with STFC_STRUCTURE\n"));

RfcInvoke(rfcHandle, funcHandle, &error);

RfcGetChars(funcHandle, cU("RESPTEXT"), buffer, 255, 0);

EndTrim(buffer, cU(' '), 255);

printfU( cU("RESPTEXT : %s\n"), buffer);

RfcGetChars(funcHandle, cU("RESPTEXT"), buffer, 255, 0);

structHandle = NULL;

RfcGetStructure(funcHandle, cU("ECHOSTRUCT"), &structHandle, 0);

RfcGetFloat(structHandle, cU("RFCFLOAT"), &veri_float, 0);

RFC_INT rfcint4 = 0;

RfcGetInt(structHandle, cU("RFCINT4"), &veri_int, 0);

RfcGetBytes(structHandle, cU("RFCHEX3"), veri_rfchex3,

sizeofR(veri_rfchex3), 0);

RfcGetChars(structHandle, cU("RFCDATA1"), veri_data1,

sizeofU(veri_data1)-1, 0);

EndTrim(veri_data1, cU(' '), sizeofU(veri_data1));

printfU( cU("ECHOSTRUCT.RFCFLOAT : %f\n") ,veri_float);;

printfU( cU("ECHOSTRUCT.RFCINT4 : %d\n") , veri_int );

printfU( cU("ECHOSTRUCT.RFCHEX3 : %p\n") ,veri_rfchex3 );

printfU( cU("ECHOSTRUCT.RFCDATA1 : %s\n") , veri_data1);

tableHandle = NULL;

RfcGetTable(funcHandle, cU("RFCTABLE"), &tableHandle, 0);

RfcGetRowCount(tableHandle, &count, 0); //<-- moving table

cursor

RfcMoveToFirstRow(tableHandle, 0);

for(unsigned i = 0; i < count; i++)

{

RFC_STRUCTURE_HANDLE row = NULL;

row = RfcGetCurrentRow(tableHandle, 0);

RfcGetChars(row, cU("RFCDATA1"), veri_data1,

sizeofU(veri_data1), 0);

EndTrim(veri_data1, cU(' '), sizeofU(veri_data1));

printfU( cU("RFCTABLE[%d].RFCDATA1 : %s\n"),i,

veri_data1 );

RfcMoveToNextRow(tableHandle, 0); //<-- moving table

cursor

}

/*Clean up*/

RfcDestroyFunction(funcHandle, 0);

return rc;

}