как и обещал
В САП, создаем структуру таблицы которую мы будем получать заполненную в С++
у меня было всего 2 поля(целочисленных):
назовем ее ZSRFC
поля:
RFCAID RFCINT4
RFCBID RFCINT4
DATA:
gv_mess(256),
ls_frc TYPE ZSRFC " структура которую мы пепредаем по РФЦ в С++
CALL FUNCTION 'GETDATA' DESTINATION 'RFC_C'
EXPORTING
IMPORTSTRUCT = ls_frc " передаем туда нашу структуру
IMPORTING
RET = RESULT " тут я себе получаю результат
MESS = MESS " ну и если есть ошибка то описание ее
TABLES
RFCTABLE = G_IE " собственно данные
EXCEPTIONS
COMMUNICATION_FAILURE = 1 MESSAGE gv_mess
SYSTEM_FAILURE = 2 MESSAGE gv_mess
.
в С++ мы описываем структуру и поля покторые получим и которые будем заполнять:
static RFC_TYPEHANDLE handleOfRfcIE;
typedef struct RFCIE
{
SAP_INT rfcaid;
#define RFCIE_RFCAID_LN 4
#define RFCIE_RFCAID_TYP RFCTYPE_INT
SAP_INT rfcbid;
#define RFCIE_RFCBID_LN 4
#define RFCIE_RFCBID_TYP RFCTYPE_INT
}
RFCIE;
static RFC_UNICODE_TYPE_ELEMENT typeOfRfcIE[] =
{
{ cU("rfcaid"), RFCIE_RFCAID_TYP, 0, 4, 20, 4, 24, 4, 32 },
{ cU("rfcbid"), RFCIE_RFCBID_TYP, 0, 4, 20, 4, 24, 4, 32 }
};
#define ENTRIESIE( tab ) ( sizeofR(tab)/sizeofR((tab)[0]) )
RFCIE imiestruct,
exiestruct;
//.....
static RFC_RC DLL_CALL_BACK_FUNCTION GETSynDATA(RFC_HANDLE rfc_handle);
//...
rfc_char_t get_syn_dat[31] = iU("GETDATA"); // в скобках такое имя которое мы вызываем с САПа
//...
//Переходим в код ***.c где идет вызов нашей функции прописываем в инстал
static RFC_RC install(void)
{
//-------------------------------------------------------------------------------------//
/* Install Synchronization */
fprintfU(stderr, cU("\n7. RfcInstallFunction (%s) rfc_rc = "), get_syn_dat);
rfc_rc = RfcInstallFunction(get_syn_dat,
(RFC_ONCALL) GETSynDATA,
NULL);
fprintfU(stderr, cU("%d <= GET"), rfc_rc);
if( rfc_rc != RFC_OK )
{
sprintfU(abort_text, cU("\nERROR: Install (%s) rfc_rc = %d"), get_syn_data, rfc_rc);
function_abort(abort_text);
}
//-------------------------------------------------------------------------------------//
}
static RFC_RC DLL_CALL_BACK_FUNCTION GETSynDATA(RFC_HANDLE rfc_handle)
{
//....
memsetR (¶meters[0], 0, sizeofR(parameters));
/* Install structure 'RFC_DAT' */
rfc_rc = RfcInstallUnicodeStructure (cU("RFCIE"), /* там где typedef struct RFCIE */
typeOfRfcIE,
ENTRIESIE(typeOfRfcIE),
0, NULL,
&handleOfRfcIE );
if (rfc_rc != RFC_OK)
rfc_error (cU("RfcInstallStructure"));
/* Importing Parameters */
parameters[0].name = cU("IMPORTSTRUCT");
parameters[0].nlen = 2;
parameters[0].addr = &imiestruct;
parameters[0].leng = RFCIE_LN;
parameters[0].type = handleOfRfcIE;
parameters[1].name = NULL;
/* Prepare internal table RFCIETABLE */
tables[0].name = cU("RFCTABLE");
tables[0].nlen = 8;
tables[0].type = handleOfRfcIE;
tables[0].leng = RFCIE_LN;
tables[0].itmode = RFC_ITMODE_BYREFERENCE;
tables[1].name = NULL;
/* receive data */
fprintfU (stderr, cU("\n<== RfcGetData rfc_rc = "));
rfc_rc = RfcGetData (rfc_handle,
parameters,
tables);
fprintfU (stderr, "%d", rfc_rc);
if (rfc_rc != RFC_OK)
rfc_error (cU("RfcGetData"));
/* Get specific info of this RFC connection*/
/* Echo structure */
exiestruct = imiestruct;
//...
retcode = SQLConnect .......
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLAllocHandle (SQL_HANDLE_STMT, hDBCSQL, &hSqlStmt);
// bind---------------
//.....
while ((retcode = SQLFetch(hSqlStmt)) == SQL_SUCCESS)
{
//insert data into table--------------------
/* New structure value */
imiestruct.rfcaid = aid;
imiestruct.rfcbid = bid;
/* Append into table 'RFCIETABLE' */
lineleng = ItLeng (tables[0].ithandle);
ptr = (rfc_char_t *) ItAppLine(tables[0].ithandle);
if (ptr == NULL)
rfc_error(cU("ItAppLine"));
memcpyR ((void *)ptr, &imiestruct, lineleng);
//end insert data into table----------------
}
}
SQLFreeConnect (hDBCSQL); // Free the allocated connection handle
SQLFreeEnv (hEnvSQL); // Free the allocated ODBC environment handle
//......
rfc_rc = RfcSendData (rfc_handle,
parameters,
tables
);
//....
return rfc_rc;
}
Я вставил основные важные моменты, если кому есть что добавить - пожалуйста...
Конечно я не проверял, может будет работать и без экспорта структуры с САПа и достаточно того, что он описан в С/С++ - просто уже не было времени на эксперименты...