二维码

[RFC] 创建和修改物料主数据,自动识别有变动的字段

Twilight发表于 2026-05-08 16:48Twilight 最后回复于 2026-05-08 16:48 [复制链接] 44 0

  1. FUNCTION zmmfm014.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口
  4. *"  EXPORTING
  5. *"     VALUE(E_MESSAGE) TYPE  ZOTS001
  6. *"  TABLES
  7. *"      IT_MARA STRUCTURE  ZMMS028
  8. *"      IT_MARC STRUCTURE  ZMMS031 OPTIONAL
  9. *"      IT_MARD STRUCTURE  ZMMS030 OPTIONAL
  10. *"      IT_MBEW STRUCTURE  ZMMS033 OPTIONAL
  11. *"      IT_MVKE STRUCTURE  ZMMS035 OPTIONAL
  12. *"      IT_MARM STRUCTURE  ZMMS032 OPTIONAL
  13. *"      IT_MLAN STRUCTURE  ZMMS034 OPTIONAL
  14. *"      IT_MAKT STRUCTURE  ZMMS029 OPTIONAL
  15. *"      IT_MLTX STRUCTURE  ZMMS036 OPTIONAL
  16. *"----------------------------------------------------------------------
  17.   DATA:lv_value TYPE trdir-name.

  18.   READ TABLE it_mara ASSIGNING FIELD-SYMBOL(<fs_mara>) INDEX 1.
  19.   IF sy-subrc = 0.
  20.     lv_value = <fs_mara>-material.
  21.   ELSE.
  22.     EXIT.
  23.   ENDIF.

  24. *加锁
  25.   IF lv_value IS NOT INITIAL.
  26.     CALL METHOD zcl_lock=>enqueue
  27.       EXPORTING
  28.         i_name     = 'ZMMFM014'
  29.         i_value    = lv_value
  30.         i_timeout  = '3000'  "3000ms = 3s
  31.         i_interval = '1000'  "1000ms = 1s
  32.       IMPORTING
  33.         e_message  = e_message.
  34.     IF e_message-type = 'E'.
  35.       EXIT.
  36.     ENDIF.
  37.   ENDIF.

  38.   PERFORM frm_call_bapi_data TABLES it_mara it_marc it_mard it_mbew it_mvke it_makt it_marm it_mltx it_mlan
  39.                              CHANGING e_message.

  40. *解锁
  41.   IF lv_value IS NOT INITIAL.
  42.     CALL METHOD zcl_lock=>dequeue
  43.       EXPORTING
  44.         i_name  = 'ZMMFM014'
  45.         i_value = lv_value.
  46.   ENDIF.

  47. ENDFUNCTION.
复制代码
  1. *----------------------------------------------------------------------*
  2. ***INCLUDE LZMMFG014F01.
  3. *----------------------------------------------------------------------*
  4. *&---------------------------------------------------------------------*
  5. *& Form FRM_CALL_BAPI_DATA
  6. *&---------------------------------------------------------------------*
  7. *& text
  8. *&---------------------------------------------------------------------*
  9. *&      --> IT_MARC
  10. *&      --> IT_MARCX
  11. *&      --> IT_MARD
  12. *&      --> IT_MARDX
  13. *&      --> IT_MBEW
  14. *&      --> IT_MBEWX
  15. *&      --> IT_MVKE
  16. *&      --> IT_MVKEX
  17. *&      --> IT_MAKT
  18. *&      --> IT_MARM
  19. *&      --> IT_MARMX
  20. *&      --> IT_MLTX
  21. *&      --> IT_MLAN
  22. *&      --> I_HEADDATA
  23. *&      --> I_MARA
  24. *&      --> I_MARAX
  25. *&      <-- E_MESSAGE
  26. *&---------------------------------------------------------------------*
  27. FORM frm_call_bapi_data  TABLES pt_mara        STRUCTURE        zmms028
  28.                                 pt_marc        STRUCTURE        zmms031
  29.                                 pt_mard        STRUCTURE        zmms030
  30.                                 pt_mbew        STRUCTURE        zmms033
  31.                                 pt_mvke        STRUCTURE        zmms035
  32.                                 pt_makt        STRUCTURE        zmms029
  33.                                 pt_marm        STRUCTURE        zmms032
  34.                                 pt_mltx        STRUCTURE        zmms036
  35.                                 pt_mlan        STRUCTURE        zmms034
  36.                          CHANGING pc_message  TYPE zots001.

  37.   DATA:ls_return         TYPE bapiret2.
  38.   DATA:lt_returnmessages TYPE TABLE OF bapie1ret2  WITH HEADER LINE.
  39.   DATA:lt_head           TYPE TABLE OF bapie1matheader.
  40.   DATA:lt_mara           TYPE TABLE OF bapie1mara  WITH HEADER LINE.
  41.   DATA:lt_marax          TYPE TABLE OF bapie1marax WITH HEADER LINE.
  42.   DATA:lt_marc           TYPE TABLE OF bapie1marc  WITH HEADER LINE.
  43.   DATA:lt_marcx          TYPE TABLE OF bapie1marcx WITH HEADER LINE.
  44.   DATA:lt_mard           TYPE TABLE OF bapie1mard  WITH HEADER LINE.
  45.   DATA:lt_mardx          TYPE TABLE OF bapie1mardx WITH HEADER LINE.
  46.   DATA:lt_mbew           TYPE TABLE OF bapie1mbew  WITH HEADER LINE.
  47.   DATA:lt_mbewx          TYPE TABLE OF bapie1mbewx WITH HEADER LINE.
  48.   DATA:lt_mvke           TYPE TABLE OF bapie1mvke  WITH HEADER LINE.
  49.   DATA:lt_mvkex          TYPE TABLE OF bapie1mvkex WITH HEADER LINE.
  50.   DATA:lt_makt           TYPE TABLE OF bapie1makt  WITH HEADER LINE.
  51.   DATA:lt_marm           TYPE TABLE OF bapie1marm  WITH HEADER LINE.
  52.   DATA:lt_marmx          TYPE TABLE OF bapie1marmx WITH HEADER LINE.
  53.   DATA:lt_mltx           TYPE TABLE OF bapie1mltx  WITH HEADER LINE.
  54.   DATA:lt_mlan           TYPE TABLE OF bapie1mlan  WITH HEADER LINE.
  55.   DATA:ls_head           TYPE bapie1matheader.
  56.   DATA:lv_matnr          TYPE mara-matnr.

  57.   READ TABLE pt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>) INDEX 1.
  58.   IF sy-subrc = 0.
  59.     PERFORM frm_conversion_matnr_input CHANGING <fs_mara>-material.
  60.     lv_matnr = <fs_mara>-material.
  61.   ENDIF.

  62. *-->默认数据
  63.   LOOP AT pt_mara ASSIGNING <fs_mara>.
  64.     <fs_mara>-trans_grp = '0001'.
  65.   ENDLOOP.
  66.   LOOP AT pt_marc ASSIGNING FIELD-SYMBOL(<fs_marc>).
  67.     <fs_marc>-sm_key     = '001'.
  68.     <fs_marc>-availcheck = '02'.
  69.     <fs_marc>-loadinggrp = '0001'.
  70.     <fs_marc>-mrp_type   = 'PD'.
  71.     <fs_marc>-dep_req_id = '2'.
  72.     <fs_marc>-production_scheduler = 'SG1'.
  73.     <fs_marc>-prodprof   = '000001'.
  74.     <fs_marc>-lotsizekey = 'EX'.
  75.   ENDLOOP.
  76.   LOOP AT pt_mvke ASSIGNING FIELD-SYMBOL(<fs_mvke>).
  77.     <fs_mvke>-matl_stats = '1'. "纳入统计
  78.   ENDLOOP.
  79.   LOOP AT pt_mbew ASSIGNING FIELD-SYMBOL(<fs_mbew>).
  80.     <fs_mbew>-qty_struct = 'X'.
  81.     <fs_mbew>-orig_mat   = 'X'.
  82.   ENDLOOP.

  83. *-->填充数据
  84.   PERFORM frm_fill_mara_data TABLES pt_mara lt_mara lt_marax USING lv_matnr CHANGING ls_head.
  85.   PERFORM frm_fill_marc_data TABLES pt_marc lt_marc lt_marcx USING lv_matnr CHANGING ls_head.
  86.   PERFORM frm_fill_mard_data TABLES pt_mard lt_mard lt_mardx USING lv_matnr CHANGING ls_head.
  87.   PERFORM frm_fill_mbew_data TABLES pt_mbew lt_mbew lt_mbewx USING lv_matnr CHANGING ls_head.
  88.   PERFORM frm_fill_mvke_data TABLES pt_mvke lt_mvke lt_mvkex USING lv_matnr CHANGING ls_head.
  89.   PERFORM frm_fill_marm_data TABLES pt_marm lt_marm lt_marmx USING lv_matnr CHANGING ls_head.
  90.   PERFORM frm_fill_mlan_data TABLES pt_mlan lt_mlan USING lv_matnr.
  91.   PERFORM frm_fill_makt_data TABLES pt_makt lt_makt USING lv_matnr.
  92.   PERFORM frm_fill_mltx_data TABLES pt_mltx lt_mltx USING lv_matnr.

  93.   IF ls_head IS NOT INITIAL.
  94.     APPEND ls_head TO lt_head.
  95.   ENDIF.

  96. *-->调用BAPI
  97.   CALL FUNCTION 'BAPI_MATERIAL_SAVEREPLICA'
  98.     EXPORTING
  99.       noappllog            = ''
  100.       nochangedoc          = ''
  101.       testrun              = ''
  102.       inpfldcheck          = ''
  103.     IMPORTING
  104.       return               = ls_return
  105.     TABLES
  106.       headdata             = lt_head[]
  107.       clientdata           = lt_mara[]
  108.       clientdatax          = lt_marax[]
  109.       plantdata            = lt_marc[]
  110.       plantdatax           = lt_marcx[]
  111.       storagelocationdata  = lt_mard[]
  112.       storagelocationdatax = lt_mardx[]
  113.       valuationdata        = lt_mbew[]
  114.       valuationdatax       = lt_mbewx[]
  115.       salesdata            = lt_mvke[]
  116.       salesdatax           = lt_mvkex[]
  117.       materialdescription  = lt_makt[]
  118.       unitsofmeasure       = lt_marm[]
  119.       unitsofmeasurex      = lt_marmx[]
  120.       materiallongtext     = lt_mltx[]
  121.       taxclassifications   = lt_mlan[]
  122.       returnmessages       = lt_returnmessages[].

  123.   IF ls_return-type CA 'AXE'.
  124.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  125.     pc_message-type    = 'E'.
  126.     LOOP AT lt_returnmessages WHERE type CA 'AXE'.
  127.       IF pc_message-message IS INITIAL.
  128.         pc_message-message   = lt_returnmessages-message.
  129.       ELSE.
  130.         CONCATENATE pc_message-message lt_returnmessages-message INTO pc_message-message SEPARATED BY '/'.
  131.       ENDIF.
  132.     ENDLOOP.
  133.   ELSE.
  134.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  135.       EXPORTING
  136.         wait = 'X'.
  137.     pc_message-type    = 'S'.
  138.     pc_message-message = '物料维护成功!'.
  139.   ENDIF.

  140. ENDFORM.
  141. *&---------------------------------------------------------------------*
  142. *& Form FRM_CONVERSION_MATNR_INPUT
  143. *&---------------------------------------------------------------------*
  144. *& text
  145. *&---------------------------------------------------------------------*
  146. *&      <-- <FS_MLTX>_TEXT_NAME
  147. *&---------------------------------------------------------------------*
  148. FORM frm_conversion_matnr_input  CHANGING pc_matnr.
  149.   CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
  150.     EXPORTING
  151.       input        = pc_matnr
  152.     IMPORTING
  153.       output       = pc_matnr
  154.     EXCEPTIONS
  155.       length_error = 1
  156.       OTHERS       = 2.
  157. ENDFORM.
  158. *&---------------------------------------------------------------------*
  159. *& Form FRM_FILL_MARA_DATA
  160. *&---------------------------------------------------------------------*
  161. *& text
  162. *&---------------------------------------------------------------------*
  163. *&      --> PT_MARA
  164. *&      --> LT_MARA
  165. *&      --> LS_HEAD
  166. *&---------------------------------------------------------------------*
  167. FORM frm_fill_mara_data  TABLES   pt_mara  STRUCTURE  zmms028
  168.                                   lt_mara   STRUCTURE bapie1mara
  169.                                   lt_marax  STRUCTURE bapie1marax
  170.                          USING    pi_matnr TYPE mara-matnr
  171.                          CHANGING pc_head  TYPE bapie1matheader.
  172.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  173.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  174.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  175.                  <fs_value_db> TYPE any,
  176.                  <fs_value_bp> TYPE any,
  177.                  <fs_type>     TYPE any,
  178.                  <fs_comp>     TYPE abap_compdescr.
  179.   DATA:ls_mara   TYPE bapie1mara.
  180.   DATA:ls_marax  TYPE bapie1marax.

  181.   CLEAR:lt_mara[],lt_marax[].
  182.   LOOP AT pt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>).
  183.     PERFORM frm_conversion_matnr_input CHANGING <fs_mara>-material.
  184.     PERFORM frm_conversion_cunit_input CHANGING <fs_mara>-base_uom.
  185.     PERFORM frm_conversion_cunit_input CHANGING <fs_mara>-unit_of_wt.

  186.     CALL FUNCTION 'CONVERSION_EXIT_PERKZ_INPUT'
  187.       EXPORTING
  188.         input  = <fs_mara>-period_ind_expiration_date
  189.       IMPORTING
  190.         output = <fs_mara>-period_ind_expiration_date.
  191.   ENDLOOP.

  192.   SELECT  matnr AS material,
  193.           meins AS base_uom,
  194.           matkl AS matl_group,
  195.           spart AS division,
  196.           labor AS dsn_office,
  197.           prdha AS prod_hier,
  198.           mstae AS pur_status,
  199.           mstde AS pvalidfrom,
  200.           gewei AS unit_of_wt,
  201.           ntgew AS net_weight,
  202.           ferth AS prod_memo,
  203.           normt AS std_descr,
  204.           mstav AS sal_status,
  205.           mstdv AS svalidfrom,
  206.           xchpf AS batch_mgmt,
  207.           tragr AS trans_grp,
  208.           tempb AS temp_conds,
  209.           mhdrz AS minremlife,
  210.           mhdhb AS shelf_life,
  211.           iprkz AS period_ind_expiration_date
  212.    FROM mara
  213.    WHERE matnr = @pi_matnr
  214.   INTO TABLE @DATA(lt_mara_db).

  215.   SORT lt_mara_db BY material.
  216.   LOOP AT pt_mara ASSIGNING FIELD-SYMBOL(<fs_mara_pi>).
  217.     CLEAR:ls_mara,ls_marax.
  218.     READ TABLE lt_mara_db ASSIGNING FIELD-SYMBOL(<fs_mara_db>) WITH KEY material = <fs_mara_pi>-material BINARY SEARCH.
  219.     IF sy-subrc = 0.
  220.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mara_pi> ).
  221.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  222.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mara_pi> TO <fs_value_pi>.
  223.         IF sy-subrc = 0.
  224.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mara_db> TO <fs_value_db>.
  225.           IF sy-subrc = 0.
  226.             IF <fs_value_pi> NE <fs_value_db>.
  227.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mara TO <fs_value_bp>.
  228.               IF sy-subrc = 0.
  229.                 <fs_value_bp> = <fs_value_pi>.
  230.               ENDIF.
  231.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marax TO <fs_value_bp>.
  232.               IF sy-subrc = 0.
  233.                 <fs_value_bp> = 'X'.
  234.               ENDIF.
  235.             ENDIF.
  236.           ENDIF.
  237.         ENDIF.
  238.       ENDLOOP.

  239.       IF ls_marax IS NOT INITIAL.
  240.         ls_mara-function = 'UPD'.
  241.         ls_mara-material = <fs_mara_pi>-material.
  242.         APPEND ls_mara  TO lt_mara.

  243.         pc_head-basic_view = 'X'.

  244.         ls_marax-function = 'UPD'.
  245.         ls_marax-material = <fs_mara_pi>-material.
  246.         APPEND ls_marax TO lt_marax.
  247.       ENDIF.
  248.       pc_head-function = 'UPD'.
  249.       pc_head-material = <fs_mara_pi>-material.
  250.     ELSE.
  251.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mara_pi> ).
  252.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  253.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mara_pi> TO <fs_value_pi>.
  254.         IF sy-subrc = 0.
  255.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mara TO <fs_value_bp>.
  256.           IF sy-subrc = 0.
  257.             <fs_value_bp> = <fs_value_pi>.
  258.           ENDIF.
  259.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marax TO <fs_value_bp>.
  260.           IF sy-subrc = 0.
  261.             <fs_value_bp> = 'X'.
  262.           ENDIF.
  263.         ENDIF.
  264.       ENDLOOP.

  265.       IF ls_marax IS NOT INITIAL.
  266.         ls_mara-function = 'INS'.
  267.         ls_mara-material = <fs_mara_pi>-material.
  268.         APPEND ls_mara  TO lt_mara.

  269.         ls_marax-function = 'INS'.
  270.         ls_marax-material = <fs_mara_pi>-material.
  271.         APPEND ls_marax TO lt_marax.
  272.       ENDIF.

  273.       pc_head-function = 'INS'.
  274.       pc_head-material = <fs_mara_pi>-material.
  275.       pc_head-ind_sector = 'C'."化学
  276.       pc_head-matl_type  = 'A001'."成品
  277.       pc_head-basic_view = 'X'.
  278.     ENDIF.
  279.   ENDLOOP.

  280. ENDFORM.
  281. *&---------------------------------------------------------------------*
  282. *& Form FRM_FILL_MARC_DATA
  283. *&---------------------------------------------------------------------*
  284. *& text
  285. *&---------------------------------------------------------------------*
  286. *&      --> PT_MARC
  287. *&      --> LT_MARC
  288. *&      --> LT_MARCX
  289. *&      --> LV_MATNR
  290. *&      <-- LS_HEAD
  291. *&---------------------------------------------------------------------*
  292. FORM frm_fill_marc_data  TABLES   pt_marc  STRUCTURE  zmms031
  293.                                   lt_marc   STRUCTURE bapie1marc
  294.                                   lt_marcx  STRUCTURE bapie1marcx
  295.                          USING    pi_matnr TYPE mara-matnr
  296.                          CHANGING pc_head  TYPE bapie1matheader.
  297.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  298.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  299.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  300.                  <fs_value_db> TYPE any,
  301.                  <fs_value_bp> TYPE any,
  302.                  <fs_type>     TYPE any,
  303.                  <fs_comp>     TYPE abap_compdescr.
  304.   DATA:ls_marc   TYPE bapie1marc.
  305.   DATA:ls_marcx  TYPE bapie1marcx.

  306.   CLEAR:lt_marc[],lt_marcx[].
  307.   LOOP AT pt_marc ASSIGNING FIELD-SYMBOL(<fs_marc>).
  308.     PERFORM frm_conversion_matnr_input CHANGING <fs_marc>-material.

  309.     <fs_marc>-profit_ctr = |{ <fs_marc>-profit_ctr ALPHA = IN }|.
  310.     PERFORM frm_conversion_cunit_input CHANGING <fs_marc>-prod_unit.
  311.   ENDLOOP.

  312.   SELECT matnr AS material,
  313.          werks AS plant,
  314.          mtvfp AS availcheck,
  315.          xchpf AS batch_mgmt,
  316.          ladgr AS loadinggrp,
  317.          prctr AS profit_ctr,
  318.          ekgrp AS pur_group,
  319.          disgr AS mrp_group,
  320.          mmsta AS pur_status,
  321.          mmstd AS pvalidfrom,
  322.          dismm AS mrp_type,
  323.          dispo AS mrp_ctrler,
  324.          disls AS lotsizekey,
  325.          beskz AS proc_type,
  326.          sobsl AS spproctype,
  327.          lgpro AS iss_st_loc,
  328.          dzeit AS inhseprodt,
  329.          webaz AS gr_pr_time,
  330.          plifz AS plnd_delry,
  331.          fhori AS sm_key,
  332.          strgr AS plan_strgp,
  333.          eisbe AS safety_stk,
  334.          eislo AS min_safety_stk,
  335.          sbdkz AS dep_req_id,
  336.          frtme AS prod_unit,
  337.          fevor AS production_scheduler,
  338.          sfcpf AS prodprof,
  339.          prfrq AS insp_int,
  340.          losgr AS lot_size
  341.    FROM marc
  342.    WHERE matnr = @pi_matnr
  343.   INTO TABLE @DATA(lt_marc_db).

  344.   SORT lt_marc_db BY material plant.
  345.   LOOP AT pt_marc ASSIGNING FIELD-SYMBOL(<fs_marc_pi>).
  346.     CLEAR:ls_marc,ls_marcx.
  347.     READ TABLE lt_marc_db ASSIGNING FIELD-SYMBOL(<fs_marc_db>) WITH KEY material = <fs_marc_pi>-material plant = <fs_marc_pi>-plant BINARY SEARCH.
  348.     IF sy-subrc = 0.
  349.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_marc_pi> ).
  350.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  351.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marc_pi> TO <fs_value_pi>.
  352.         IF sy-subrc = 0.
  353.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marc_db> TO <fs_value_db>.
  354.           IF sy-subrc = 0.
  355.             IF <fs_value_pi> NE <fs_value_db>.
  356.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marc TO <fs_value_bp>.
  357.               IF sy-subrc = 0.
  358.                 <fs_value_bp> = <fs_value_pi>.
  359.               ENDIF.
  360.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marcx TO <fs_value_bp>.
  361.               IF sy-subrc = 0.
  362.                 <fs_value_bp> = 'X'.
  363.               ENDIF.
  364.             ENDIF.
  365.           ENDIF.
  366.         ENDIF.
  367.       ENDLOOP.

  368.       IF ls_marcx IS NOT INITIAL.
  369.         ls_marc-function = 'UPD'.
  370.         ls_marc-material = <fs_marc_pi>-material.
  371.         ls_marc-plant    = <fs_marc_pi>-plant.
  372.         APPEND ls_marc  TO lt_marc.

  373.         ls_marcx-function = 'UPD'.
  374.         ls_marcx-material = <fs_marc_pi>-material.
  375.         ls_marcx-plant    = <fs_marc_pi>-plant.
  376.         APPEND ls_marcx TO lt_marcx.

  377.         pc_head-storage_view = 'X'.
  378.         IF ls_marc-proc_type = 'F' OR ls_marc-proc_type = 'X'."F 外部采购,X 两种采购类型
  379.           pc_head-purchase_view = 'X'.
  380.         ENDIF.
  381.         IF ls_marc-proc_type NE ''."采购和生产 都要扩MRP视图
  382.           pc_head-mrp_view = 'X'.
  383.         ENDIF.
  384.         pc_head-work_sched_view = 'X'.
  385.       ENDIF.
  386.     ELSE.
  387.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_marc_pi> ).
  388.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  389.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marc_pi> TO <fs_value_pi>.
  390.         IF sy-subrc = 0.
  391.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marc TO <fs_value_bp>.
  392.           IF sy-subrc = 0.
  393.             <fs_value_bp> = <fs_value_pi>.
  394.           ENDIF.
  395.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marcx TO <fs_value_bp>.
  396.           IF sy-subrc = 0.
  397.             <fs_value_bp> = 'X'.
  398.           ENDIF.
  399.         ENDIF.
  400.       ENDLOOP.

  401.       IF ls_marcx IS NOT INITIAL.
  402.         ls_marc-function = 'INS'.
  403.         ls_marc-material = <fs_marc_pi>-material.
  404.         ls_marc-plant    = <fs_marc_pi>-plant.
  405.         APPEND ls_marc  TO lt_marc.

  406.         ls_marcx-function = 'INS'.
  407.         ls_marcx-material = <fs_marc_pi>-material.
  408.         ls_marcx-plant    = <fs_marc_pi>-plant.
  409.         APPEND ls_marcx TO lt_marcx.

  410.         pc_head-storage_view = 'X'.
  411.         IF ls_marc-proc_type = 'F' OR ls_marc-proc_type = 'X'."F 外部采购,X 两种采购类型
  412.           pc_head-purchase_view = 'X'.
  413.         ENDIF.
  414.         IF ls_marc-proc_type NE ''."采购和生产 都要扩MRP视图
  415.           pc_head-mrp_view = 'X'.
  416.         ENDIF.
  417.         pc_head-work_sched_view = 'X'.
  418.       ENDIF.
  419.     ENDIF.
  420.   ENDLOOP.

  421. ENDFORM.
  422. *&---------------------------------------------------------------------*
  423. *& Form FRM_FILL_MARD_DATA
  424. *&---------------------------------------------------------------------*
  425. *& text
  426. *&---------------------------------------------------------------------*
  427. *&      --> PT_MARD
  428. *&      --> LT_MARD
  429. *&      --> LT_MARDX
  430. *&      --> LV_MATNR
  431. *&      <-- LS_HEAD
  432. *&---------------------------------------------------------------------*
  433. FORM frm_fill_mard_data  TABLES   pt_mard  STRUCTURE  zmms030
  434.                                   lt_mard   STRUCTURE bapie1mard
  435.                                   lt_mardx  STRUCTURE bapie1mardx
  436.                          USING    pi_matnr TYPE mara-matnr
  437.                          CHANGING pc_head  TYPE bapie1matheader.
  438.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  439.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  440.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  441.                  <fs_value_db> TYPE any,
  442.                  <fs_value_bp> TYPE any,
  443.                  <fs_type>     TYPE any,
  444.                  <fs_comp>     TYPE abap_compdescr.
  445.   DATA:ls_mard   TYPE bapie1mard.
  446.   DATA:ls_mardx  TYPE bapie1mardx.

  447.   CLEAR:lt_mard[],lt_mardx[].
  448.   LOOP AT pt_mard ASSIGNING FIELD-SYMBOL(<fs_mard>).
  449.     PERFORM frm_conversion_matnr_input CHANGING <fs_mard>-material.
  450.   ENDLOOP.

  451.   SELECT matnr AS material,
  452.          werks AS plant,
  453.          lgort AS stge_loc,
  454.          lgpbe AS stge_bin
  455.    FROM mard
  456.    WHERE matnr = @pi_matnr
  457.   INTO TABLE @DATA(lt_mard_db).

  458.   SORT lt_mard_db BY material plant stge_loc.
  459.   LOOP AT pt_mard ASSIGNING FIELD-SYMBOL(<fs_mard_pi>).
  460.     CLEAR:ls_mard,ls_mardx.
  461.     READ TABLE lt_mard_db ASSIGNING FIELD-SYMBOL(<fs_mard_db>) WITH KEY material = <fs_mard_pi>-material plant = <fs_mard_pi>-plant stge_loc = <fs_mard_pi>-stge_loc BINARY SEARCH.
  462.     IF sy-subrc = 0.
  463.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mard_pi> ).
  464.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  465.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mard_pi> TO <fs_value_pi>.
  466.         IF sy-subrc = 0.
  467.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mard_db> TO <fs_value_db>.
  468.           IF sy-subrc = 0.
  469.             IF <fs_value_pi> NE <fs_value_db>.
  470.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mard TO <fs_value_bp>.
  471.               IF sy-subrc = 0.
  472.                 <fs_value_bp> = <fs_value_pi>.
  473.               ENDIF.
  474.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mardx TO <fs_value_bp>.
  475.               IF sy-subrc = 0.
  476.                 <fs_value_bp> = 'X'.
  477.               ENDIF.
  478.             ENDIF.
  479.           ENDIF.
  480.         ENDIF.
  481.       ENDLOOP.

  482.       IF ls_mardx IS NOT INITIAL.
  483.         ls_mard-function = 'UPD'.
  484.         ls_mard-material = <fs_mard_pi>-material.
  485.         ls_mard-plant    = <fs_mard_pi>-plant.
  486.         ls_mard-stge_loc = <fs_mard_pi>-stge_loc.
  487.         APPEND ls_mard  TO lt_mard.

  488.         ls_mardx-function = 'UPD'.
  489.         ls_mardx-material = <fs_mard_pi>-material.
  490.         ls_mardx-plant    = <fs_mard_pi>-plant.
  491.         ls_mardx-stge_loc = <fs_mard_pi>-stge_loc.
  492.         APPEND ls_mardx TO lt_mardx.

  493.         pc_head-storage_view = 'X'.
  494.       ENDIF.
  495.     ELSE.
  496.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mard_pi> ).
  497.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  498.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mard_pi> TO <fs_value_pi>.
  499.         IF sy-subrc = 0.
  500.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mard TO <fs_value_bp>.
  501.           IF sy-subrc = 0.
  502.             <fs_value_bp> = <fs_value_pi>.
  503.           ENDIF.
  504.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mardx TO <fs_value_bp>.
  505.           IF sy-subrc = 0.
  506.             <fs_value_bp> = 'X'.
  507.           ENDIF.
  508.         ENDIF.
  509.       ENDLOOP.

  510.       IF ls_mardx IS NOT INITIAL.
  511.         ls_mard-function = 'INS'.
  512.         ls_mard-material = <fs_mard_pi>-material.
  513.         ls_mard-plant    = <fs_mard_pi>-plant.
  514.         ls_mard-stge_loc = <fs_mard_pi>-stge_loc.
  515.         APPEND ls_mard  TO lt_mard.

  516.         ls_mardx-function = 'INS'.
  517.         ls_mardx-material = <fs_mard_pi>-material.
  518.         ls_mardx-plant    = <fs_mard_pi>-plant.
  519.         ls_mardx-stge_loc = <fs_mard_pi>-stge_loc.
  520.         APPEND ls_mardx TO lt_mardx.

  521.         pc_head-storage_view = 'X'.
  522.       ENDIF.
  523.     ENDIF.
  524.   ENDLOOP.
  525. ENDFORM.
  526. *&---------------------------------------------------------------------*
  527. *& Form FRM_FILL_MBEW_DATA
  528. *&---------------------------------------------------------------------*
  529. *& text
  530. *&---------------------------------------------------------------------*
  531. *&      --> PT_MBEW
  532. *&      --> LT_MBEW
  533. *&      --> LT_MBEWX
  534. *&      --> LV_MATNR
  535. *&      <-- LS_HEAD
  536. *&---------------------------------------------------------------------*
  537. FORM frm_fill_mbew_data  TABLES   pt_mbew  STRUCTURE  zmms033
  538.                                   lt_mbew   STRUCTURE bapie1mbew
  539.                                   lt_mbewx  STRUCTURE bapie1mbewx
  540.                          USING    pi_matnr TYPE mara-matnr
  541.                          CHANGING pc_head  TYPE bapie1matheader.
  542.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  543.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  544.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  545.                  <fs_value_db> TYPE any,
  546.                  <fs_value_bp> TYPE any,
  547.                  <fs_type>     TYPE any,
  548.                  <fs_comp>     TYPE abap_compdescr.
  549.   DATA:ls_mbew   TYPE bapie1mbew.
  550.   DATA:ls_mbewx  TYPE bapie1mbewx.

  551.   CLEAR:lt_mbew[],lt_mbewx[].
  552.   LOOP AT pt_mbew ASSIGNING FIELD-SYMBOL(<fs_mbew>).
  553.     PERFORM frm_conversion_matnr_input CHANGING <fs_mbew>-material.
  554.   ENDLOOP.

  555.   SELECT matnr AS material,
  556.          bwkey AS val_area,
  557.          bklas AS val_class,
  558.          vprsv AS price_ctrl,
  559.          mlast AS ml_settle,
  560.          ekalr AS qty_struct,
  561.          hkmat AS orig_mat
  562.    FROM mbew
  563.    WHERE matnr = @pi_matnr
  564.   INTO TABLE @DATA(lt_mbew_db).

  565.   SORT lt_mbew_db BY material val_area.
  566.   LOOP AT pt_mbew ASSIGNING FIELD-SYMBOL(<fs_mbew_pi>).
  567.     CLEAR:ls_mbew,ls_mbewx.
  568.     READ TABLE lt_mbew_db ASSIGNING FIELD-SYMBOL(<fs_mbew_db>) WITH KEY material = <fs_mbew_pi>-material val_area = <fs_mbew_pi>-val_area BINARY SEARCH.
  569.     IF sy-subrc = 0.
  570.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mbew_pi> ).
  571.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  572.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mbew_pi> TO <fs_value_pi>.
  573.         IF sy-subrc = 0.
  574.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mbew_db> TO <fs_value_db>.
  575.           IF sy-subrc = 0.
  576.             IF <fs_value_pi> NE <fs_value_db>.
  577.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbew TO <fs_value_bp>.
  578.               IF sy-subrc = 0.
  579.                 <fs_value_bp> = <fs_value_pi>.
  580.               ENDIF.
  581.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbewx TO <fs_value_bp>.
  582.               IF sy-subrc = 0.
  583.                 <fs_value_bp> = 'X'.
  584.               ENDIF.
  585.             ENDIF.
  586.           ENDIF.
  587.         ENDIF.
  588.       ENDLOOP.

  589.       IF ls_mbewx IS NOT INITIAL.
  590.         ls_mbew-function = 'UPD'.
  591.         ls_mbew-material = <fs_mbew_pi>-material.
  592.         ls_mbew-val_area = <fs_mbew_pi>-val_area.
  593.         APPEND ls_mbew  TO lt_mbew.

  594.         ls_mbewx-function = 'UPD'.
  595.         ls_mbewx-material = <fs_mbew_pi>-material.
  596.         ls_mbewx-val_area = <fs_mbew_pi>-val_area.
  597.         APPEND ls_mbewx TO lt_mbewx.

  598.         pc_head-account_view = 'X'.
  599.       ENDIF.
  600.     ELSE.
  601.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mbew_pi> ).
  602.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  603.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mbew_pi> TO <fs_value_pi>.
  604.         IF sy-subrc = 0.
  605.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbew TO <fs_value_bp>.
  606.           IF sy-subrc = 0.
  607.             <fs_value_bp> = <fs_value_pi>.
  608.           ENDIF.
  609.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbewx TO <fs_value_bp>.
  610.           IF sy-subrc = 0.
  611.             <fs_value_bp> = 'X'.
  612.           ENDIF.
  613.         ENDIF.
  614.       ENDLOOP.

  615.       IF ls_mbewx IS NOT INITIAL.
  616.         ls_mbew-function = 'INS'.
  617.         ls_mbew-material = <fs_mbew_pi>-material.
  618.         ls_mbew-val_area = <fs_mbew_pi>-val_area.
  619.         APPEND ls_mbew  TO lt_mbew.

  620.         ls_mbewx-function = 'INS'.
  621.         ls_mbewx-material = <fs_mbew_pi>-material.
  622.         ls_mbewx-val_area = <fs_mbew_pi>-val_area.
  623.         APPEND ls_mbewx TO lt_mbewx.

  624.         pc_head-account_view = 'X'.
  625.       ENDIF.
  626.     ENDIF.
  627.   ENDLOOP.

  628. ENDFORM.
  629. *&---------------------------------------------------------------------*
  630. *& Form FRM_FILL_MVKE_DATA
  631. *&---------------------------------------------------------------------*
  632. *& text
  633. *&---------------------------------------------------------------------*
  634. *&      --> PT_MVKE
  635. *&      --> LT_MVKE
  636. *&      --> LT_MVKEX
  637. *&      --> LV_MATNR
  638. *&      <-- LS_HEAD
  639. *&---------------------------------------------------------------------*
  640. FORM frm_fill_mvke_data  TABLES   pt_mvke  STRUCTURE  zmms035
  641.                                   lt_mvke   STRUCTURE bapie1mvke
  642.                                   lt_mvkex  STRUCTURE bapie1mvkex
  643.                          USING    pi_matnr TYPE mara-matnr
  644.                          CHANGING pc_head  TYPE bapie1matheader.
  645.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  646.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  647.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  648.                  <fs_value_db> TYPE any,
  649.                  <fs_value_bp> TYPE any,
  650.                  <fs_type>     TYPE any,
  651.                  <fs_comp>     TYPE abap_compdescr.
  652.   DATA:ls_mvke   TYPE bapie1mvke.
  653.   DATA:ls_mvkex  TYPE bapie1mvkex.

  654.   CLEAR:lt_mvke[],lt_mvkex[].
  655.   LOOP AT pt_mvke ASSIGNING FIELD-SYMBOL(<fs_mvke>).
  656.     PERFORM frm_conversion_matnr_input CHANGING <fs_mvke>-material.
  657.     PERFORM frm_conversion_cunit_input CHANGING <fs_mvke>-sales_unit.
  658.   ENDLOOP.

  659.   SELECT matnr AS material,
  660.          vkorg AS sales_org,
  661.          vtweg AS distr_chan,
  662.          vrkme AS sales_unit,
  663.          vmsta AS sal_status,
  664.          vmstd AS valid_from,
  665.          dwerk AS delyg_plnt,
  666.          versg AS matl_stats,
  667.          ktgrm AS acct_assgt,
  668.          mtpos AS item_cat,
  669.          mvgr1 AS matl_grp_1,
  670.          mvgr2 AS matl_grp_2,
  671.          prodh AS prod_hier
  672.    FROM mvke
  673.    WHERE matnr = @pi_matnr
  674.   INTO TABLE @DATA(lt_mvke_db).

  675.   SORT lt_mvke_db BY material sales_org distr_chan.
  676.   LOOP AT pt_mvke ASSIGNING FIELD-SYMBOL(<fs_mvke_pi>).
  677.     CLEAR:ls_mvke,ls_mvkex.
  678.     READ TABLE lt_mvke_db ASSIGNING FIELD-SYMBOL(<fs_mvke_db>) WITH KEY material = <fs_mvke_pi>-material sales_org = <fs_mvke_pi>-sales_org distr_chan = <fs_mvke_pi>-distr_chan BINARY SEARCH.
  679.     IF sy-subrc = 0.
  680.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mvke_pi> ).
  681.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  682.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mvke_pi> TO <fs_value_pi>.
  683.         IF sy-subrc = 0.
  684.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mvke_db> TO <fs_value_db>.
  685.           IF sy-subrc = 0.
  686.             IF <fs_value_pi> NE <fs_value_db>.
  687.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvke TO <fs_value_bp>.
  688.               IF sy-subrc = 0.
  689.                 <fs_value_bp> = <fs_value_pi>.
  690.               ENDIF.
  691.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvkex TO <fs_value_bp>.
  692.               IF sy-subrc = 0.
  693.                 <fs_value_bp> = 'X'.
  694.               ENDIF.
  695.             ENDIF.
  696.           ENDIF.
  697.         ENDIF.
  698.       ENDLOOP.

  699.       IF ls_mvkex IS NOT INITIAL.
  700.         ls_mvke-function = 'UPD'.
  701.         ls_mvke-material = <fs_mvke_pi>-material.
  702.         ls_mvke-sales_org  = <fs_mvke_pi>-sales_org.
  703.         ls_mvke-distr_chan = <fs_mvke_pi>-distr_chan.
  704.         APPEND ls_mvke  TO lt_mvke.

  705.         ls_mvkex-function = 'UPD'.
  706.         ls_mvkex-material = <fs_mvke_pi>-material.
  707.         ls_mvkex-sales_org  = <fs_mvke_pi>-sales_org.
  708.         ls_mvkex-distr_chan = <fs_mvke_pi>-distr_chan.
  709.         APPEND ls_mvkex TO lt_mvkex.

  710.         pc_head-sales_view = 'X'.
  711.       ENDIF.
  712.     ELSE.
  713.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mvke_pi> ).
  714.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  715.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mvke_pi> TO <fs_value_pi>.
  716.         IF sy-subrc = 0.
  717.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvke TO <fs_value_bp>.
  718.           IF sy-subrc = 0.
  719.             <fs_value_bp> = <fs_value_pi>.
  720.           ENDIF.
  721.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvkex TO <fs_value_bp>.
  722.           IF sy-subrc = 0.
  723.             <fs_value_bp> = 'X'.
  724.           ENDIF.
  725.         ENDIF.
  726.       ENDLOOP.

  727.       IF ls_mvkex IS NOT INITIAL.
  728.         ls_mvke-function = 'INS'.
  729.         ls_mvke-material = <fs_mvke_pi>-material.
  730.         ls_mvke-sales_org  = <fs_mvke_pi>-sales_org.
  731.         ls_mvke-distr_chan = <fs_mvke_pi>-distr_chan.
  732.         APPEND ls_mvke  TO lt_mvke.

  733.         ls_mvkex-function = 'INS'.
  734.         ls_mvkex-material = <fs_mvke_pi>-material.
  735.         ls_mvkex-sales_org  = <fs_mvke_pi>-sales_org.
  736.         ls_mvkex-distr_chan = <fs_mvke_pi>-distr_chan.
  737.         APPEND ls_mvkex TO lt_mvkex.

  738.         pc_head-sales_view = 'X'.
  739.       ENDIF.
  740.     ENDIF.
  741.   ENDLOOP.

  742. ENDFORM.
  743. *&---------------------------------------------------------------------*
  744. *& Form FRM_FILL_MARM_DATA
  745. *&---------------------------------------------------------------------*
  746. *& text
  747. *&---------------------------------------------------------------------*
  748. *&      --> PT_MARM
  749. *&      --> LT_MARM
  750. *&      --> LT_MARMX
  751. *&      --> LV_MATNR
  752. *&      <-- LS_HEAD
  753. *&---------------------------------------------------------------------*
  754. FORM frm_fill_marm_data  TABLES   pt_marm  STRUCTURE  zmms032
  755.                                   lt_marm   STRUCTURE bapie1marm
  756.                                   lt_marmx  STRUCTURE bapie1marmx
  757.                          USING    pi_matnr TYPE mara-matnr
  758.                          CHANGING pc_head  TYPE bapie1matheader.
  759.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  760.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  761.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  762.                  <fs_value_db> TYPE any,
  763.                  <fs_value_bp> TYPE any,
  764.                  <fs_type>     TYPE any,
  765.                  <fs_comp>     TYPE abap_compdescr.
  766.   DATA:ls_marm   TYPE bapie1marm.
  767.   DATA:ls_marmx  TYPE bapie1marmx.

  768.   CLEAR:lt_marm[],lt_marmx[].
  769.   LOOP AT pt_marm ASSIGNING FIELD-SYMBOL(<fs_marm>).
  770.     PERFORM frm_conversion_matnr_input CHANGING <fs_marm>-material.
  771.     PERFORM frm_conversion_cunit_input CHANGING <fs_marm>-alt_unit.
  772.     PERFORM frm_conversion_cunit_input CHANGING <fs_marm>-unit_of_wt.
  773.     PERFORM frm_conversion_cunit_input CHANGING <fs_marm>-volumeunit.
  774.   ENDLOOP.

  775.   SELECT matnr AS material,
  776.          meinh AS alt_unit,
  777.          umrez AS numerator,
  778.          umren AS denominatr,
  779.          brgew AS gross_wt,
  780.          gewei AS unit_of_wt,
  781.          volum AS volume,
  782.          voleh AS volumeunit
  783.    FROM marm
  784.    WHERE matnr = @pi_matnr
  785.   INTO TABLE @DATA(lt_marm_db).

  786.   SORT lt_marm_db BY material alt_unit.
  787.   LOOP AT pt_marm ASSIGNING FIELD-SYMBOL(<fs_marm_pi>).
  788.     CLEAR:ls_marm,ls_marmx.
  789.     READ TABLE lt_marm_db ASSIGNING FIELD-SYMBOL(<fs_marm_db>) WITH KEY material = <fs_marm_pi>-material alt_unit = <fs_marm_pi>-alt_unit BINARY SEARCH.
  790.     IF sy-subrc = 0.
  791.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_marm_pi> ).
  792.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  793.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marm_pi> TO <fs_value_pi>.
  794.         IF sy-subrc = 0.
  795.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marm_db> TO <fs_value_db>.
  796.           IF sy-subrc = 0.
  797.             IF <fs_value_pi> NE <fs_value_db>.
  798.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marm TO <fs_value_bp>.
  799.               IF sy-subrc = 0.
  800.                 <fs_value_bp> = <fs_value_pi>.
  801.               ENDIF.
  802.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marmx TO <fs_value_bp>.
  803.               IF sy-subrc = 0.
  804.                 <fs_value_bp> = 'X'.
  805.               ENDIF.
  806.             ENDIF.
  807.           ENDIF.
  808.         ENDIF.
  809.       ENDLOOP.

  810.       IF ls_marmx IS NOT INITIAL.
  811.         ls_marm-function = 'UPD'.
  812.         ls_marm-material = <fs_marm_pi>-material.
  813.         ls_marm-alt_unit = <fs_marm_pi>-alt_unit.
  814.         APPEND ls_marm  TO lt_marm.

  815.         ls_marmx-function = 'UPD'.
  816.         ls_marmx-material = <fs_marm_pi>-material.
  817.         ls_marmx-alt_unit = <fs_marm_pi>-alt_unit.
  818.         APPEND ls_marmx TO lt_marmx.

  819.         pc_head-basic_view = 'X'.
  820.       ENDIF.
  821.     ELSE.
  822.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_marm_pi> ).
  823.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  824.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marm_pi> TO <fs_value_pi>.
  825.         IF sy-subrc = 0.
  826.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marm TO <fs_value_bp>.
  827.           IF sy-subrc = 0.
  828.             <fs_value_bp> = <fs_value_pi>.
  829.           ENDIF.
  830.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marmx TO <fs_value_bp>.
  831.           IF sy-subrc = 0.
  832.             <fs_value_bp> = 'X'.
  833.           ENDIF.
  834.         ENDIF.
  835.       ENDLOOP.

  836.       IF ls_marmx IS NOT INITIAL.
  837.         ls_marm-function = 'INS'.
  838.         ls_marm-material = <fs_marm_pi>-material.
  839.         ls_marm-alt_unit = <fs_marm_pi>-alt_unit.
  840.         APPEND ls_marm  TO lt_marm.

  841.         ls_marmx-function = 'INS'.
  842.         ls_marmx-material = <fs_marm_pi>-material.
  843.         ls_marmx-alt_unit = <fs_marm_pi>-alt_unit.
  844.         APPEND ls_marmx TO lt_marmx.

  845.         pc_head-basic_view = 'X'.
  846.       ENDIF.
  847.     ENDIF.
  848.   ENDLOOP.

  849. ENDFORM.
  850. *&---------------------------------------------------------------------*
  851. *& Form FRM_FILL_MLAN_DATA
  852. *&---------------------------------------------------------------------*
  853. *& text
  854. *&---------------------------------------------------------------------*
  855. *&      --> PT_MLAN
  856. *&      --> LT_MLAN
  857. *&      --> LV_MATNR
  858. *&---------------------------------------------------------------------*
  859. FORM frm_fill_mlan_data  TABLES   pt_mlan  STRUCTURE  zmms034
  860.                                   lt_mlan   STRUCTURE bapie1mlan
  861.                          USING    pi_matnr TYPE mara-matnr.
  862.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  863.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  864.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  865.                  <fs_value_db> TYPE any,
  866.                  <fs_value_bp> TYPE any,
  867.                  <fs_type>     TYPE any,
  868.                  <fs_comp>     TYPE abap_compdescr.
  869.   DATA:ls_mlan   TYPE bapie1mlan.

  870.   CLEAR:lt_mlan[].
  871.   LOOP AT pt_mlan ASSIGNING FIELD-SYMBOL(<fs_mlan>).
  872.     PERFORM frm_conversion_matnr_input CHANGING <fs_mlan>-material.
  873.   ENDLOOP.

  874.   SELECT matnr AS material,
  875.          aland AS depcountry,
  876.          taxm1 AS taxclass_1
  877.    FROM mlan
  878.    WHERE matnr = @pi_matnr
  879.   INTO TABLE @DATA(lt_mlan_db).

  880.   SORT lt_mlan_db BY material depcountry.
  881.   LOOP AT pt_mlan ASSIGNING FIELD-SYMBOL(<fs_mlan_pi>).
  882.     CLEAR:ls_mlan.
  883.     READ TABLE lt_mlan_db ASSIGNING FIELD-SYMBOL(<fs_mlan_db>) WITH KEY material = <fs_mlan_pi>-material depcountry = <fs_mlan_pi>-depcountry BINARY SEARCH.
  884.     IF sy-subrc = 0.
  885.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mlan_pi> ).
  886.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  887.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mlan_pi> TO <fs_value_pi>.
  888.         IF sy-subrc = 0.
  889.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mlan_db> TO <fs_value_db>.
  890.           IF sy-subrc = 0.
  891.             IF <fs_value_pi> NE <fs_value_db>.
  892.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mlan TO <fs_value_bp>.
  893.               IF sy-subrc = 0.
  894.                 <fs_value_bp> = <fs_value_pi>.
  895.               ENDIF.
  896.             ENDIF.
  897.           ENDIF.
  898.         ENDIF.
  899.       ENDLOOP.

  900.       IF ls_mlan IS NOT INITIAL.
  901.         ls_mlan-function = 'UPD'.
  902.         ls_mlan-material = <fs_mlan_pi>-material.
  903.         ls_mlan-depcountry = <fs_mlan_pi>-depcountry.
  904.         ls_mlan-tax_type_1 = <fs_mlan_pi>-tax_type_1.
  905.         APPEND ls_mlan  TO lt_mlan.
  906.       ENDIF.
  907.     ELSE.
  908.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mlan_pi> ).
  909.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  910.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mlan_pi> TO <fs_value_pi>.
  911.         IF sy-subrc = 0.
  912.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mlan TO <fs_value_bp>.
  913.           IF sy-subrc = 0.
  914.             <fs_value_bp> = <fs_value_pi>.
  915.           ENDIF.
  916.         ENDIF.
  917.       ENDLOOP.

  918.       IF ls_mlan IS NOT INITIAL.
  919.         ls_mlan-function = 'INS'.
  920.         ls_mlan-material = <fs_mlan_pi>-material.
  921.         ls_mlan-depcountry = <fs_mlan_pi>-depcountry.
  922.         ls_mlan-tax_type_1 = <fs_mlan_pi>-tax_type_1.
  923.         APPEND ls_mlan  TO lt_mlan.
  924.       ENDIF.
  925.     ENDIF.
  926.   ENDLOOP.

  927. ENDFORM.
  928. *&---------------------------------------------------------------------*
  929. *& Form FRM_FILL_MAKT_DATA
  930. *&---------------------------------------------------------------------*
  931. *& text
  932. *&---------------------------------------------------------------------*
  933. *&      --> PT_MAKT
  934. *&      --> LT_MAKT
  935. *&      --> LV_MATNR
  936. *&      <-- LS_HEAD
  937. *&---------------------------------------------------------------------*
  938. FORM frm_fill_makt_data  TABLES   pt_makt  STRUCTURE  zmms029
  939.                                   lt_makt   STRUCTURE bapie1makt
  940.                          USING    pi_matnr TYPE mara-matnr.
  941.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  942.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  943.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  944.                  <fs_value_db> TYPE any,
  945.                  <fs_value_bp> TYPE any,
  946.                  <fs_type>     TYPE any,
  947.                  <fs_comp>     TYPE abap_compdescr.
  948.   DATA:ls_makt   TYPE bapie1makt.

  949.   CLEAR:lt_makt[].
  950.   LOOP AT pt_makt ASSIGNING FIELD-SYMBOL(<fs_makt>).
  951.     PERFORM frm_conversion_matnr_input CHANGING <fs_makt>-material.
  952.     CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
  953.       EXPORTING
  954.         input            = <fs_makt>-langu
  955.       IMPORTING
  956.         output           = <fs_makt>-langu
  957.       EXCEPTIONS
  958.         unknown_language = 1
  959.         OTHERS           = 2.
  960.   ENDLOOP.

  961.   SELECT matnr AS material,
  962.          spras AS langu,
  963.          maktx AS matl_desc
  964.    FROM makt
  965.    WHERE matnr = @pi_matnr
  966.   INTO TABLE @DATA(lt_makt_db).

  967.   SORT lt_makt_db BY material langu.
  968.   LOOP AT pt_makt ASSIGNING FIELD-SYMBOL(<fs_makt_pi>).
  969.     CLEAR:ls_makt.
  970.     READ TABLE lt_makt_db ASSIGNING FIELD-SYMBOL(<fs_makt_db>) WITH KEY material = <fs_makt_pi>-material langu = <fs_makt_pi>-langu BINARY SEARCH.
  971.     IF sy-subrc = 0.
  972.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_makt_pi> ).
  973.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  974.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_makt_pi> TO <fs_value_pi>.
  975.         IF sy-subrc = 0.
  976.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_makt_db> TO <fs_value_db>.
  977.           IF sy-subrc = 0.
  978.             IF <fs_value_pi> NE <fs_value_db>.
  979.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_makt TO <fs_value_bp>.
  980.               IF sy-subrc = 0.
  981.                 <fs_value_bp> = <fs_value_pi>.
  982.               ENDIF.
  983.             ENDIF.
  984.           ENDIF.
  985.         ENDIF.
  986.       ENDLOOP.

  987.       IF ls_makt IS NOT INITIAL.
  988.         ls_makt-function = 'UPD'.
  989.         ls_makt-material = <fs_makt_pi>-material.
  990.         ls_makt-langu    = <fs_makt_pi>-langu.
  991.         APPEND ls_makt  TO lt_makt.
  992.       ENDIF.
  993.     ELSE.
  994.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_makt_pi> ).
  995.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  996.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_makt_pi> TO <fs_value_pi>.
  997.         IF sy-subrc = 0.
  998.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_makt TO <fs_value_bp>.
  999.           IF sy-subrc = 0.
  1000.             <fs_value_bp> = <fs_value_pi>.
  1001.           ENDIF.
  1002.         ENDIF.
  1003.       ENDLOOP.

  1004.       IF ls_makt IS NOT INITIAL.
  1005.         ls_makt-function = 'INS'.
  1006.         ls_makt-material = <fs_makt_pi>-material.
  1007.         ls_makt-langu    = <fs_makt_pi>-langu.
  1008.         APPEND ls_makt  TO lt_makt.
  1009.       ENDIF.
  1010.     ENDIF.
  1011.   ENDLOOP.


  1012. ENDFORM.
  1013. *&---------------------------------------------------------------------*
  1014. *& Form FRM_FILL_MLTX_DATA
  1015. *&---------------------------------------------------------------------*
  1016. *& text
  1017. *&---------------------------------------------------------------------*
  1018. *&      --> PT_MLTX
  1019. *&      --> LT_MLTX
  1020. *&---------------------------------------------------------------------*
  1021. FORM frm_fill_mltx_data  TABLES   pt_mltx        STRUCTURE        zmms036
  1022.                                   lt_mltx STRUCTURE bapie1mltx
  1023.                          USING    pi_matnr TYPE mara-matnr.
  1024.   DATA:lt_tline     TYPE TABLE OF tline WITH HEADER LINE.
  1025.   DATA:ls_mltx      TYPE bapie1mltx.
  1026.   DATA:lv_name      TYPE thead-tdname.

  1027.   CHECK pt_mltx[] IS NOT INITIAL.
  1028.   lv_name = pi_matnr.

  1029.   LOOP AT pt_mltx.
  1030.     CLEAR:ls_mltx.
  1031.     CALL FUNCTION 'READ_TEXT'
  1032.       EXPORTING
  1033.         client                  = sy-mandt
  1034.         id                      = 'GRUN'
  1035.         language                = pt_mltx-langu
  1036.         name                    = lv_name
  1037.         object                  = 'MATERIAL'
  1038.       TABLES
  1039.         lines                   = lt_tline
  1040.       EXCEPTIONS
  1041.         id                      = 1
  1042.         language                = 2
  1043.         name                    = 3
  1044.         not_found               = 4
  1045.         object                  = 5
  1046.         reference_check         = 6
  1047.         wrong_access_to_archive = 7
  1048.         OTHERS                  = 8.
  1049.     IF sy-subrc = 4.
  1050.       ls_mltx-function = 'INS'.
  1051.     ELSE.
  1052.       ls_mltx-function = 'UPD'.
  1053.     ENDIF.
  1054.     ls_mltx-material   = pi_matnr.
  1055.     ls_mltx-langu      = pt_mltx-langu.
  1056.     ls_mltx-applobject = 'MATERIAL'.
  1057.     ls_mltx-text_name  = lv_name.
  1058.     ls_mltx-text_id    = 'GRUN'.
  1059.     ls_mltx-format_col = pt_mltx-format_col.
  1060.     ls_mltx-text_line  = pt_mltx-text_line.
  1061.     APPEND ls_mltx TO lt_mltx.
  1062.   ENDLOOP.

  1063. ENDFORM.
  1064. *&---------------------------------------------------------------------*
  1065. *& Form FRM_CONVERSION_CUNIT_INPUT
  1066. *&---------------------------------------------------------------------*
  1067. *& text
  1068. *&---------------------------------------------------------------------*
  1069. *&      <-- <FS_MARA>_BASE_UOM
  1070. *&---------------------------------------------------------------------*
  1071. FORM frm_conversion_cunit_input  CHANGING pc_cunit.

  1072.   CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
  1073.     EXPORTING
  1074.       input          = pc_cunit
  1075.       language       = sy-langu
  1076.     IMPORTING
  1077.       output         = pc_cunit
  1078.     EXCEPTIONS
  1079.       unit_not_found = 1
  1080.       OTHERS         = 2.

  1081. ENDFORM.
复制代码

回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表