2

我正在尝试将SAP OLAP BAPI用于一个非常简单的任务。我想连接到 SAP BW 服务器,发送 MDX 查询,获取结果并断开连接。虽然我似乎在连接和断开服务器时没有问题,但发送查询和检索结果似乎是我正在寻求帮助的相当重要的任务。

根据 SAP 文档,我需要使用 MDDataSetBW 对象,首先使用 CreateObject 创建查询对象,然后使用 GetAxisInfo 和 GetCellData 检索结果。

现在我被困在创建查询对象的第一步。文档指出 CreateObject 有一个导入参数 CommandText 和两个导出参数 DataSetID 和 Return。问题是根据SAP 文档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;
}
4

0 回答 0