Работа с BPS переменными. ABAP.

Задача: Есть переменная BPS типа иерархия. Но основании того, какой узел иерархии выбран, в переменную типа — Признак (или же тоже значение иерархии) необходимо занести все дочерние узлы этого узла.
+ к задаче. Если переменная типа Признак ( вводиться пользователем ) не пустая, то заполнять переменную только теми дочерними узлами, первые две цифры которых совпадают с первыми двумя цифрами этой переменной.

Решение по шагам.

Основная переменная на вход ( Тип иерархия. Тех имя для примера — NHIERIN )
Доп. переменная на вход (Тип — значения признака. Тех имя для примера — NVCOMP (компания) )
Переменная на выход: (Тип значения признака. Тех имя для примера — NCHAROUT )
Переменная на выход: (Тип значения иерархия. Тех имя для примера — NHEIROUT )

1) Переменные BPS
переменные BPS

2) для варианта когда на выход подаем значения в переменную типа значения признака

Используем FM
YN_UPF_VARIABLE_USER_EXIT_PREV

Описание интерфейса

  1. *"----------------------------------------------------------------------
  2. *"*"Локальный интерфейс:
  3. *" IMPORTING
  4. *" VALUE(I_AREA) TYPE UPC_Y_AREA
  5. *" VALUE(I_VARIABLE) TYPE UPC_Y_VARIABLE
  6. *" VALUE(I_CHANM) TYPE UPC_Y_CHANM OPTIONAL
  7. *" VALUE(ITO_CHANM) TYPE UPC_YTO_CHA
  8. *" EXPORTING
  9. *" REFERENCE(ETO_CHARSEL) TYPE UPC_YTO_CHARSEL
  10. *" REFERENCE(ET_HIE_NODES2) TYPE UPC_YT_HIESEL
  11. *"----------------------------------------------------------------------

код:

  1. if I_VARIABLE eq 'NCHAROUT'. " переменная на выход
  2. CLEAR ET_HIE_NODES2.
  3. ************************************
  4. data: lr_var3 TYPE REF TO cl_sem_variable. “ для переменной на вход1
  5. data: lr_var2 TYPE REF TO cl_sem_variable. “ для переменной на вход2
  6.  
  7. CALL METHOD cl_sem_variable=>get_instance “ получаем инстанцию иерархии для “переменной на вход1
  8. EXPORTING
  9. i_area = I_AREA
  10. "'MMT03'
  11. i_variable = 'NHIERIN' " для переменной
  12. RECEIVING
  13. rr_variable = lr_var3 “ инстанция сюда
  14. EXCEPTIONS
  15. not_existing = 1
  16. OTHERS = 2.
  17. “ получаем инстанцию иерархии для “переменной на вход2
  18.  
  19. CALL METHOD cl_sem_variable=>get_instance
  20. EXPORTING
  21. i_area = I_AREA
  22. "'MMT03'
  23. i_variable = 'NVCOMP' " переменная 2 (компания. Доп переменная)
  24. RECEIVING
  25. rr_variable = lr_var2
  26. EXCEPTIONS
  27. not_existing = 1
  28. OTHERS = 2.
  29.  
  30.  
  31. CALL METHOD lr_var3->get_hie_nodes " получаем значение выбранного узла “иерархии
  32. RECEIVING
  33. rt_value = et_hie_nodes2 “ в таблицу
  34. EXCEPTIONS
  35. error = 1
  36. OTHERS = 2.
  37.  
  38. CALL METHOD lr_var2->get_value " значения компании
  39. RECEIVING
  40. rto_value = ETO_CHARSEL
  41. EXCEPTIONS
  42. error = 1
  43. OTHERS = 2.
  44.  
  45. “ немного колдоства с header line
  46. data: ETO_CHARSEL3 like ETO_CHARSEL WITH HEADER LINE. " внутренния таблица с заголовком
  47.  
  48. LOOP at ETO_CHARSEL INTO ETO_CHARSEL3.
  49.  
  50.  
  51.  
  52. data: ET_HIE_NODES3 like et_hie_nodes2 WITH HEADER LINE. " внутренния таблица с заголовком
  53.  
  54.  
  55.  
  56. LOOP at et_hie_nodes2 INTO ET_HIE_NODES3.
  57.  
  58. DATA: l_hie_nodes_wa TYPE upc_ys_hiesel.
  59. data: HeirID TYPE RSHIEID.
  60. data: PID213 TYPE RSHIENODID.
  61. data: companyh LIKE /BIC/HY_FICTR OCCURS 0 WITH HEADER LINE.
  62.  
  63. SELECT SINGLE HIEID FROM /BIC/HY_FICTR INTO HeirID " получаем ID иерархии для выбранного узла
  64. WHERE NODENAME = ET_HIE_NODES3-NODENAME and OBJVERS eq 'A'.
  65.  
  66. SELECT SINGLE NODEID FROM /BIC/HY_FICTR INTO PID213 " получаем ID Ноды
  67. WHERE NODENAME = ET_HIE_NODES3-NODENAME and HIEID = HeirID and OBJVERS eq 'A'.
  68. *'PP'.
  69.  
  70. SELECT NODENAME FROM /BIC/HY_FICTR INTO CORRESPONDING FIELDS OF TABLE companyh
  71. WHERE HIEID eq HeirID and IOBJNM eq 'Y_FICTR' and OBJVERS eq 'A' and PARENTID eq PID213. “ выбираем все дочерние узлы
  72.  
  73.  
  74. if ETO_CHARSEL3-LOW is not INITIAL and ETO_CHARSEL3-LOW ne '#'. “ доп “условие с компанией
  75. DATA: cr type RSSHNODENAME.
  76.  
  77.  
  78.  
  79. LOOP at companyh.
  80. “ доп “условие с компанией
  81. cr = companyh-NODENAME+0(2).
  82.  
  83. if cr eq ETO_CHARSEL3-LOW.
  84. clear ls_charsel.
  85. ls_charsel-chanm = i_chanm.
  86. ls_charsel-seqno = SY-TABiX.
  87. ls_charsel-sign = 'I'.
  88. ls_charsel-opt = 'EQ'.
  89. ls_charsel-low = companyh-NODENAME.
  90. insert ls_charsel into table eto_charsel.
  91.  
  92. elseif ETO_CHARSEL3-LOW is INITIAL.
  93.  
  94.  
  95. LOOP at companyh.
  96. clear ls_charsel.
  97. ls_charsel-chanm = i_chanm.
  98. ls_charsel-seqno = SY-TABiX.
  99. ls_charsel-sign = 'I'.
  100. ls_charsel-opt = 'EQ'.
  101. ls_charsel-low = companyh-NODENAME.
  102. insert ls_charsel into table eto_charsel. “ на выход
  103.  
  104. ************************************
  105.  
  106. ****************************************************
  107. ****************************************************

3) для варианта когда на выход подаем значения в переменную типа переменная используем FM YN_UPF_VARIABLE_USER_EXIT_HIER

Код

  1. FUNCTION YN_UPF_VARIABLE_USER_EXIT_HIER.
  2. *"----------------------------------------------------------------------
  3. *"*"Локальный интерфейс:
  4. *" IMPORTING
  5. *" VALUE(I_TYPE) TYPE UPC_Y_VAR_TYPE
  6. *" VALUE(I_AREA) TYPE UPC_Y_AREA
  7. *" VALUE(I_VARIABLE) TYPE UPC_Y_VARIABLE
  8. *" VALUE(IS_HIE_KEY) TYPE UPC_YS_HIE_KEY
  9. *" EXPORTING
  10. *" REFERENCE(ET_HIE_NODES) TYPE UPC_YT_HIESEL
  11. *" REFERENCE(ET_HIE_NODES2) TYPE UPC_YT_HIESEL
  12. *" REFERENCE(ETO_CHARSEL) TYPE UPC_YTO_CHARSEL
  13. *" EXCEPTIONS
  14. *" FAILED
  15. *"----------------------------------------------------------------------
  16.  
  17. * this example shows how the function module for variables of
  18. * type User-Exit should look like
  19. * this example shows variable of type HIER - hierarchy node values
  20.  
  21. * input parameters:
  22. * i_type : type of the variable
  23. * i_area : Planning area, in which the variable is defined.
  24. * i_variable : The name of the variable.
  25. * is_hie_key : contents the hierarchy, which the variable contains
  26.  
  27. * export parameters:
  28. * et_hie_nodes : hierarchy-nodes as the content for the variable
  29.  
  30. * exceptions:
  31. * when it's necessary to raise an exception within exit function module,
  32. * it's possible by the statement message ... raising
  33. * name_of_the_exception. Every exception can be used and the error will
  34. * be handled
  35.  
  36. * -------------------------------------------------------------------
  37. * fill export table et_hie_nodes of structure UPC_YS_HIESEL
  38. * fields: CHANM - Characteristic
  39. * HIENM - Hierarchy name
  40. * HIEVER - Hierarchy version
  41. * DATETO - Hierarchy valid to
  42. * NODENAME - Node name
  43. * HIECHA - Characteristic value of node
  44. * DUMMY_LEAF - Indicator: Help Nodes
  45. * TO_CHADEP - Values of Compound Characteristics
  46. * CHANM - compound Characteristic
  47. * CHAVLINT - Value of compound Characteristic
  48. * --------------------------------------------------------------------
  49.  
  50. * clear export table
  51.  
  52.  
  53. CLEAR et_hie_nodes.
  54. CLEAR ETO_CHARSEL.
  55. *---------------------------------------------------------------------
  56. * Example: This example is based on the infoobject 0D_COUNTRY. For
  57. * testing please first define a bw text hierarchy for this
  58. * infoobject with at least two text nodes (AMERICA and EUROPE).
  59. * The export table is filled with a selection of these text
  60. * nodes.
  61. *---------------------------------------------------------------------
  62. data: lr_var TYPE REF TO cl_sem_variable.
  63. data: lr_var2 TYPE REF TO cl_sem_variable.
  64.  
  65. CALL METHOD cl_sem_variable=>get_instance
  66. EXPORTING
  67. i_area = I_AREA
  68. "'MMT03'
  69. i_variable = 'NHIERIN' " выбранный узел инстанция
  70. RECEIVING
  71. rr_variable = lr_var
  72. EXCEPTIONS
  73. not_existing = 1
  74. OTHERS = 2.
  75.  
  76.  
  77. CALL METHOD cl_sem_variable=>get_instance
  78. EXPORTING
  79. i_area = I_AREA
  80. "'MMT03'
  81. i_variable = 'NVCOMP' " выбранный узел инстанция
  82. RECEIVING
  83. rr_variable = lr_var2
  84. EXCEPTIONS
  85. not_existing = 1
  86. OTHERS = 2.
  87.  
  88.  
  89. CALL METHOD lr_var->get_hie_nodes " значения верхнего узла
  90. RECEIVING
  91. rt_value = et_hie_nodes2
  92. EXCEPTIONS
  93. error = 1
  94. OTHERS = 2.
  95.  
  96. CALL METHOD lr_var2->get_value " значения компании
  97. RECEIVING
  98. rto_value = ETO_CHARSEL
  99. EXCEPTIONS
  100. error = 1
  101. OTHERS = 2.
  102.  
  103. data: ETO_CHARSEL3 like ETO_CHARSEL WITH HEADER LINE. " внутренния таблица с заголовком
  104.  
  105. LOOP at ETO_CHARSEL INTO ETO_CHARSEL3.
  106.  
  107.  
  108.  
  109. data: ET_HIE_NODES3 like et_hie_nodes2 WITH HEADER LINE. " внутренния таблица с заголовком
  110.  
  111.  
  112.  
  113. LOOP at et_hie_nodes2 INTO ET_HIE_NODES3.
  114.  
  115. DATA: l_hie_nodes_wa TYPE upc_ys_hiesel.
  116. data: HeirID TYPE RSHIEID.
  117. data: PID213 TYPE RSHIENODID.
  118. data: companyh LIKE /BIC/HY_FICTR OCCURS 0 WITH HEADER LINE.
  119.  
  120. SELECT SINGLE HIEID FROM /BIC/HY_FICTR INTO HeirID " получаем ID иерархии для выбранного узла
  121. WHERE NODENAME = ET_HIE_NODES3-NODENAME and OBJVERS eq 'A'.
  122.  
  123. SELECT SINGLE NODEID FROM /BIC/HY_FICTR INTO PID213 " получаем ID иерархии для выбранного узла
  124. WHERE NODENAME = ET_HIE_NODES3-NODENAME and HIEID = HeirID and OBJVERS eq 'A'.
  125. *'PP'.
  126.  
  127. SELECT NODENAME FROM /BIC/HY_FICTR INTO CORRESPONDING FIELDS OF TABLE companyh
  128. WHERE HIEID eq HeirID and IOBJNM eq 'Y_FICTR' and OBJVERS eq 'A' and PARENTID eq PID213.
  129.  
  130.  
  131. if ETO_CHARSEL3-LOW is not INITIAL and ETO_CHARSEL3-LOW ne '#'.
  132. DATA: cr type RSSHNODENAME.
  133.  
  134.  
  135.  
  136. LOOP at companyh.
  137. cr = companyh-NODENAME+0(2).
  138.  
  139. if cr eq ETO_CHARSEL3-LOW.
  140. * text node 'AMERICA'
  141. l_hie_nodes_wa-chanm = is_hie_key-chanm.
  142. l_hie_nodes_wa-hienm = is_hie_key-hienm.
  143. l_hie_nodes_wa-hiever = is_hie_key-hiever.
  144. l_hie_nodes_wa-dateto = is_hie_key-dateto.
  145. l_hie_nodes_wa-nodename = companyh-NODENAME.
  146. l_hie_nodes_wa-hiecha = 'Y_FICTR'.
  147. l_hie_nodes_wa-dummy_leaf = ''.
  148. * l_hie_nodes_wa-to_chadep is inital
  149. INSERT l_hie_nodes_wa INTO TABLE et_hie_nodes.
  150.  
  151. elseif ETO_CHARSEL3-LOW is INITIAL.
  152.  
  153.  
  154. LOOP at companyh.
  155. * text node 'AMERICA'
  156. l_hie_nodes_wa-chanm = is_hie_key-chanm.
  157. l_hie_nodes_wa-hienm = is_hie_key-hienm.
  158. l_hie_nodes_wa-hiever = is_hie_key-hiever.
  159. l_hie_nodes_wa-dateto = is_hie_key-dateto.
  160. l_hie_nodes_wa-nodename = companyh-NODENAME.
  161. l_hie_nodes_wa-hiecha = 'Y_FICTR'.
  162. l_hie_nodes_wa-dummy_leaf = ''.
  163. * l_hie_nodes_wa-to_chadep is inital
  164. INSERT l_hie_nodes_wa INTO TABLE et_hie_nodes.
  165. * text node 'EUROPE'
  166. * l_hie_nodes_wa-chanm = is_hie_key-chanm.
  167. * l_hie_nodes_wa-hienm = is_hie_key-hienm.
  168. * l_hie_nodes_wa-hiever = is_hie_key-hiever.
  169. * l_hie_nodes_wa-dateto = is_hie_key-dateto.
  170. * l_hie_nodes_wa-nodename = 'EUROPE'.
  171. * l_hie_nodes_wa-hiecha = '0HIER_NODE'.
  172. * l_hie_nodes_wa-dummy_leaf = ''.
  173. * INSERT l_hie_nodes_wa INTO TABLE et_hie_nodes.

Комментарии