mdx — пример SAP OLAP BAPI C ++

Я пытаюсь использовать SAP OLAP BAPI для очень простой задачи. Я хочу подключиться к серверу SAP BW, отправить запрос MDX, получить результат и отключиться. Хотя у меня, кажется, нет проблем с подключением и отключением от сервера, отправка запроса и получение результатов, похоже, являются довольно нетривиальными задачами, с которыми я ищу помощь.

Согласно документации SAP, мне нужно использовать объект MDDataSetBW, сначала создав объект запроса с помощью CreateObject, а затем получив результаты, используя GetAxisInfo и GetCellData.

Прямо сейчас я застрял на самом первом шаге простого создания объекта запроса. В документации говорится, что CreateObject имеет один параметр импорта CommandText и два параметра экспорта DataSetID и Return. Проблема в том, что в соответствии с этим ссылка на сайт Параметр CommandText представляет собой таблицу с одним столбцом с именем LINE. Таким образом, в основном это просто запрос MDX, где каждая строка запроса является значением столбца LINE каждой строки этой таблицы. Вопрос в том, как мне пройти? Может кто-нибудь указать мне пример кода C ++, который делает что-то вроде этого?

Вот мой текущий код прототипа:

#include "stdafx.h"
using namespace std;

RFC_HANDLE Logon()
{
RFC_CONNOPT_R3ONLY conn_options;
conn_options.hostname = SAP_LOGON::Hostname;
conn_options.sysnr = 0;
conn_options.gateway_host = nullptr;
conn_options.gateway_service = nullptr;

RFC_OPTIONS options;
options.mode = RFC_MODE_R3ONLY;
options.destination = SAP_LOGON::Destination;
options.client = SAP_LOGON::Client;
options.user = SAP_LOGON::User;
options.password = SAP_LOGON::Password;
options.language = SAP_LOGON::Language;
options.trace = 0;
options.connopt = &conn_options;

RFC_HANDLE hConn = RfcOpen(&options);

if (hConn == RFC_HANDLE_NULL)
ErrorHandler(_T("RfcOpen"));

return hConn;
}

void MakeStringParam(RFC_PARAMETER& param, rfc_char_t* name, rfc_char_t* buf, unsigned long size)
{
param.name = name;
param.nlen = (unsigned int)wcslen(name);
param.type = TYPC;
param.leng = size;
param.addr = &buf;
}

RFC_HANDLE WIN_DLL_EXPORT_FLAGS CreateQuery(RFC_HANDLE hConn, rfc_char_t* query)
{
rfc_char_t datasetID[256];
rfc_char_t ret[256];

RFC_PARAMETER exporting[3];
MakeStringParam(exporting[0], _T("DataSetID"), datasetID, 256);
MakeStringParam(exporting[1], _T("Return"), ret, 256);
exporting[2].name = nullptr;

// TODO: is it needed?
RFC_PARAMETER importing[2];
MakeStringParam(importing[0], _T("CommandText"), ret, 256);
importing[1].name = nullptr;

// TODO: put query into the table parameter
RFC_TABLE tables[2];
tables[0].name = _T("CommandText");
tables[1].name = nullptr;
rfc_char_t* ex = nullptr;

RFC_RC rc = RfcCallReceive(hConn, _T("BAPI_MDDATASETBW_CREATE_OBJECT"), exporting, importing, tables, &ex);

if (rc == RFC_OK)
{
// TODO: retrieve query handle here
RFC_HANDLE result = RFC_HANDLE_NULL;
return result;
}

return RFC_HANDLE_NULL;
}

int _tmain(int argc, _TCHAR* argv[])
{
RfcInit();

RFC_HANDLE hConn = Logon();

rfc_char_t* query = _T("\
SELECT\
{[Measures].[DA70CEZJ18267Q9RS4XFK7J32]} ON COLUMNS,\
{[0APO_LOCNO].[LEVEL01].AllMembers} ON ROWS\
FROM [0APO_C01/IDES_APO_04]");

RFC_HANDLE hQuery = CreateQuery(hConn, query);

// TODO: retrieve query results using
// - MDDataSetBW.GetAxisData
// - MDDataSetBW.GetAxisInfo
// - MDDataSetBW.GetCellData

RfcClose(hConn);
return 0;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]