Автор Тема: RFC через ODBC используя C++  (Прочитано 10342 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sed0Y

  • ECC 7.0 (ERP/CRM), EHP
  • Newbie
  • *
  • Сообщений: 121
  • Репутация: +7/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
RFC через ODBC используя C++
« : Май 19, 2011, 06:26:30 pm »
Не знаю точно в какой раздет размещать, поместил сюда - так что сильно не пинайте.


Есть такие кто передает - дергает данные через ODBC?
меня волнует такой вопрос

как с С++ вернуть в САП таблицу с данными которые получаю запросом к базе???
Получить данные могу
Код: You are not allowed to view links. Register or Login
...
RETCODE retcode;// Return code
SQLCHAR     one[10],
                   two[10];
...
SQLCHAR *sqlStr = (SQLCHAR *)"{SELECT one two FROM tabl where 1<>2}";
....
        retcode = SQLExecDirect(hSqlStmt, sqlStr, SQL_NTS);
        if (retcode != SQL_SUCCESS )
{
printf("Error SQL Execute Direct\n");
}
 
        retcode = SQLBindCol(hSqlStmt, 1, SQL_CHAR, (SQLPOINTER) one, sizeof(one), &rlength);
        if (retcode != SQL_SUCCESS )
{
printf("Error binding one\n");
}
        retcode = SQLBindCol(hSqlStmt, 2, SQL_CHAR, (SQLPOINTER) two, sizeof(two), &rlength);
        if (retcode != SQL_SUCCESS )
{
printf("Error binding two\n");
}

i = 0;
while ((retcode = SQLFetch(hSqlStmt)) == SQL_SUCCESS)
{
printf("\n %s %s", one, two); // тут вывожу свои параметры
}

Одно заначение вернуть не проблема к примеру:

Код: You are not allowed to view links. Register or Login
memsetR (&parameters[0], 0, sizeofR(parameters));
parameters[0].name = cU("MESSAGE");
parameters[0].nlen = strlenU ((rfc_char_t*) parameters[0].name);
parameters[0].addr = &mess;
parameters[0].leng = 0;
parameters[0].type = RFCTYPE_STRING;


parameters[1].name = NULL;

tables[0].name = NULL; /* no tables */

rfc_rc = RfcSendData (rfc_handle,
  parameters,
  tables
);
return rfc_rc;
}

А вот как их всунуть в таблицу и вернуть, не заню...

Оффлайн №1

  • Administrator
  • Jr. Member
  • *****
  • Сообщений: 636
  • Репутация: +23/-0
  • Пол: Мужской
  • Судьбы я вызов принимаю прямым пожатием руки
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #1 : Май 20, 2011, 11:11:08 am »
You are not allowed to view links. Register or Login
как с С++ вернуть в САП таблицу с данными которые получаю запросом к базе???
Очень сильно не советую кидать данные в базу минуя сервер приложений SAP. Вас базисники просто убьют!!!
Мой You are not allowed to view links. Register or Login

Оффлайн NachDenken

  • Newbie
  • *
  • Сообщений: 158
  • Репутация: +9/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #2 : Май 20, 2011, 01:41:45 pm »
лучше использовать BAPI, они как раз для этого придуманы.

Оффлайн NachDenken

  • Newbie
  • *
  • Сообщений: 158
  • Репутация: +9/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #3 : Май 20, 2011, 01:58:35 pm »
You are not allowed to view links. Register or Login
Очень сильно не советую кидать данные в базу минуя сервер приложений SAP. Вас базисники просто убьют!!!
остается вопрос как базисники ему дали права на оракловскую базу :)

Оффлайн Dmitriy

  • SAP ECC 6.0
  • Кухня
  • Newbie
  • *
  • Сообщений: 380
  • Репутация: +0/-0
  • Пол: Мужской
  • Embracive Fire
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #4 : Май 20, 2011, 03:37:07 pm »
You are not allowed to view links. Register or Login
остается вопрос как базисники ему дали права на оракловскую базу :)
Православные базисники исчо не то иногда учудяють-с! :D
« Последнее редактирование: Май 20, 2011, 03:43:32 pm от Dmitriy »

Оффлайн Sed0Y

  • ECC 7.0 (ERP/CRM), EHP
  • Newbie
  • *
  • Сообщений: 121
  • Репутация: +7/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #5 : Май 23, 2011, 05:15:01 pm »
Спасибо всем за внимание. я разобрался как это сделать. Если кому-то будет нужно, напишите я расскажу, т.к. много писать.

А по поводу "Очень сильно не советую кидать данные в базу минуя сервер приложений SAP. Вас базисники просто убьют!!!"
я может не полностью описал потребность этого...

коротко - Я с САПа передаю кое какие данные (другой фирме, к другой БД..., где нет доступа к САП а может и есть, но если так сделано значит нужно...), там они обрабатываются и таблицой мне возвращают эти обработанные данные, потом я эти данные обрабатываю (уже на стороне САПа) и заношу в "Z" таблицы(поля) в САПе...

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 768
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: RFC через ODBC используя C++
« Ответ #6 : Май 23, 2011, 08:30:39 pm »
You are not allowed to view links. Register or Login
коротко - Я с САПа передаю кое какие данные (другой фирме, к другой БД..., где нет доступа к САП а может и есть, но если так сделано значит нужно...), там они обрабатываются и таблицой мне возвращают эти обработанные данные, потом я эти данные обрабатываю (уже на стороне САПа) и заношу в "Z" таблицы(поля) в САПе...
Так это что ремоутконекшен надо было просто к другой базе сделать и все? Опять же много писать... это не причина не написать.

Оффлайн Sed0Y

  • ECC 7.0 (ERP/CRM), EHP
  • Newbie
  • *
  • Сообщений: 121
  • Репутация: +7/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #7 : Май 24, 2011, 02:23:09 am »
я почти так и написал в теме... Только используя С++
Только для этого уже существует написан на С++ проект для работы...
Я подумал, что если кто с таким уже работал, то он бы узнал...

You are not allowed to view links. Register or Login
Опять же много писать... это не причина не написать.

Напишу конечно... Когда буду на работе...
« Последнее редактирование: Май 24, 2011, 02:25:00 am от Sed0Y »

Оффлайн Nexus

  • Дьюри бачи - йов эмбер
  • Administrator
  • Newbie
  • *****
  • Сообщений: 32
  • Репутация: +6/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #8 : Май 24, 2011, 10:10:39 am »
А пользоваться SAP RFC SDK(будет поддержка балансировки и другие плюшки "официального подключения") не пробовали, единственное что нужно будет написать две RFC функции на ABAP одна которая выберет данные, другая положит.
(if you are SAP customer you can find it on You are not allowed to view links. Register or Login under Patches for My Company's Application Components - SAP RFC SDK)
« Последнее редактирование: Май 24, 2011, 10:12:48 am от Nexus »

Оффлайн Sed0Y

  • ECC 7.0 (ERP/CRM), EHP
  • Newbie
  • *
  • Сообщений: 121
  • Репутация: +7/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: RFC через ODBC используя C++
« Ответ #9 : Июнь 03, 2011, 04:01:05 pm »
как и обещал
В САП, создаем структуру таблицы которую мы будем получать заполненную в С++
у меня было всего 2 поля(целочисленных):
назовем ее ZSRFC
поля:
RFCAID   RFCINT4
RFCBID   RFCINT4


Код: You are not allowed to view links. Register or Login
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
      .

в С++ мы описываем структуру и поля покторые получим и которые будем заполнять:

Код: You are not allowed to view links. Register or Login
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 (&parameters[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;

}

Я вставил основные важные моменты, если кому есть что добавить - пожалуйста...
Конечно я не проверял, может будет работать и без экспорта структуры с САПа и достаточно того, что он описан в С/С++ - просто уже не было времени на эксперименты...

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 768
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: RFC через ODBC используя C++
« Ответ #10 : Февраль 14, 2012, 03:43:21 pm »
You are not allowed to view links. Register or Login
(if you are SAP customer you can find it on You are not allowed to view links. Register or Login under Patches for My Company's Application Components - SAP RFC SDK)
Типа если нет доступов: NW SAP RFC SDK