RFC 返回指向数据的指针而不是数据本身 [英] RFC Returns Pointer to Data Instead of Data Itself

查看:28
本文介绍了RFC 返回指向数据的指针而不是数据本身的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在运行 RFC 以从 SAP 获取数据.当我运行这个 RFC 时,我似乎得到了一个指向数据的指针,而不是数据本身.

I am running a RFC to get data from SAP. When I run this RFC, it appears that I get a pointer to the data, rather than the data itself.

<ET_RETURN>BAPIRET2_</ET_RETURN>

看来这个 BAPIRET2_ 是一些数据集名称或指针.我想要这个 BAPIRET2_ 数据集中的数据.

It appears that this BAPIRET2_ is some data set name or pointer. I want the data within this BAPIRET2_ dataset.

有没有办法自己获取数据?

Is there any way to get the data itself?

蒂姆

RFC 是:

FUNCTION z_esrv_offer_getlist. 
*"---------------------------------------------------------------------- 
*"*"Local Interface: 
*"  IMPORTING 
*"     VALUE(IV_USERID) TYPE  UNAME OPTIONAL 
*"     VALUE(IV_REQUESTID) TYPE  ZESRVREQGUID OPTIONAL 
*"     VALUE(IV_OFFER_NUM) TYPE  TKONN OPTIONAL 
*"     VALUE(IV_STATUS_CHANGE_FROM_DATETIME) TYPE  ZDATETIME OPTIONAL 
*"     VALUE(IV_STATUS_CHANGE_TO_DATETIME) TYPE  ZDATETIME OPTIONAL 
*"     VALUE(IV_PURCH_SALES) TYPE  ZPUR_SALE OPTIONAL 
*"     VALUE(IV_TYPE) TYPE  BSARK OPTIONAL 
*"     VALUE(IV_IDOC) TYPE  XFELD DEFAULT SPACE 
*"     VALUE(IT_PLANTS) TYPE  CCVX_WERKS_TAB OPTIONAL 
*"     VALUE(IT_PARTNERS) TYPE  ZESRVBPLIST_TAB OPTIONAL 
*"     VALUE(IT_OFFER_STATUS_CODES) TYPE  ZESRV_BTBSTA_TAB OPTIONAL 
*"  CHANGING 
*"     VALUE(ET_OFFERS) TYPE  ZESRVOFFER_TAB 
*"     VALUE(ET_CHANGE_HIST) TYPE  ZESRVOFFER_HIST_TAB 
*"     VALUE(ET_RETURN) TYPE  BAPIRET2_TAB 
*"---------------------------------------------------------------------- 

  DATA: l_error     TYPE symsgv, 
        lv_return   TYPE bapiret2. 

  FIELD-SYMBOLS: <error>     TYPE bapiret2. 

* Initialize. 
  PERFORM initialize_setup. 
  PERFORM initialize_for_getlist. 
  gv_userid = iv_userid. 
  gv_req_id = iv_requestid. 

  PERFORM get_function_name CHANGING gv_funcname. 


* Unload selection criteria into global variables 

  gv_offer = iv_offer_num. 
  gv_frm_chngdtm = iv_status_change_from_datetime. 
  gv_to_chngdtm = iv_status_change_to_datetime. 
  gv_ps = iv_purch_sales. 
  gv_type = iv_type. "(F)irm / (S)oft 
  gv_idoc = iv_idoc. "X if for idoc creation 

* partners 
  IF it_partners[] IS NOT INITIAL. 
    r_partners-sign = 'I'. 
    r_partners-option = 'EQ'. 
    CLEAR r_partners-high. 
    LOOP AT it_partners INTO gs_partners. 
      APPEND gs_partners TO gt_logprtnrs. 
      r_partners-low = gs_partners-bu_partner. 
      APPEND r_partners TO gt_partner_rng. 
    ENDLOOP. 
  ENDIF. 
* plants 
  IF it_plants[] IS NOT INITIAL. 
    r_plants-sign = 'I'. 
    r_plants-option = 'EQ'. 
    CLEAR r_plants-high. 
    LOOP AT it_plants INTO gn_plant. 
      r_plants-low = gn_plant-werks. 
      APPEND r_plants TO gt_plant_rng. 
      APPEND gn_plant TO gt_plants. 
    ENDLOOP. 
  ENDIF. 
* status codes 
  IF it_offer_status_codes[] IS NOT INITIAL. 
    r_status-sign = 'I'. 
    r_status-option = 'EQ'. 
    CLEAR r_status-high. 
    LOOP AT it_offer_status_codes INTO gn_status. 
      r_status-low = gn_status-btbsta. 
      APPEND r_status TO gt_status_rng. 
      APPEND gn_status TO gt_status_codes. 
    ENDLOOP. 
  ENDIF. 

* make sure there is at least one criteria filled 
  IF iv_offer_num IS INITIAL AND 
     iv_status_change_from_datetime IS INITIAL AND 
     iv_status_change_to_datetime IS INITIAL AND 
     iv_type IS INITIAL AND 
     it_plants[] IS INITIAL AND 
     it_partners[] IS INITIAL AND 
     it_offer_status_codes[] IS INITIAL. 

    PERFORM get_message_for_bapi USING gc_warning gc_esrv '057' 
                               space space space space 
                                CHANGING lv_return. 
    APPEND lv_return TO et_return. 
    APPEND lv_return TO gt_error. 
*    IF iv_userid IS INITIAL AND iv_requestid = 0. 
*    ELSE. 
    PERFORM bapi_logging USING gv_funcname. 
*    ENDIF. 
    EXIT. 
  ENDIF. 

* at least one selection criteria has been entered, so validate selections 
  PERFORM validate_selections. 
  READ TABLE gt_error INTO lv_return WITH KEY type = 'W'. 
  IF sy-subrc = 0. 
*     errors found in selection criteria, stop 
    et_return[] = gt_error[]. 
    EXIT. 
  ELSE. 
*     no errors found, select data 
    PERFORM get_offers. 
    IF gt_offers[] IS NOT INITIAL. 
      PERFORM get_history. 
      et_change_hist[] = gt_chng_hist[]. 
      et_offers[] = gt_offers[]. 
    ENDIF. 
    DESCRIBE TABLE et_offers LINES gv_recordsfound. 
    IF gv_recordsfound = 0. 
*     no offers found 
      PERFORM get_message_for_bapi USING gc_warning gc_esrv '061' 
                                 space space space space 
                                  CHANGING lv_return. 
      APPEND lv_return TO et_return. 
      APPEND lv_return TO gt_error. 
*      IF iv_userid IS INITIAL AND iv_requestid = 0. 
*      ELSE. 
      PERFORM bapi_logging USING gv_funcname. 
*      ENDIF. 
      EXIT. 
    ELSE. 
      READ TABLE et_return INTO lv_return WITH KEY type = 'W'. 
      IF sy-subrc <> 0. 
*       success, history returned 
        PERFORM get_message_for_bapi USING gc_success gc_esrv '002' 
                                   space space space space 
                                    CHANGING lv_return. 
        APPEND lv_return TO gt_error. 
        APPEND lv_return TO et_return. 
*        IF iv_userid IS INITIAL AND iv_requestid = 0. 
*        ELSE. 
        PERFORM bapi_logging USING gv_funcname. 
*        ENDIF. 
      ENDIF. 
    ENDIF. 
  ENDIF. 

ENDFUNCTION.

推荐答案

SAP JCo 将使用自己的对象类型返回您的数据.您必须浏览这些对象才能获取数据.以下是连接到 SAP 以使用 SAP JCo 3 获取发票详细信息的 Java 方法示例.您应该注意两种返回类型:

SAP JCo will return your data using its own object types. You will have to navigate through those objects to get your data. Below is an example of a Java method that connects to SAP for the purpose of obtaining invoice details using SAP JCo 3. There are two return types that you should note:

  • 返回"是结构类型.在 Java 中,这有点像 Java 中的 POJO.或者您可以将其视为单个数据记录.谷歌SAP结构"了解更多详情.

  • "RETURN" is a structure type. In java, this is sort of like a POJO in java. Or you could think about it as a single data record. Google "SAP structure" for more details.

INVOICE_SUMMARIES"是表类型.注意 for 循环,它正在读取一个表格.

"INVOICE_SUMMARIES" is a table type. Note the for loop, which is reading a table.

根据您的 RFC 的导出参数是表格(它们看起来是)还是结构,您需要调整检索数据的方式.希望这个例子足以让你开始.

Depending on if the export parameters of your RFC are tables (which they appear to be) or structures, you will want to adjust how you retrieve the data. Hopefully this example is enough to get you started.

private List<InvoiceSummary> getInvoices(String userId, String customerNumber, String invoiceNumber) throws InvoiceRetrievalException, JCoException {

    ArrayList<InvoiceSummary> invoices = new ArrayList<InvoiceSummary>();
    try {
        //Verify SAP connection.
        DAOFactory.registerDestination();
        JCoDestination dest = JCoDestinationManager.getDestination(DAOFactory.getDestinationName());
        JCoRepository repository = dest.getRepository();

        JCoFunctionTemplate ft = repository.getFunctionTemplate("Z_BAPI_GET_INVOICES");
        JCoFunction jFunction = ft.getFunction();

        //Set parameters.
        jFunction.getImportParameterList().setValue("USER_ID", userId);
        jFunction.getImportParameterList().setValue("CUSTOMER_NUMBER", customerNumber);
        jFunction.getImportParameterList().setValue("INVOICE_NUMBER", invoiceNumber);

        //Execute the function and read the results.
        jFunction.execute(dest);

        //Check the SAP return object for errors.
        JCoStructure out = jFunction.getExportParameterList().getStructure("RETURN");
        if ("E".equals(out.getString("TYPE"))) {
            throw new InvoiceRetrievalException(out.getString("MESSAGE"));
        }

        //Parse the returned invoices into InvoiceSummary objects.
        JCoTable invoiceTable = jFunction.getTableParameterList().getTable("INVOICE_SUMMARIES");
        for (int i = 0; i < invoiceTable.getNumRows(); i++) {
            InvoiceSummary invoice = new InvoiceSummary();
            invoiceTable.setRow(i);

            invoice.setInvoiceNumber(invoiceTable.getString("INVOICE_NUMBER"));
            invoice.setReleaseNumber(invoiceTable.getString("RELEASE_NUMBER"));
            invoice.setItemNumber(invoiceTable.getString("ITEM_NUMBER"));
            invoice.setInvoiceDate(invoiceTable.getString("INVOICE_DATE"));
            invoice.setProductDescription(invoiceTable.getString("DESCRIPTION"));
            invoice.setDueDate(invoiceTable.getString("DUE_DATE"));
            invoice.setCustomerNumber(invoiceTable.getString("CUSTOMER_NUMBER"));

            invoices.add(invoice);
        }
    } catch (InvoiceRetrievalException e) {
        logger.error("An error occurred while attempting to retrieve an invoice." +
            " userId = " + userId +
            " invoiceNumber = " + invoiceNumber, e);
        throw e;
    } catch (JCoException e) {
        logger.error("An error occurred while calling Z_BAPI_GET_INVOICES." +
            " userId = " + userId +
            " invoiceNumber = " + invoiceNumber, e);
        throw e;
    }
    return invoices;
}

这篇关于RFC 返回指向数据的指针而不是数据本身的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆