创建工单按导入组件创建

 

*&---------------------------------------------------------------------*
*& Report ZPPR0047
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr0047.
TABLES:sscrfields,icon,rlgrap.

DATA:gt_fieldcat TYPE lvc_t_fcat,
     gw_fieldcat TYPE lvc_s_fcat,
     gv_repid    TYPE sy-repid,
     gs_layout   TYPE lvc_s_layo,
     gt_sort     TYPE lvc_t_sort,
     gw_sort     TYPE lvc_s_sort.

TYPES:BEGIN OF tys_out,
        zgdbs      TYPE numc5,
        matnr      TYPE matnr,
        maktx      TYPE maktx,
        werks      TYPE werks_d,
        lgort      TYPE lgort_d,
        pwerk      TYPE co_pwerk,
        gamng      TYPE menge_d,
        gltrp      TYPE afko-gltrp,
        gstrp      TYPE afko-gstrp,
        posnr      TYPE posnr,
        idnrk      TYPE matnr,
        idnrk_txt  TYPE maktx,
        menge      TYPE menge_d,
        werks_zj   TYPE werks_d,
        lgort_zj   TYPE lgort_d,
        bapi_mtype TYPE bapi_mtype,
        bapi_msg   TYPE bapi_msg,
        aufnr      TYPE aufnr,
        sel(1),
      END OF tys_out.
DATA:gt_out TYPE TABLE OF tys_out,
     gw_out LIKE LINE OF gt_out.

TYPES:BEGIN OF tys_item,
        idnrk     TYPE matnr,
        idnrk_txt TYPE maktx,
        menge     TYPE menge_d,
        werks_zj  TYPE werks_d,
        lgort_zj  TYPE lgort_d,
      END OF tys_item.
DATA:ty_item TYPE tys_item.

DATA:lth_functxt TYPE smp_dyntxt.
DATA:g_filepath TYPE string.
DATA:t_xlstmp TYPE zsalsmex_tabline OCCURS 0 WITH HEADER LINE.


SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS:p_auart TYPE aufk-auart DEFAULT 'ZP01' OBLIGATORY.
  PARAMETERS:p_file  LIKE rlgrap-filename MODIF ID p1.
SELECTION-SCREEN:END OF BLOCK b1.

SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION .
  CLEAR lth_functxt.
  lth_functxt-icon_id   = icon_export.
  lth_functxt-icon_text = '下载模板'.
  lth_functxt-quickinfo = '下载模板'.
  sscrfields-functxt_01 = lth_functxt.


AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_download_temp.
    WHEN OTHERS.
  ENDCASE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      program_name  = syst-cprog
      dynpro_number = syst-dynnr
      field_name    = ' '
    IMPORTING
      file_name     = p_file.

START-OF-SELECTION.
  PERFORM frm_upload_data.
  PERFORM frm_display_alv.
*&---------------------------------------------------------------------*
*& Form frm_download_temp
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download_temp .
  DATA:lv_mtype TYPE bapi_mtype,
       lv_msg   TYPE bapi_msg.

  CALL METHOD zcl_excel=>download_template( EXPORTING i_objid = 'ZPPR0047' i_dec = '批导工单组件' IMPORTING e_type = lv_mtype e_message = lv_msg ).
  IF lv_mtype IS NOT INITIAL.
    MESSAGE lv_msg TYPE lv_mtype.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
  DATA:g_repid TYPE sy-repid.
  g_repid = sy-repid.
  "g_layout-zebra             = 'X' .
  gs_layout-zebra = 'X'.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-box_fname = 'SEL'.
  CLEAR  gt_fieldcat[].
  PERFORM frm_generate_field_catalogu.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_PF'
      i_callback_user_command  = 'USER_COM'
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      it_sort_lvc              = gt_sort
    TABLES
      t_outtab                 = gt_out
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_PF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_pf USING  extab TYPE slis_t_extab.
  SET TITLEBAR 'TITLE'.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.                    "SET_PF
*&---------------------------------------------------------------------*
*&      Form  user_com
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM user_com USING r_ucomm LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA: gd_repid LIKE sy-repid,
        ref_grid TYPE REF TO cl_gui_alv_grid.
  DATA:lv_answer.

  IF ref_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = ref_grid.
  ENDIF.
  IF NOT ref_grid IS INITIAL.
    CALL METHOD ref_grid->check_changed_data.
  ENDIF.

  CASE r_ucomm.
    WHEN '&BACK' OR '&EXIT' OR '&EXIT'.
      LEAVE TO SCREEN 0.
    WHEN '&CREATE'.
      READ TABLE gt_out INTO DATA(lw_out) WITH KEY sel = 'X'.
      IF sy-subrc NE 0.
        MESSAGE '请选择需要操作的数据' TYPE 'E'.
      ENDIF.

      READ TABLE gt_out INTO lw_out WITH KEY sel = 'X' bapi_mtype = 'E'.
      IF sy-subrc EQ 0.
        MESSAGE '有错误数据请检查' TYPE 'E'.
      ENDIF.

      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
        EXPORTING
          textline1      = '确认是否创建'
          titel          = '提示'
          cancel_display = ''
        IMPORTING
          answer         = lv_answer.
      IF lv_answer = 'J'.
        PERFORM frm_create_po.
      ENDIF.
    WHEN '&IC1'.
      READ TABLE gt_out INTO lw_out INDEX rs_selfield-tabindex.
      IF rs_selfield-fieldname = 'AUFNR'.
        SET PARAMETER ID 'ANR' FIELD lw_out-aufnr .
        CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
      ENDIF .
    WHEN OTHERS.
  ENDCASE.
  rs_selfield-refresh = 'X'.
ENDFORM.                    "USER_COM
*&---------------------------------------------------------------------*
*&      Form  FRM_GENERATE_FIELD_CATALOGU
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_generate_field_catalogu.
  DEFINE def_modify_fieldcat.
    &1-scrtext_l = &2.
    &1-scrtext_m = &2.
    &1-reptext =   &2.
    &1-scrtext_s = &2.
  END-OF-DEFINITION.
  TRY.
      cl_salv_table=>factory( IMPORTING r_salv_table = DATA(salv_table)
                              CHANGING  t_table      = gt_out ).
      gt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
        r_columns      = salv_table->get_columns( )
        r_aggregations = salv_table->get_aggregations( ) ).
    CATCH cx_root.
  ENDTRY.

  LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_filedcat>).
    CASE <fs_filedcat>-fieldname.
      WHEN 'SEL'.
        <fs_filedcat>-no_out = 'X'.
      WHEN 'ZGDBS'.
        def_modify_fieldcat <fs_filedcat> '工单序号'.
      WHEN 'MATNR'.
        def_modify_fieldcat <fs_filedcat> '生产目标物料'.
      WHEN 'MAKTX'.
        def_modify_fieldcat <fs_filedcat> '生产目标物料描述'.
      WHEN 'WERKS'.
        def_modify_fieldcat <fs_filedcat> '生产工厂'.
      WHEN 'LGORT'.
        def_modify_fieldcat <fs_filedcat> '收货存储地点'.
      WHEN 'PWERK'.
        def_modify_fieldcat <fs_filedcat> '计划工厂'.
      WHEN 'GAMNG'.
        def_modify_fieldcat <fs_filedcat> '生产数量'.
      WHEN 'POSNR'.
        def_modify_fieldcat <fs_filedcat> '组件序号'.
      WHEN 'IDNRK'.
        def_modify_fieldcat <fs_filedcat> '组件物料'.
      WHEN 'IDNRK_TXT'.
        def_modify_fieldcat <fs_filedcat> '组件物料描述'.
      WHEN 'MENGE'.
        def_modify_fieldcat <fs_filedcat> '组件数量'.
      WHEN 'WERKS_ZJ'.
        def_modify_fieldcat <fs_filedcat> '组件生产工厂'.
      WHEN 'LGORT_ZJ'.
        def_modify_fieldcat <fs_filedcat> '组件存储地点'.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  frm_create_po
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create_po.
  DATA:ls_orderdata    TYPE bapi_pp_order_create,
       ls_return       TYPE bapiret2,
       lv_order_number TYPE aufnr.
  DATA:lv_msg   TYPE bapi_msg,
       lv_mtype TYPE bapi_mtype.
  DATA:lt_item TYPE TABLE OF tys_item.

  DATA(lt_out) = gt_out[].
  BREAK yangtao.

  LOOP AT lt_out INTO DATA(ls_out)  GROUP BY ( zgdbs  = ls_out-zgdbs
                                                matnr  = ls_out-matnr
                                                maktx  = ls_out-maktx
                                                werks  = ls_out-werks
                                                pwerk  = ls_out-pwerk
                                                lgort  = ls_out-lgort
                                                gamng  = ls_out-gamng
                                                gltrp  = ls_out-gltrp
                                                gstrp  = ls_out-gstrp
                                                size = GROUP SIZE
                                                index = GROUP INDEX )
      ASCENDING ASSIGNING FIELD-SYMBOL(<fs_group>).

    " 创建生产订单
    CLEAR:ls_orderdata,lv_order_number,ls_return,lv_msg,lv_mtype.
    REFRESH lt_item.

    ls_orderdata-material = <fs_group>-matnr.
    ls_orderdata-plant = <fs_group>-werks.
    ls_orderdata-planning_plant = <fs_group>-pwerk.
    ls_orderdata-order_type = p_auart.
    ls_orderdata-quantity = <fs_group>-gamng.
    ls_orderdata-storage_location = <fs_group>-lgort.
    ls_orderdata-basic_start_date = <fs_group>-gstrp.
    ls_orderdata-basic_end_date = <fs_group>-gltrp.

    CALL FUNCTION 'BAPI_PRODORD_CREATE'
      EXPORTING
        orderdata    = ls_orderdata
      IMPORTING
        return       = ls_return
        order_number = lv_order_number.

    IF ls_return-type = 'E'.
      lv_mtype = 'E'.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = ls_return-id
          msgnr               = ls_return-number
          msgv1               = ls_return-message_v1
          msgv2               = ls_return-message_v2
          msgv3               = ls_return-message_v3
          msgv4               = ls_return-message_v4
        IMPORTING
          message_text_output = lv_msg.

    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.

    DO 10 TIMES.
      SELECT COUNT(*)
        FROM aufk
       WHERE aufnr = lv_order_number.
      IF sy-subrc = 0.
        EXIT.
      ELSE.
        WAIT UP TO 1 SECONDS.
      ENDIF.
    ENDDO.

    IF lv_mtype = 'E'.
      PERFORM frm_set_value USING lv_order_number <fs_group>-zgdbs lv_mtype lv_msg.
      CONTINUE.
    ENDIF.

    LOOP AT GROUP <fs_group> ASSIGNING FIELD-SYMBOL(<ls_group>).
      lt_item[] = VALUE #( BASE lt_item (   idnrk    = <ls_group>-idnrk
                                            menge    = <ls_group>-menge
                                            werks_zj = <ls_group>-werks_zj
                                            lgort_zj =  <ls_group>-lgort_zj ) ).
    ENDLOOP.

* 由于生产订单创建时自动生成组件,需要先清空组件
    PERFORM frm_delete_components USING lv_order_number CHANGING lv_mtype lv_msg.

    IF lv_mtype = 'E'.
      PERFORM frm_set_value USING lv_order_number <fs_group>-zgdbs lv_mtype lv_msg.
      CONTINUE.
    ENDIF.

* 添加需要的组件
    PERFORM frm_add_components TABLES lt_item USING lv_order_number CHANGING lv_mtype lv_msg.
    PERFORM frm_set_value USING lv_order_number <fs_group>-zgdbs lv_mtype lv_msg.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  frm_delete_components
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_delete_components USING pv_order_number TYPE aufnr
                       CHANGING pv_mtype TYPE bapi_mtype
                                pv_msg TYPE bapi_msg.

  DATA: lt_resbkeys   TYPE coxt_t_resbdel,
        lt_return     TYPE STANDARD TABLE OF bapiret2,
        ls_return     TYPE bapiret2,
        lv_error      TYPE flag,
        ls_bapireturn TYPE coxt_bapireturn.

  SELECT rsnum, rspos INTO TABLE @DATA(lt_resb)
                      FROM resb
                      WHERE aufnr = @pv_order_number.
  IF sy-subrc EQ 0.
    lt_resbkeys = CORRESPONDING #( lt_resb ).
  ENDIF.

  IF NOT lt_resbkeys[] IS INITIAL.

    CALL FUNCTION 'CO_XT_COMPONENTS_DELETE'
      EXPORTING
        it_resbkeys_to_delete = lt_resbkeys
      IMPORTING
        e_error_occurred      = lv_error
      TABLES
        ct_bapireturn         = lt_return
      EXCEPTIONS
        delete_failed         = 1
        OTHERS                = 2.
    IF lv_error = space.
      CALL FUNCTION 'CO_XT_ORDER_PREPARE_COMMIT'
        IMPORTING
          es_bapireturn    = ls_bapireturn
          e_error_occurred = lv_error.
      IF ( ls_bapireturn-type = 'S' OR
           ls_bapireturn-type = 'W' OR
           ls_bapireturn-type = 'I' ) OR
           ls_bapireturn IS INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
        CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.

        pv_mtype = 'S'.
        pv_msg = '删除成功'.
      ELSE.
        pv_mtype = 'E'.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = ls_bapireturn-id
            msgnr               = ls_bapireturn-number
            msgv1               = ls_bapireturn-message_v1
            msgv2               = ls_bapireturn-message_v2
            msgv3               = ls_bapireturn-message_v3
            msgv4               = ls_bapireturn-message_v4
          IMPORTING
            message_text_output = pv_msg.
      ENDIF.
    ELSE.
      CLEAR lv_error.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
      IF sy-subrc = 0.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = ls_return-id
            msgnr               = ls_return-number
            msgv1               = ls_return-message_v1
            msgv2               = ls_return-message_v2
            msgv3               = ls_return-message_v3
            msgv4               = ls_return-message_v4
          IMPORTING
            message_text_output = pv_msg.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  frm_add_components
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_add_components TABLES pt_table STRUCTURE ty_item
                        USING pv_order_number TYPE aufnr
                        CHANGING pv_mtype TYPE bapi_mtype
                                 pv_msg TYPE bapi_msg.
  DATA: ls_requ       TYPE coxt_s_quantity,
        ls_storage    TYPE coxt_s_storage_location,
        ls_storagex   TYPE coxt_s_storage_locationx,
        ls_return     TYPE coxt_bapireturn,
        lt_return     TYPE coxt_t_bapireturn,
        lv_msg        TYPE string,
        lv_tabix      TYPE sy-tabix,
        lv_postp      TYPE postp,
        lv_operation  TYPE co_aplzl,
        lv_sequence   TYPE plnfolge,
        lv_material   TYPE matnr,
        lv_positionno TYPE positionno,
        lv_error      TYPE flag.

  TYPES: BEGIN OF ty_resb_bt.
           INCLUDE TYPE resbb.
  TYPES:   indold     LIKE sy-tabix,
           no_req_upd LIKE sy-datar,
         END OF ty_resb_bt.

  TYPES: lt_resb_bt TYPE TABLE OF ty_resb_bt.
  FIELD-SYMBOLS: <ft_resb_bt> TYPE lt_resb_bt,
                 <fs_resb_bt> TYPE ty_resb_bt.

  SELECT SINGLE aufnr, aufpl
    INTO @DATA(ls_afko)
    FROM afko
    WHERE aufnr = @pv_order_number.
  IF sy-subrc EQ 0.
    SELECT SINGLE aufpl, aplzl, plnfl
      INTO @DATA(ls_afvc)
      FROM afvc
     WHERE aufpl = @ls_afko-aufpl.
    IF sy-subrc EQ 0.
      lv_operation = ls_afvc-aplzl.
      lv_sequence = ls_afvc-plnfl.
    ENDIF.
  ENDIF.

  IF pt_table[] IS NOT INITIAL.
    SELECT matnr,meins
      FROM mara
      INTO TABLE @DATA(lt_mara)
      FOR ALL ENTRIES IN @pt_table
      WHERE matnr = @pt_table-idnrk.
    SORT lt_mara BY matnr.
  ENDIF.

  LOOP AT pt_table INTO DATA(lw_table).
    lv_tabix = sy-tabix.
    CLEAR: ls_requ,ls_storage,ls_storagex.
    ls_requ-quantity = lw_table-menge.
    lv_material = lw_table-idnrk.
    READ TABLE lt_mara INTO DATA(lw_mara) WITH KEY matnr = lv_material BINARY SEARCH.
    IF sy-subrc EQ 0.
      ls_requ-uom = lw_mara-meins.
    ENDIF.

    ls_storage-werks = lw_table-werks_zj.
    ls_storage-lgort = lw_table-lgort_zj.

    ls_storagex-werks = 'X'.
    ls_storagex-lgort = 'X'.
    lv_positionno = sy-tabix * 10.

    lv_postp = 'L'.

    CALL FUNCTION 'CO_XT_COMPONENT_ADD'
      EXPORTING
        is_order_key         = pv_order_number
        i_material           = lv_material
        is_requ_quan         = ls_requ
        i_operation          = lv_operation
        i_sequence           = lv_sequence
        is_storage_location  = ls_storage
        is_storage_locationx = ls_storagex
        i_postp              = lv_postp
        i_posno              = lv_positionno
      IMPORTING
        es_bapireturn        = ls_return
        e_error_occurred     = lv_error.
    IF lv_error IS NOT INITIAL.
      EXIT.
    ENDIF.
  ENDLOOP.

  IF lv_error = space.
    CLEAR: lv_tabix,
           ls_return.

    ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <ft_resb_bt>.
    LOOP AT <ft_resb_bt> ASSIGNING <fs_resb_bt>.
      lv_tabix = sy-tabix * 10.
      <fs_resb_bt>-posnr = lv_tabix.
      CLEAR lv_tabix.
    ENDLOOP.


    CALL FUNCTION 'CO_XT_ORDER_PREPARE_COMMIT'
      IMPORTING
        es_bapireturn    = ls_return
        e_error_occurred = lv_error.

    IF ( ls_return-type = 'S' OR
       ls_return-type = 'W' OR
       ls_return-type = 'I' ) OR
       ls_return IS INITIAL.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
      CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.

      pv_mtype  = 'S'.
      pv_msg = '创建成功' .

    ELSE.
      CLEAR: lv_error.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      IF ls_return-type = 'E'.
        pv_mtype  = 'E'.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = ls_return-id
            msgnr               = ls_return-number
            msgv1               = ls_return-message_v1
            msgv2               = ls_return-message_v2
            msgv3               = ls_return-message_v3
            msgv4               = ls_return-message_v4
          IMPORTING
            message_text_output = pv_msg.
      ENDIF.
    ENDIF.
  ELSE.
    CLEAR: lv_error.

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    IF ls_return-type = 'E'.
      pv_mtype  = 'E'.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = ls_return-id
          msgnr               = ls_return-number
          msgv1               = ls_return-message_v1
          msgv2               = ls_return-message_v2
          msgv3               = ls_return-message_v3
          msgv4               = ls_return-message_v4
        IMPORTING
          message_text_output = pv_msg.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_upload_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_upload_data .
  DATA:BEGIN OF i_upload OCCURS 10,
         value001 TYPE string, "工单序号
         value002 TYPE string, "生产目标物料
         value003 TYPE string, "生产工厂
         value004 TYPE string, "收货存储地点
         value005 TYPE string, "计划工厂
         value006 TYPE string, "生产数量
         value007 TYPE string, "开始时间
         value008 TYPE string, "结束时间
         value009 TYPE string, "组件序号
         value010 TYPE string, "组件物料
         value011 TYPE string, "组件数量
         value012 TYPE string, "组件生产工厂
         value013 TYPE string, "组件库存地点
       END OF i_upload.
  DATA:lv_num   TYPE i.
  DATA:v_gt_data_row TYPE int2,
       v_gt_data_col TYPE int2.
  DATA:v_indet(3)  TYPE n,
       v_field(20) TYPE c.
  FIELD-SYMBOLS: <fs> TYPE any,<gs>.

  REFRESH t_xlstmp.
  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLEX'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 16
      i_end_row               = 65536
    TABLES
      intern                  = t_xlstmp
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc NE 0 .
    MESSAGE s003(msgnr) WITH '读取文件失败,请检查Excel数据文件!'.
    STOP.
  ENDIF.

  LOOP AT t_xlstmp.
    TRANSLATE t_xlstmp-value TO UPPER CASE.
    AT NEW row.
      CLEAR:t_xlstmp.
    ENDAT.

    ASSIGN COMPONENT t_xlstmp-col OF STRUCTURE i_upload TO <fs>.
    <fs> = t_xlstmp-value.

    AT END OF row.
      APPEND i_upload.
      CLEAR:i_upload.
    ENDAT .
  ENDLOOP.

  "  APPEND i_upload.
  CLEAR: i_upload,t_xlstmp,t_xlstmp[].

  DATA:lv_matnr    TYPE matnr,
       lv_idnrk    TYPE matnr,
       lv_werks    TYPE werks_d,
       lv_werks_zj TYPE werks_d,
       lv_mtype    TYPE bapi_mtype,
       lv_msg      TYPE bapi_msg.

  LOOP AT i_upload INTO DATA(lw_upload).
    CLEAR:lv_matnr,
          lv_werks,
          lv_werks_zj,
          lv_mtype,
          lv_msg  .

    lv_matnr = lw_upload-value002.
    lv_werks = lw_upload-value003.

    lv_idnrk = lw_upload-value010.
    lv_werks_zj = lw_upload-value012.

    SELECT COUNT(*) FROM marc WHERE matnr = lv_matnr AND werks = lv_werks.
    IF sy-subrc NE 0.
      lv_mtype = 'E'.
      lv_msg = '生产物料在该工厂下不存在'.
    ENDIF.

    SELECT COUNT(*) FROM marc WHERE matnr = lv_idnrk AND werks = lv_werks_zj.
    IF sy-subrc NE 0.
      lv_mtype = 'E'.
      lv_msg = '组件物料在该工厂下不存在'.
    ENDIF.

    gt_out[] = VALUE #( BASE gt_out ( zgdbs     = lw_upload-value001   "工单序号
                                      matnr     = lw_upload-value002   "生产目标物料
                                      werks     = lw_upload-value003   "生产工厂
                                      lgort     = lw_upload-value004   "收货存储地点
                                      pwerk     = lw_upload-value005   "计划工厂
                                      gamng     = lw_upload-value006   "生产数量
                                      gltrp     = lw_upload-value007   "开始时间
                                      gstrp     = lw_upload-value008   "结束时间
                                      posnr     = lw_upload-value009   "组件序号
                                      idnrk     = lw_upload-value010   "组件物料
                                      menge     = lw_upload-value011   "组件数量
                                      werks_zj  = lw_upload-value012   "组件生产工厂
                                      lgort_zj  = lw_upload-value013   "组件库存地点
                                      bapi_mtype   = lv_mtype
                                      bapi_msg     = lv_msg
                                      ) ).

  ENDLOOP.

  IF gt_out[] IS NOT INITIAL.
    SELECT matnr,maktx
      FROM makt
      INTO TABLE @DATA(lt_makt_top)
      FOR ALL ENTRIES IN @gt_out
      WHERE matnr = @gt_out-matnr AND
            spras = @sy-langu.
    SORT lt_makt_top BY matnr.

    SELECT matnr AS idnrk,
           maktx AS idnrk_txt
      FROM makt
      INTO TABLE @DATA(lt_makt_idnrk)
      FOR ALL ENTRIES IN @gt_out
      WHERE matnr = @gt_out-idnrk AND
            spras = @sy-langu.
    SORT lt_makt_idnrk BY idnrk.

    LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
      READ TABLE lt_makt_top INTO DATA(lw_makt_top) WITH KEY matnr = <fs_out>-matnr BINARY SEARCH.
      IF sy-subrc EQ 0.
        <fs_out>-maktx = lw_makt_top-maktx.
      ENDIF.

      READ TABLE lt_makt_idnrk INTO DATA(lw_makt_idnrk) WITH KEY idnrk  = <fs_out>-idnrk  BINARY SEARCH.
      IF sy-subrc EQ 0.
        <fs_out>-idnrk_txt = lw_makt_idnrk-idnrk_txt.
      ENDIF.

    ENDLOOP.
  ENDIF.

  SORT gt_out BY matnr werks lgort.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_value
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_GROUP>_ZGDBS
*&      --> LV_MTYPE
*&      --> LV_MSG
*&---------------------------------------------------------------------*
FORM frm_set_value  USING   pv_aufnr TYPE aufnr
                             pv_zgdbs TYPE numc5
                             pv_mtype TYPE bapi_mtype
                             pv_msg TYPE bapi_msg.

  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>) WHERE zgdbs = pv_zgdbs.
    <fs_out>-aufnr = pv_aufnr.
    <fs_out>-bapi_mtype = pv_mtype.
    <fs_out>-bapi_msg   = pv_msg.
  ENDLOOP.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值