二维码

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

Twilight发表于 2026-05-08 16:48Twilight 最后回复于 2026-05-08 16:48 [复制链接] 501 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 = 'KP'.
  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.         IF ls_marc-availcheck IS NOT INITIAL.
  385.           pc_head-sales_view = 'X'.
  386.         ENDIF.
  387.         pc_head-work_sched_view = 'X'.
  388.         IF ls_marc-lot_size IS NOT INITIAL.
  389.           pc_head-cost_view = 'X'.
  390.         ENDIF.
  391.       ENDIF.
  392.     ELSE.
  393.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_marc_pi> ).
  394.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  395.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marc_pi> TO <fs_value_pi>.
  396.         IF sy-subrc = 0.
  397.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marc TO <fs_value_bp>.
  398.           IF sy-subrc = 0.
  399.             <fs_value_bp> = <fs_value_pi>.
  400.           ENDIF.
  401.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marcx TO <fs_value_bp>.
  402.           IF sy-subrc = 0.
  403.             <fs_value_bp> = 'X'.
  404.           ENDIF.
  405.         ENDIF.
  406.       ENDLOOP.

  407.       IF ls_marcx IS NOT INITIAL.
  408.         ls_marc-function = 'INS'.
  409.         ls_marc-material = <fs_marc_pi>-material.
  410.         ls_marc-plant    = <fs_marc_pi>-plant.
  411.         APPEND ls_marc  TO lt_marc.

  412.         ls_marcx-function = 'INS'.
  413.         ls_marcx-material = <fs_marc_pi>-material.
  414.         ls_marcx-plant    = <fs_marc_pi>-plant.
  415.         APPEND ls_marcx TO lt_marcx.

  416.         pc_head-storage_view = 'X'.
  417.         IF ls_marc-proc_type = 'F' OR ls_marc-proc_type = 'X'."F 外部采购,X 两种采购类型
  418.           pc_head-purchase_view = 'X'.
  419.         ENDIF.
  420.         IF ls_marc-proc_type NE ''."采购和生产 都要扩MRP视图
  421.           pc_head-mrp_view = 'X'.
  422.         ENDIF.
  423.         IF ls_marc-availcheck IS NOT INITIAL.
  424.           pc_head-sales_view = 'X'.
  425.         ENDIF.
  426.         pc_head-work_sched_view = 'X'.
  427.         IF ls_marc-lot_size IS NOT INITIAL.
  428.           pc_head-cost_view = 'X'.
  429.         ENDIF.
  430.       ENDIF.
  431.     ENDIF.
  432.   ENDLOOP.

  433. ENDFORM.
  434. *&---------------------------------------------------------------------*
  435. *& Form FRM_FILL_MARD_DATA
  436. *&---------------------------------------------------------------------*
  437. *& text
  438. *&---------------------------------------------------------------------*
  439. *&      --> PT_MARD
  440. *&      --> LT_MARD
  441. *&      --> LT_MARDX
  442. *&      --> LV_MATNR
  443. *&      <-- LS_HEAD
  444. *&---------------------------------------------------------------------*
  445. FORM frm_fill_mard_data  TABLES   pt_mard  STRUCTURE  zmms030
  446.                                   lt_mard   STRUCTURE bapie1mard
  447.                                   lt_mardx  STRUCTURE bapie1mardx
  448.                          USING    pi_matnr TYPE mara-matnr
  449.                          CHANGING pc_head  TYPE bapie1matheader.
  450.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  451.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  452.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  453.                  <fs_value_db> TYPE any,
  454.                  <fs_value_bp> TYPE any,
  455.                  <fs_type>     TYPE any,
  456.                  <fs_comp>     TYPE abap_compdescr.
  457.   DATA:ls_mard   TYPE bapie1mard.
  458.   DATA:ls_mardx  TYPE bapie1mardx.

  459.   CLEAR:lt_mard[],lt_mardx[].
  460.   LOOP AT pt_mard ASSIGNING FIELD-SYMBOL(<fs_mard>).
  461.     PERFORM frm_conversion_matnr_input CHANGING <fs_mard>-material.
  462.   ENDLOOP.

  463.   SELECT matnr AS material,
  464.          werks AS plant,
  465.          lgort AS stge_loc,
  466.          lgpbe AS stge_bin
  467.    FROM mard
  468.    WHERE matnr = @pi_matnr
  469.   INTO TABLE @DATA(lt_mard_db).

  470.   SORT lt_mard_db BY material plant stge_loc.
  471.   LOOP AT pt_mard ASSIGNING FIELD-SYMBOL(<fs_mard_pi>).
  472.     CLEAR:ls_mard,ls_mardx.
  473.     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.
  474.     IF sy-subrc = 0.
  475.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mard_pi> ).
  476.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  477.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mard_pi> TO <fs_value_pi>.
  478.         IF sy-subrc = 0.
  479.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mard_db> TO <fs_value_db>.
  480.           IF sy-subrc = 0.
  481.             IF <fs_value_pi> NE <fs_value_db>.
  482.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mard TO <fs_value_bp>.
  483.               IF sy-subrc = 0.
  484.                 <fs_value_bp> = <fs_value_pi>.
  485.               ENDIF.
  486.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mardx TO <fs_value_bp>.
  487.               IF sy-subrc = 0.
  488.                 <fs_value_bp> = 'X'.
  489.               ENDIF.
  490.             ENDIF.
  491.           ENDIF.
  492.         ENDIF.
  493.       ENDLOOP.

  494.       IF ls_mardx IS NOT INITIAL.
  495.         ls_mard-function = 'UPD'.
  496.         ls_mard-material = <fs_mard_pi>-material.
  497.         ls_mard-plant    = <fs_mard_pi>-plant.
  498.         ls_mard-stge_loc = <fs_mard_pi>-stge_loc.
  499.         APPEND ls_mard  TO lt_mard.

  500.         ls_mardx-function = 'UPD'.
  501.         ls_mardx-material = <fs_mard_pi>-material.
  502.         ls_mardx-plant    = <fs_mard_pi>-plant.
  503.         ls_mardx-stge_loc = <fs_mard_pi>-stge_loc.
  504.         APPEND ls_mardx TO lt_mardx.

  505.         pc_head-storage_view = 'X'.
  506.       ENDIF.
  507.     ELSE.
  508.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mard_pi> ).
  509.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  510.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mard_pi> TO <fs_value_pi>.
  511.         IF sy-subrc = 0.
  512.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mard TO <fs_value_bp>.
  513.           IF sy-subrc = 0.
  514.             <fs_value_bp> = <fs_value_pi>.
  515.           ENDIF.
  516.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mardx TO <fs_value_bp>.
  517.           IF sy-subrc = 0.
  518.             <fs_value_bp> = 'X'.
  519.           ENDIF.
  520.         ENDIF.
  521.       ENDLOOP.

  522.       IF ls_mardx IS NOT INITIAL.
  523.         ls_mard-function = 'INS'.
  524.         ls_mard-material = <fs_mard_pi>-material.
  525.         ls_mard-plant    = <fs_mard_pi>-plant.
  526.         ls_mard-stge_loc = <fs_mard_pi>-stge_loc.
  527.         APPEND ls_mard  TO lt_mard.

  528.         ls_mardx-function = 'INS'.
  529.         ls_mardx-material = <fs_mard_pi>-material.
  530.         ls_mardx-plant    = <fs_mard_pi>-plant.
  531.         ls_mardx-stge_loc = <fs_mard_pi>-stge_loc.
  532.         APPEND ls_mardx TO lt_mardx.

  533.         pc_head-storage_view = 'X'.
  534.       ENDIF.
  535.     ENDIF.
  536.   ENDLOOP.
  537. ENDFORM.
  538. *&---------------------------------------------------------------------*
  539. *& Form FRM_FILL_MBEW_DATA
  540. *&---------------------------------------------------------------------*
  541. *& text
  542. *&---------------------------------------------------------------------*
  543. *&      --> PT_MBEW
  544. *&      --> LT_MBEW
  545. *&      --> LT_MBEWX
  546. *&      --> LV_MATNR
  547. *&      <-- LS_HEAD
  548. *&---------------------------------------------------------------------*
  549. FORM frm_fill_mbew_data  TABLES   pt_mbew  STRUCTURE  zmms033
  550.                                   lt_mbew   STRUCTURE bapie1mbew
  551.                                   lt_mbewx  STRUCTURE bapie1mbewx
  552.                          USING    pi_matnr TYPE mara-matnr
  553.                          CHANGING pc_head  TYPE bapie1matheader.
  554.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  555.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  556.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  557.                  <fs_value_db> TYPE any,
  558.                  <fs_value_bp> TYPE any,
  559.                  <fs_type>     TYPE any,
  560.                  <fs_comp>     TYPE abap_compdescr.
  561.   DATA:ls_mbew   TYPE bapie1mbew.
  562.   DATA:ls_mbewx  TYPE bapie1mbewx.

  563.   CLEAR:lt_mbew[],lt_mbewx[].
  564.   LOOP AT pt_mbew ASSIGNING FIELD-SYMBOL(<fs_mbew>).
  565.     PERFORM frm_conversion_matnr_input CHANGING <fs_mbew>-material.
  566.   ENDLOOP.

  567.   SELECT matnr AS material,
  568.          bwkey AS val_area,
  569.          bklas AS val_class,
  570.          vprsv AS price_ctrl,
  571.          mlast AS ml_settle,
  572.          ekalr AS qty_struct,
  573.          hkmat AS orig_mat
  574.    FROM mbew
  575.    WHERE matnr = @pi_matnr
  576.   INTO TABLE @DATA(lt_mbew_db).

  577.   SORT lt_mbew_db BY material val_area.
  578.   LOOP AT pt_mbew ASSIGNING FIELD-SYMBOL(<fs_mbew_pi>).
  579.     CLEAR:ls_mbew,ls_mbewx.
  580.     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.
  581.     IF sy-subrc = 0.
  582.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mbew_pi> ).
  583.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  584.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mbew_pi> TO <fs_value_pi>.
  585.         IF sy-subrc = 0.
  586.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mbew_db> TO <fs_value_db>.
  587.           IF sy-subrc = 0.
  588.             IF <fs_value_pi> NE <fs_value_db>.
  589.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbew TO <fs_value_bp>.
  590.               IF sy-subrc = 0.
  591.                 <fs_value_bp> = <fs_value_pi>.
  592.               ENDIF.
  593.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbewx TO <fs_value_bp>.
  594.               IF sy-subrc = 0.
  595.                 <fs_value_bp> = 'X'.
  596.               ENDIF.
  597.             ENDIF.
  598.           ENDIF.
  599.         ENDIF.
  600.       ENDLOOP.

  601.       IF ls_mbewx IS NOT INITIAL.
  602.         ls_mbew-function = 'UPD'.
  603.         ls_mbew-material = <fs_mbew_pi>-material.
  604.         ls_mbew-val_area = <fs_mbew_pi>-val_area.
  605.         APPEND ls_mbew  TO lt_mbew.

  606.         ls_mbewx-function = 'UPD'.
  607.         ls_mbewx-material = <fs_mbew_pi>-material.
  608.         ls_mbewx-val_area = <fs_mbew_pi>-val_area.
  609.         APPEND ls_mbewx TO lt_mbewx.

  610.         pc_head-account_view = 'X'.
  611.       ENDIF.
  612.     ELSE.
  613.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mbew_pi> ).
  614.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  615.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mbew_pi> TO <fs_value_pi>.
  616.         IF sy-subrc = 0.
  617.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbew TO <fs_value_bp>.
  618.           IF sy-subrc = 0.
  619.             <fs_value_bp> = <fs_value_pi>.
  620.           ENDIF.
  621.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mbewx TO <fs_value_bp>.
  622.           IF sy-subrc = 0.
  623.             <fs_value_bp> = 'X'.
  624.           ENDIF.
  625.         ENDIF.
  626.       ENDLOOP.

  627.       IF ls_mbewx IS NOT INITIAL.
  628.         ls_mbew-function = 'INS'.
  629.         ls_mbew-material = <fs_mbew_pi>-material.
  630.         ls_mbew-val_area = <fs_mbew_pi>-val_area.
  631.         APPEND ls_mbew  TO lt_mbew.

  632.         ls_mbewx-function = 'INS'.
  633.         ls_mbewx-material = <fs_mbew_pi>-material.
  634.         ls_mbewx-val_area = <fs_mbew_pi>-val_area.
  635.         APPEND ls_mbewx TO lt_mbewx.

  636.         pc_head-account_view = 'X'.
  637.       ENDIF.
  638.     ENDIF.
  639.   ENDLOOP.

  640. ENDFORM.
  641. *&---------------------------------------------------------------------*
  642. *& Form FRM_FILL_MVKE_DATA
  643. *&---------------------------------------------------------------------*
  644. *& text
  645. *&---------------------------------------------------------------------*
  646. *&      --> PT_MVKE
  647. *&      --> LT_MVKE
  648. *&      --> LT_MVKEX
  649. *&      --> LV_MATNR
  650. *&      <-- LS_HEAD
  651. *&---------------------------------------------------------------------*
  652. FORM frm_fill_mvke_data  TABLES   pt_mvke  STRUCTURE  zmms035
  653.                                   lt_mvke   STRUCTURE bapie1mvke
  654.                                   lt_mvkex  STRUCTURE bapie1mvkex
  655.                          USING    pi_matnr TYPE mara-matnr
  656.                          CHANGING pc_head  TYPE bapie1matheader.
  657.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  658.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  659.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  660.                  <fs_value_db> TYPE any,
  661.                  <fs_value_bp> TYPE any,
  662.                  <fs_type>     TYPE any,
  663.                  <fs_comp>     TYPE abap_compdescr.
  664.   DATA:ls_mvke   TYPE bapie1mvke.
  665.   DATA:ls_mvkex  TYPE bapie1mvkex.

  666.   CLEAR:lt_mvke[],lt_mvkex[].
  667.   LOOP AT pt_mvke ASSIGNING FIELD-SYMBOL(<fs_mvke>).
  668.     PERFORM frm_conversion_matnr_input CHANGING <fs_mvke>-material.
  669.     PERFORM frm_conversion_cunit_input CHANGING <fs_mvke>-sales_unit.
  670.   ENDLOOP.

  671.   SELECT matnr AS material,
  672.          vkorg AS sales_org,
  673.          vtweg AS distr_chan,
  674.          vrkme AS sales_unit,
  675.          vmsta AS sal_status,
  676.          vmstd AS valid_from,
  677.          dwerk AS delyg_plnt,
  678.          versg AS matl_stats,
  679.          ktgrm AS acct_assgt,
  680.          mtpos AS item_cat,
  681.          mvgr1 AS matl_grp_1,
  682.          mvgr2 AS matl_grp_2,
  683.          prodh AS prod_hier
  684.    FROM mvke
  685.    WHERE matnr = @pi_matnr
  686.   INTO TABLE @DATA(lt_mvke_db).

  687.   SORT lt_mvke_db BY material sales_org distr_chan.
  688.   LOOP AT pt_mvke ASSIGNING FIELD-SYMBOL(<fs_mvke_pi>).
  689.     CLEAR:ls_mvke,ls_mvkex.
  690.     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.
  691.     IF sy-subrc = 0.
  692.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mvke_pi> ).
  693.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  694.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mvke_pi> TO <fs_value_pi>.
  695.         IF sy-subrc = 0.
  696.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mvke_db> TO <fs_value_db>.
  697.           IF sy-subrc = 0.
  698.             IF <fs_value_pi> NE <fs_value_db>.
  699.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvke TO <fs_value_bp>.
  700.               IF sy-subrc = 0.
  701.                 <fs_value_bp> = <fs_value_pi>.
  702.               ENDIF.
  703.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvkex TO <fs_value_bp>.
  704.               IF sy-subrc = 0.
  705.                 <fs_value_bp> = 'X'.
  706.               ENDIF.
  707.             ENDIF.
  708.           ENDIF.
  709.         ENDIF.
  710.       ENDLOOP.

  711.       IF ls_mvkex IS NOT INITIAL.
  712.         ls_mvke-function = 'UPD'.
  713.         ls_mvke-material = <fs_mvke_pi>-material.
  714.         ls_mvke-sales_org  = <fs_mvke_pi>-sales_org.
  715.         ls_mvke-distr_chan = <fs_mvke_pi>-distr_chan.
  716.         APPEND ls_mvke  TO lt_mvke.

  717.         ls_mvkex-function = 'UPD'.
  718.         ls_mvkex-material = <fs_mvke_pi>-material.
  719.         ls_mvkex-sales_org  = <fs_mvke_pi>-sales_org.
  720.         ls_mvkex-distr_chan = <fs_mvke_pi>-distr_chan.
  721.         APPEND ls_mvkex TO lt_mvkex.

  722.         pc_head-sales_view = 'X'.
  723.       ENDIF.
  724.     ELSE.
  725.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mvke_pi> ).
  726.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  727.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mvke_pi> TO <fs_value_pi>.
  728.         IF sy-subrc = 0.
  729.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvke TO <fs_value_bp>.
  730.           IF sy-subrc = 0.
  731.             <fs_value_bp> = <fs_value_pi>.
  732.           ENDIF.
  733.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mvkex TO <fs_value_bp>.
  734.           IF sy-subrc = 0.
  735.             <fs_value_bp> = 'X'.
  736.           ENDIF.
  737.         ENDIF.
  738.       ENDLOOP.

  739.       IF ls_mvkex IS NOT INITIAL.
  740.         ls_mvke-function = 'INS'.
  741.         ls_mvke-material = <fs_mvke_pi>-material.
  742.         ls_mvke-sales_org  = <fs_mvke_pi>-sales_org.
  743.         ls_mvke-distr_chan = <fs_mvke_pi>-distr_chan.
  744.         APPEND ls_mvke  TO lt_mvke.

  745.         ls_mvkex-function = 'INS'.
  746.         ls_mvkex-material = <fs_mvke_pi>-material.
  747.         ls_mvkex-sales_org  = <fs_mvke_pi>-sales_org.
  748.         ls_mvkex-distr_chan = <fs_mvke_pi>-distr_chan.
  749.         APPEND ls_mvkex TO lt_mvkex.

  750.         pc_head-sales_view = 'X'.
  751.       ENDIF.
  752.     ENDIF.
  753.   ENDLOOP.

  754. ENDFORM.
  755. *&---------------------------------------------------------------------*
  756. *& Form FRM_FILL_MARM_DATA
  757. *&---------------------------------------------------------------------*
  758. *& text
  759. *&---------------------------------------------------------------------*
  760. *&      --> PT_MARM
  761. *&      --> LT_MARM
  762. *&      --> LT_MARMX
  763. *&      --> LV_MATNR
  764. *&      <-- LS_HEAD
  765. *&---------------------------------------------------------------------*
  766. FORM frm_fill_marm_data  TABLES   pt_marm  STRUCTURE  zmms032
  767.                                   lt_marm   STRUCTURE bapie1marm
  768.                                   lt_marmx  STRUCTURE bapie1marmx
  769.                          USING    pi_matnr TYPE mara-matnr
  770.                          CHANGING pc_head  TYPE bapie1matheader.
  771.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  772.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  773.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  774.                  <fs_value_db> TYPE any,
  775.                  <fs_value_bp> TYPE any,
  776.                  <fs_type>     TYPE any,
  777.                  <fs_comp>     TYPE abap_compdescr.
  778.   DATA:ls_marm   TYPE bapie1marm.
  779.   DATA:ls_marmx  TYPE bapie1marmx.

  780.   CLEAR:lt_marm[],lt_marmx[].
  781.   LOOP AT pt_marm ASSIGNING FIELD-SYMBOL(<fs_marm>).
  782.     PERFORM frm_conversion_matnr_input CHANGING <fs_marm>-material.
  783.     PERFORM frm_conversion_cunit_input CHANGING <fs_marm>-alt_unit.
  784.     PERFORM frm_conversion_cunit_input CHANGING <fs_marm>-unit_of_wt.
  785.     PERFORM frm_conversion_cunit_input CHANGING <fs_marm>-volumeunit.
  786.   ENDLOOP.

  787.   SELECT matnr AS material,
  788.          meinh AS alt_unit,
  789.          umrez AS numerator,
  790.          umren AS denominatr,
  791.          brgew AS gross_wt,
  792.          gewei AS unit_of_wt,
  793.          volum AS volume,
  794.          voleh AS volumeunit
  795.    FROM marm
  796.    WHERE matnr = @pi_matnr
  797.   INTO TABLE @DATA(lt_marm_db).

  798.   SORT lt_marm_db BY material alt_unit.
  799.   LOOP AT pt_marm ASSIGNING FIELD-SYMBOL(<fs_marm_pi>).
  800.     CLEAR:ls_marm,ls_marmx.
  801.     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.
  802.     IF sy-subrc = 0.
  803.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_marm_pi> ).
  804.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  805.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marm_pi> TO <fs_value_pi>.
  806.         IF sy-subrc = 0.
  807.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marm_db> TO <fs_value_db>.
  808.           IF sy-subrc = 0.
  809.             IF <fs_value_pi> NE <fs_value_db>.
  810.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marm TO <fs_value_bp>.
  811.               IF sy-subrc = 0.
  812.                 <fs_value_bp> = <fs_value_pi>.
  813.               ENDIF.
  814.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marmx TO <fs_value_bp>.
  815.               IF sy-subrc = 0.
  816.                 <fs_value_bp> = 'X'.
  817.               ENDIF.
  818.             ENDIF.
  819.           ENDIF.
  820.         ENDIF.
  821.       ENDLOOP.

  822.       IF ls_marmx IS NOT INITIAL.
  823.         ls_marm-function = 'UPD'.
  824.         ls_marm-material = <fs_marm_pi>-material.
  825.         ls_marm-alt_unit = <fs_marm_pi>-alt_unit.
  826.         APPEND ls_marm  TO lt_marm.

  827.         ls_marmx-function = 'UPD'.
  828.         ls_marmx-material = <fs_marm_pi>-material.
  829.         ls_marmx-alt_unit = <fs_marm_pi>-alt_unit.
  830.         APPEND ls_marmx TO lt_marmx.

  831.         pc_head-basic_view = 'X'.
  832.       ENDIF.
  833.     ELSE.
  834.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_marm_pi> ).
  835.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  836.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_marm_pi> TO <fs_value_pi>.
  837.         IF sy-subrc = 0.
  838.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marm TO <fs_value_bp>.
  839.           IF sy-subrc = 0.
  840.             <fs_value_bp> = <fs_value_pi>.
  841.           ENDIF.
  842.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_marmx TO <fs_value_bp>.
  843.           IF sy-subrc = 0.
  844.             <fs_value_bp> = 'X'.
  845.           ENDIF.
  846.         ENDIF.
  847.       ENDLOOP.

  848.       IF ls_marmx IS NOT INITIAL.
  849.         ls_marm-function = 'INS'.
  850.         ls_marm-material = <fs_marm_pi>-material.
  851.         ls_marm-alt_unit = <fs_marm_pi>-alt_unit.
  852.         APPEND ls_marm  TO lt_marm.

  853.         ls_marmx-function = 'INS'.
  854.         ls_marmx-material = <fs_marm_pi>-material.
  855.         ls_marmx-alt_unit = <fs_marm_pi>-alt_unit.
  856.         APPEND ls_marmx TO lt_marmx.

  857.         pc_head-basic_view = 'X'.
  858.       ENDIF.
  859.     ENDIF.
  860.   ENDLOOP.

  861. ENDFORM.
  862. *&---------------------------------------------------------------------*
  863. *& Form FRM_FILL_MLAN_DATA
  864. *&---------------------------------------------------------------------*
  865. *& text
  866. *&---------------------------------------------------------------------*
  867. *&      --> PT_MLAN
  868. *&      --> LT_MLAN
  869. *&      --> LV_MATNR
  870. *&---------------------------------------------------------------------*
  871. FORM frm_fill_mlan_data  TABLES   pt_mlan  STRUCTURE  zmms034
  872.                                   lt_mlan   STRUCTURE bapie1mlan
  873.                          USING    pi_matnr TYPE mara-matnr.
  874.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  875.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  876.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  877.                  <fs_value_db> TYPE any,
  878.                  <fs_value_bp> TYPE any,
  879.                  <fs_type>     TYPE any,
  880.                  <fs_comp>     TYPE abap_compdescr.
  881.   DATA:ls_mlan   TYPE bapie1mlan.

  882.   CLEAR:lt_mlan[].
  883.   LOOP AT pt_mlan ASSIGNING FIELD-SYMBOL(<fs_mlan>).
  884.     PERFORM frm_conversion_matnr_input CHANGING <fs_mlan>-material.
  885.   ENDLOOP.

  886.   SELECT matnr AS material,
  887.          aland AS depcountry,
  888.          taxm1 AS taxclass_1
  889.    FROM mlan
  890.    WHERE matnr = @pi_matnr
  891.   INTO TABLE @DATA(lt_mlan_db).

  892.   SORT lt_mlan_db BY material depcountry.
  893.   LOOP AT pt_mlan ASSIGNING FIELD-SYMBOL(<fs_mlan_pi>).
  894.     CLEAR:ls_mlan.
  895.     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.
  896.     IF sy-subrc = 0.
  897.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mlan_pi> ).
  898.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  899.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mlan_pi> TO <fs_value_pi>.
  900.         IF sy-subrc = 0.
  901.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mlan_db> TO <fs_value_db>.
  902.           IF sy-subrc = 0.
  903.             IF <fs_value_pi> NE <fs_value_db>.
  904.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mlan TO <fs_value_bp>.
  905.               IF sy-subrc = 0.
  906.                 <fs_value_bp> = <fs_value_pi>.
  907.               ENDIF.
  908.             ENDIF.
  909.           ENDIF.
  910.         ENDIF.
  911.       ENDLOOP.

  912.       IF ls_mlan IS NOT INITIAL.
  913.         ls_mlan-function = 'UPD'.
  914.         ls_mlan-material = <fs_mlan_pi>-material.
  915.         ls_mlan-depcountry = <fs_mlan_pi>-depcountry.
  916.         ls_mlan-tax_type_1 = <fs_mlan_pi>-tax_type_1.
  917.         APPEND ls_mlan  TO lt_mlan.
  918.       ENDIF.
  919.     ELSE.
  920.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_mlan_pi> ).
  921.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  922.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_mlan_pi> TO <fs_value_pi>.
  923.         IF sy-subrc = 0.
  924.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_mlan TO <fs_value_bp>.
  925.           IF sy-subrc = 0.
  926.             <fs_value_bp> = <fs_value_pi>.
  927.           ENDIF.
  928.         ENDIF.
  929.       ENDLOOP.

  930.       IF ls_mlan IS NOT INITIAL.
  931.         ls_mlan-function = 'INS'.
  932.         ls_mlan-material = <fs_mlan_pi>-material.
  933.         ls_mlan-depcountry = <fs_mlan_pi>-depcountry.
  934.         ls_mlan-tax_type_1 = <fs_mlan_pi>-tax_type_1.
  935.         APPEND ls_mlan  TO lt_mlan.
  936.       ENDIF.
  937.     ENDIF.
  938.   ENDLOOP.

  939. ENDFORM.
  940. *&---------------------------------------------------------------------*
  941. *& Form FRM_FILL_MAKT_DATA
  942. *&---------------------------------------------------------------------*
  943. *& text
  944. *&---------------------------------------------------------------------*
  945. *&      --> PT_MAKT
  946. *&      --> LT_MAKT
  947. *&      --> LV_MATNR
  948. *&      <-- LS_HEAD
  949. *&---------------------------------------------------------------------*
  950. FORM frm_fill_makt_data  TABLES   pt_makt  STRUCTURE  zmms029
  951.                                   lt_makt   STRUCTURE bapie1makt
  952.                          USING    pi_matnr TYPE mara-matnr.
  953.   DATA:cl_descr_ref TYPE REF TO cl_abap_structdescr,
  954.        cl_elemdescr TYPE REF TO cl_abap_elemdescr.
  955.   FIELD-SYMBOLS: <fs_value_pi> TYPE any,
  956.                  <fs_value_db> TYPE any,
  957.                  <fs_value_bp> TYPE any,
  958.                  <fs_type>     TYPE any,
  959.                  <fs_comp>     TYPE abap_compdescr.
  960.   DATA:ls_makt   TYPE bapie1makt.

  961.   CLEAR:lt_makt[].
  962.   LOOP AT pt_makt ASSIGNING FIELD-SYMBOL(<fs_makt>).
  963.     PERFORM frm_conversion_matnr_input CHANGING <fs_makt>-material.
  964.     CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
  965.       EXPORTING
  966.         input            = <fs_makt>-langu
  967.       IMPORTING
  968.         output           = <fs_makt>-langu
  969.       EXCEPTIONS
  970.         unknown_language = 1
  971.         OTHERS           = 2.
  972.   ENDLOOP.

  973.   SELECT matnr AS material,
  974.          spras AS langu,
  975.          maktx AS matl_desc
  976.    FROM makt
  977.    WHERE matnr = @pi_matnr
  978.   INTO TABLE @DATA(lt_makt_db).

  979.   SORT lt_makt_db BY material langu.
  980.   LOOP AT pt_makt ASSIGNING FIELD-SYMBOL(<fs_makt_pi>).
  981.     CLEAR:ls_makt.
  982.     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.
  983.     IF sy-subrc = 0.
  984.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_makt_pi> ).
  985.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  986.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_makt_pi> TO <fs_value_pi>.
  987.         IF sy-subrc = 0.
  988.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_makt_db> TO <fs_value_db>.
  989.           IF sy-subrc = 0.
  990.             IF <fs_value_pi> NE <fs_value_db>.
  991.               ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_makt TO <fs_value_bp>.
  992.               IF sy-subrc = 0.
  993.                 <fs_value_bp> = <fs_value_pi>.
  994.               ENDIF.
  995.             ENDIF.
  996.           ENDIF.
  997.         ENDIF.
  998.       ENDLOOP.

  999.       IF ls_makt IS NOT INITIAL.
  1000.         ls_makt-function = 'UPD'.
  1001.         ls_makt-material = <fs_makt_pi>-material.
  1002.         ls_makt-langu    = <fs_makt_pi>-langu.
  1003.         APPEND ls_makt  TO lt_makt.
  1004.       ENDIF.
  1005.     ELSE.
  1006.       cl_descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_makt_pi> ).
  1007.       LOOP AT cl_descr_ref->components ASSIGNING <fs_comp>.
  1008.         ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_makt_pi> TO <fs_value_pi>.
  1009.         IF sy-subrc = 0.
  1010.           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE ls_makt TO <fs_value_bp>.
  1011.           IF sy-subrc = 0.
  1012.             <fs_value_bp> = <fs_value_pi>.
  1013.           ENDIF.
  1014.         ENDIF.
  1015.       ENDLOOP.

  1016.       IF ls_makt IS NOT INITIAL.
  1017.         ls_makt-function = 'INS'.
  1018.         ls_makt-material = <fs_makt_pi>-material.
  1019.         ls_makt-langu    = <fs_makt_pi>-langu.
  1020.         APPEND ls_makt  TO lt_makt.
  1021.       ENDIF.
  1022.     ENDIF.
  1023.   ENDLOOP.


  1024. ENDFORM.
  1025. *&---------------------------------------------------------------------*
  1026. *& Form FRM_FILL_MLTX_DATA
  1027. *&---------------------------------------------------------------------*
  1028. *& text
  1029. *&---------------------------------------------------------------------*
  1030. *&      --> PT_MLTX
  1031. *&      --> LT_MLTX
  1032. *&---------------------------------------------------------------------*
  1033. FORM frm_fill_mltx_data  TABLES   pt_mltx        STRUCTURE        zmms036
  1034.                                   lt_mltx STRUCTURE bapie1mltx
  1035.                          USING    pi_matnr TYPE mara-matnr.
  1036.   DATA:lt_tline     TYPE TABLE OF tline WITH HEADER LINE.
  1037.   DATA:ls_mltx      TYPE bapie1mltx.
  1038.   DATA:lv_name      TYPE thead-tdname.

  1039.   CHECK pt_mltx[] IS NOT INITIAL.
  1040.   lv_name = pi_matnr.

  1041.   LOOP AT pt_mltx.
  1042.     CLEAR:ls_mltx.
  1043.     CALL FUNCTION 'READ_TEXT'
  1044.       EXPORTING
  1045.         client                  = sy-mandt
  1046.         id                      = 'GRUN'
  1047.         language                = pt_mltx-langu
  1048.         name                    = lv_name
  1049.         object                  = 'MATERIAL'
  1050.       TABLES
  1051.         lines                   = lt_tline
  1052.       EXCEPTIONS
  1053.         id                      = 1
  1054.         language                = 2
  1055.         name                    = 3
  1056.         not_found               = 4
  1057.         object                  = 5
  1058.         reference_check         = 6
  1059.         wrong_access_to_archive = 7
  1060.         OTHERS                  = 8.
  1061.     IF sy-subrc = 4.
  1062.       ls_mltx-function = 'INS'.
  1063.     ELSE.
  1064.       ls_mltx-function = 'UPD'.
  1065.     ENDIF.
  1066.     ls_mltx-material   = pi_matnr.
  1067.     ls_mltx-langu      = pt_mltx-langu.
  1068.     ls_mltx-applobject = 'MATERIAL'.
  1069.     ls_mltx-text_name  = lv_name.
  1070.     ls_mltx-text_id    = 'GRUN'.
  1071.     ls_mltx-format_col = pt_mltx-format_col.
  1072.     ls_mltx-text_line  = pt_mltx-text_line.
  1073.     APPEND ls_mltx TO lt_mltx.
  1074.   ENDLOOP.

  1075. ENDFORM.
  1076. *&---------------------------------------------------------------------*
  1077. *& Form FRM_CONVERSION_CUNIT_INPUT
  1078. *&---------------------------------------------------------------------*
  1079. *& text
  1080. *&---------------------------------------------------------------------*
  1081. *&      <-- <FS_MARA>_BASE_UOM
  1082. *&---------------------------------------------------------------------*
  1083. FORM frm_conversion_cunit_input  CHANGING pc_cunit.

  1084.   CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
  1085.     EXPORTING
  1086.       input          = pc_cunit
  1087.       language       = sy-langu
  1088.     IMPORTING
  1089.       output         = pc_cunit
  1090.     EXCEPTIONS
  1091.       unit_not_found = 1
  1092.       OTHERS         = 2.

  1093. ENDFORM.
复制代码
回复

使用道具 举报

快速回帖

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

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