function module COM_PRODUCT_GETDETAIL_INTERNAL的内存分配问题

105 阅读1分钟

Created by Jerry Wang, last modified on Jul 25, 2014

使用如下的report读取指定product的distribution chain信息:

DATA:
  ls_product          TYPE   comt_product,
  lt_read_settype_id  TYPE   comt_frgtype_id_tab,
  ls_product_old_data TYPE   comt_product_maintain_api,
  lt_set_old_data     TYPE   comt_product_maintain_api_sett,
  lt_org_type         TYPE   comt_pr_org_type_list_tab.
ls_product-product_guid = '00163EA720001EE28EA88D619832B285'.
ls_product-product_type = '01'.
APPEND 'CRMM_PR_SALESH' TO lt_read_settype_id.
APPEND 'CRMM_PR_SALESH' TO lt_read_settype_id.
APPEND '01' TO lt_org_type.
CALL FUNCTION 'COM_PRODUCT_GETDETAIL_INTERNAL'
  EXPORTING
    is_product        = ls_product
    iv_read_db_values = 'X'
    it_req_settypes   = lt_read_settype_id
    it_org_types      = lt_org_type
  IMPORTING
    es_product        = ls_product_old_data
    et_set            = lt_set_old_data.
READ TABLE lt_set_old_data ASSIGNING FIELD-SYMBOL(<result1>) INDEX 1.
READ TABLE lt_set_old_data ASSIGNING FIELD-SYMBOL(<result2>) INDEX 2.

clipboard1

执行report,会观察到由于输入参数IT_REQ_SETTYPES里我们传入了两条相同的setype ID,因此最后function module返回两个resultset,格式如下:
clipboard2
每条result set的DATA column包含的数据格式如下:
clipboard3
两个resultset里具有完全相同的distribution chain信息:
clipboard4
通过debug function module内部代码可以发现,用于存储resultset的internal table都是通过CREATE_DATA语句在heap里动态创建的:
clipboard5
line 92执行完之后,
clipboard6
IT_REQ_SETTYPES里面的一个settype id对应的resultset就已经append在输出参数ET_SET里了:
clipboard7
如果客户的organization model非常庞大,则IT_REQ_SETTYPES里出现duplicate request的settype id可能会导致巨大的内存消耗,例如incident 2014 627848。 因此在call该function module之前务必将所有duplicate key删除。