1. 程式人生 > >採購資訊記錄批導完美版

採購資訊記錄批導完美版

*&---------------------------------------------------------------------*
*& Report ZMMR036
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMMR036B.


INCLUDE ZMMR036B_TOP.
*INCLUDE ZMMR036_top.

INCLUDE ZMMR036B_SCR.
*INCLUDE ZMMR036_scr.

INCLUDE ZMMR036B_FRM.
*INCLUDE ZMMR036_frm.




INITIALIZATION.
  "下載模板按鈕
* 工具欄新增下載模板按鈕
  CLEAR g_function_key.
  g_function_key-icon_id   = icon_read_file.
  g_function_key-icon_text = '供應商匯入模版下載'.
  g_function_key-quickinfo = '供應商匯入模版下載'.
  sscrfields-functxt_01 = g_function_key.

*----------------------------------------------------------------------*
*           AT SELECTION-SCREEN OUTPUT                                 *
*----------------------------------------------------------------------*
*顯示註釋
AT SELECTION-SCREEN OUTPUT.
*  MOVE '1、請選擇正確的模板填寫資料'  TO T1.
*  MOVE '1、請嚴格按照模板要求填寫資料'  TO t2.

*----------------------------------------------------------------------*
*           AT SELECTION-SCREEN                                        *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
* 下載資料匯入模板
  IF sscrfields-ucomm = 'FC01'.
    PERFORM frm_excel_down.
    sscrfields-ucomm = ''.
  ENDIF.
*----------------------------------------------------------------------*
*           AT SELECTION-SCREEN  ON VALUE-REQUEST                      *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* 選擇檔案搜尋幫助
  PERFORM frm_set_file_f4 USING p_file.




START-OF-SELECTION.
* 檔案必輸校驗
  PERFORM frm_file_obligatory.
* 批量匯入資料
  if r_1 eq 'X' .
  PERFORM frm_upload_data.    "模版階梯縱向
  ENDIF .
  IF R_2 EQ 'X' .
  PERFORM frm_upload_data2.  "模版階梯橫向
  ENDIF .
END-OF-SELECTION.
* alv顯示
* PERFORM frm_display_data.
  perform  frm_display_alv2 .
 

*&---------------------------------------------------------------------*
*& 包含               ZMMR036_TOP
*&---------------------------------------------------------------------*

TABLES sscrfields.
INCLUDE <list>.
INCLUDE <icon>.

DATA:   g_function_key TYPE smp_dyntxt .         "功能按鈕
DATA: lv_msg TYPE string.


DATA: gs_bdcdata LIKE bdcdata,
      gs_messtab LIKE bdcmsgcoll.
DATA: gt_bdcdata LIKE TABLE OF bdcdata.   "OCCURS 0 WITH HEADER LINE.
DATA:  gwa_messtab LIKE bdcmsgcoll.
DATA: gt_messtab LIKE TABLE OF bdcmsgcoll." O
DATA: l_option TYPE ctu_params.

DATA: wa_eina     TYPE eina,
      wa_eine     TYPE eine,
      wa_eina_new TYPE eina,
      wa_eine_new TYPE eine.


DATA: it_head TYPE STANDARD TABLE OF mestxh,
      it_line TYPE STANDARD TABLE OF mestxl.


DATA: it_eina TYPE STANDARD TABLE OF eina WITH HEADER LINE,
      it_eine TYPE STANDARD TABLE OF eine.


DATA: return TYPE STANDARD TABLE OF bapireturn WITH HEADER LINE.
DATA: l_netpr LIKE ekpo-netpr.
DATA: l_komv TYPE komv,
      l_ekpo TYPE ekpo.

DATA: BEGIN OF gs_alv ,
        matnr    LIKE eina-matnr, "物料
        lifnr    LIKE eina-lifnr, " 供應商編號
        vkorg    LIKE eine-ekorg, "採購組織
        werks    LIKE eine-werks, " 工廠
*        netpr LIKE eine-netpr," 淨價
        netpr    TYPE string,
        mwskz    LIKE eine-mwskz ,  "稅率
*        peinh    LIKE eine-peinh, " 價格單位
        peinh    TYPE string,  " 價格單位
        waers    LIKE eine-waers , "幣種
*        lifab LIKE wa_eina-lifab ,  "
*        lifbi LIKE wa_eina-lifbi  , "
        lifab    TYPE string ,  "
        lifbi    TYPE string  , "
        kstbm    LIKE  konm-kstbm , "等級
        kbetr    LIKE  konm-kbetr , "等級價格
        p        TYPE c,
        w        TYPE c,
        mark     TYPE c,
        light(4),
        result   TYPE c LENGTH 100,

      END OF gs_alv .
DATA : gt_alv LIKE   TABLE OF gs_alv .



DATA: gt_fieldcat TYPE TABLE OF  slis_fieldcat_alv.
DATA: gs_fieldcat TYPE slis_fieldcat_alv.
DATA: gs_layout TYPE slis_layout_alv .


DATA:  gv_c TYPE c ."有效期重疊控制


DATA: ls_alv  LIKE gs_alv .
DATA: lt_alv LIKE TABLE OF gs_alv .
DATA: ls_alv2  LIKE gs_alv .
DATA: lt_alv2 LIKE TABLE OF gs_alv .
 

 

*&---------------------------------------------------------------------*
*& 包含               ZMMR036_SCR
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK blk02 WITH FRAME TITLE TEXT-005.
PARAMETERS p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK blk02.

*SELECTION-SCREEN BEGIN OF BLOCK blk03 WITH FRAME TITLE TEXT-006.
PARAMETERS : r_1 RADIOBUTTON GROUP g1 .
PARAMETERS : r_2 RADIOBUTTON GROUP g1 DEFAULT 'X' .
*SELECTION-SCREEN BEGIN OF BLOCK blk03 WITH FRAME TITLE TEXT-006.

PARAMETERS : r_3 RADIOBUTTON GROUP g2 .
PARAMETERS : r_4 RADIOBUTTON GROUP g2 .


PARAMETERS : cb_1 AS CHECKBOX .
*PARAMETERS : cb_2 AS CHECKBOX .
 

*&---------------------------------------------------------------------*
*& 包含               ZMMR036_FRM
*&---------------------------------------------------------------------*

FORM frm_file_obligatory .
  IF p_file IS INITIAL.
    MESSAGE '請選擇匯入的檔案' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_upload_data .
* 區域性變數的定義
  DATA:lt_excel TYPE TABLE OF alsmex_tabline.        "參照型別有標準的調整為ZALSMEX_TABLINE_LINE。
  DATA:    ls_excel TYPE alsmex_tabline.

***  IF RB1 = 'X'.
  CLEAR gt_alv.
* 選擇檔案後做後續處理
  CHECK p_file IS NOT INITIAL.
* 把檔案的資料變成內表
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 16
      i_end_row               = 5000
      "SHEET_NAME              = '新增修改擴充套件'
    TABLES
      intern                  = lt_excel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

* 處理內表資料
  CLEAR ls_excel.


  LOOP AT lt_excel INTO ls_excel.




    CASE ls_excel-col.
      WHEN 1.
        gs_alv-lifnr             = ls_excel-value."供應商程式碼 (4)
      WHEN 3.
        gs_alv-matnr            = ls_excel-value."物料程式碼(4)
      WHEN 5.
        gs_alv-vkorg             = ls_excel-value."採購組織(4)
      WHEN 6.
        gs_alv-werks             = ls_excel-value."工廠 (4)
      WHEN 7.
        gs_alv-netpr             = ls_excel-value."淨價 (4)
      WHEN 8.
        gs_alv-waers             = ls_excel-value."幣種(4)WHEN 1.
      WHEN 9.
        gs_alv-peinh             = ls_excel-value."價格係數(4)WHEN 1.
      WHEN 10.
        gs_alv-mwskz             = ls_excel-value."稅碼(4)WHEN 1.
      WHEN 11.
        gs_alv-lifab             = ls_excel-value."有效開始日期 (4)WHEN 1.
      WHEN 12.
        gs_alv-lifbi             = ls_excel-value."有效結束日期 (4)WHEN 1.
      WHEN 13.
        gs_alv-p                 = ls_excel-value."採購
      WHEN 14.
        gs_alv-w                 = ls_excel-value."委外
      WHEN 15.
        gs_alv-kstbm            = ls_excel-value."階梯數量
      WHEN 16.
        gs_alv-kbetr             = ls_excel-value."階梯價



    ENDCASE.
    AT END OF row.
      APPEND gs_alv TO gt_alv.
      CLEAR gs_alv.
    ENDAT.

  ENDLOOP .

*  下面是供應商匯入程式
*  LOOP AT lt_excel INTO ls_excel.
*    CASE ls_excel-col.
*      WHEN 1.
*        gs_alv-partner          = ls_excel-value."SAP 供應商號碼 (10)
*        IF gs_alv-partner IS NOT INITIAL.
*          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*            EXPORTING
*              input  = gs_alv-partner
*            IMPORTING
*              output = gs_alv-partner.
*        ENDIF.
*
*
*
*      WHEN 2.
*        gs_alv-bukrs            = ls_excel-value."公司程式碼 (4)
*      WHEN 3.
*        gs_alv-ekorg            = ls_excel-value."採購組織程式碼 (4)
*      WHEN 4.
*        gs_alv-bu_group         = ls_excel-value."分組(4)
*      WHEN 5.
*        gs_alv-name_org1        = ls_excel-value."供應商名稱 1 (40)
*      WHEN 6.
*        gs_alv-name_org2        = ls_excel-value."供應商名稱 2(40)
*      WHEN 7.
*        gs_alv-name_org3        = ls_excel-value."供應商名稱 3 (40)
*      WHEN 8.
*        gs_alv-name_org4        = ls_excel-value."供應商名稱 4 (40)
*      WHEN 9.
*        gs_alv-bu_sort1              = ls_excel-value."搜尋專案1 (20)
*      WHEN 10.
*        gs_alv-bu_sort2              = ls_excel-value."搜尋專案2 (20)
*      WHEN 11.
*        gs_alv-street              = ls_excel-value."供應商地址 1 (35)
*      WHEN 12.
*        gs_alv-post_code1         = ls_excel-value."郵政編碼 (6)
*      WHEN 13.
*        gs_alv-regio         = ls_excel-value."地區(3)
*      WHEN 14.
*        gs_alv-city1         = ls_excel-value."城市(40)
*      WHEN 15.
*        gs_alv-land1         = ls_excel-value."國家 (2)
*      WHEN 16.
*        gs_alv-langu         = ls_excel-value."語言
*      WHEN 17.
*        gs_alv-tel_number          = ls_excel-value."電話
*      WHEN 18.
*        gs_alv-mob_number             = ls_excel-value."行動電話
*      WHEN 19.
*        gs_alv-fax_number              = ls_excel-value."傳真
*      WHEN 20.
*        gs_alv-smtp_addr              = ls_excel-value."Email
*      WHEN 21.
*        gs_alv-kunnr              = ls_excel-value."客戶
*        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*          EXPORTING
*            input  = gs_alv-kunnr
*          IMPORTING
*            output = gs_alv-kunnr.
*
*      WHEN 22.
*        gs_alv-taxnum              = ls_excel-value."稅號(18)
*      WHEN 23.
*        gs_alv-akont             = ls_excel-value."統馭科目
*        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*          EXPORTING
*            input  = gs_alv-akont
*          IMPORTING
*            output = gs_alv-akont.
*      WHEN 24.
*        gs_alv-zterm             = ls_excel-value."付款條件
*      WHEN 25.
*        gs_alv-reprf          = ls_excel-value."檢查雙重發票
*      WHEN 26.
*        gs_alv-waers          = ls_excel-value."訂單幣別
*      WHEN 27.
*        gs_alv-zterm2              = ls_excel-value."付款條件
*      WHEN 28.
*        gs_alv-webre            = ls_excel-value."基於收貨的發票校驗
*      WHEN 29.
*        gs_alv-telf1              = ls_excel-value."供應商業務員
*      WHEN 30.
*        gs_alv-verkf              = ls_excel-value."供應商業務員電話
*      WHEN 31.
*        gs_alv-ktonr             = ls_excel-value."夥伴功能:L1
**      WHEN 32.
**        gs_alv-verkf              = ls_excel-value.
**      WHEN 33.
**        gs_alv-telf1              = ls_excel-value.
**      WHEN 34.
**        gs_alv-ktonr              = ls_excel-value.
**      WHEN 35.
**        gs_alv-ekgrp              = ls_excel-value.
*      WHEN OTHERS.
*    ENDCASE.
*    AT END OF row.
*      APPEND gs_alv TO gt_alv.
*      CLEAR gs_alv.
*    ENDAT.
*  ENDLOOP.
*
*  LOOP AT gt_alv INTO gs_alv.
*    SELECT COUNT(*)
*      FROM lfa1
*      WHERE lifnr = gs_alv-partner.
*    IF sy-subrc EQ 0.
*      CONCATENATE '供應商編號:' gs_alv-partner '已經存在' INTO gs_alv-remark.
*      gs_alv-icon_a = '@[email protected] '.
*      MODIFY gt_alv FROM gs_alv.
*    ENDIF.
*  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_EXCEL_DOWN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_excel_down .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FILE_F4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_P_FILE  text
*&---------------------------------------------------------------------*
FORM frm_set_file_f4  USING    i_file TYPE rlgrap-filename.
* 區域性變數-檔名定義
  DATA l_filename TYPE rlgrap-filename.
  CLEAR l_filename.
* 選擇檔案搜尋幫助
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_path         = i_file
      mask             = ',*.xlsx,*.XLSX,*.xls,*.XLS.'
      mode             = '0'
      title            = TEXT-002
    IMPORTING
      filename         = l_filename
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
* 如果選擇了檔案
  IF sy-subrc = 0 AND l_filename IS NOT INITIAL.
    p_file = l_filename.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .
* alv相關變數定義
  DATA:lt_fcat TYPE lvc_t_fcat,
       ls_layo TYPE lvc_s_layo.

* FIELDCAT欄位填充
  CLEAR lt_fcat[].
  PERFORM frm_fill_fcat TABLES lt_fcat.

* 佈局設定
  CLEAR ls_layo.
  ls_layo-zebra      = 'X'.    "斑馬線
  ls_layo-cwidth_opt = 'X'.    "最優寬
  ls_layo-box_fname  = 'SEL'.  "選擇模式

* ALV顯示資料
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout_lvc            = ls_layo
      i_callback_pf_status_set = 'FRM_SET_STATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
      it_fieldcat_lvc          = lt_fcat[]
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_alv[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
* 資料顯示失敗
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*       設定狀態列
*----------------------------------------------------------------------*
FORM frm_set_status USING extab TYPE slis_t_extab.
  SET PF-STATUS 'ZSTANDARD_FULLSCREEN'.
*  DATA: BEGIN OF ls_code,
*          code LIKE sy-ucomm,
*        END OF ls_code.
*  DATA: lt_code LIKE TABLE OF ls_code.
*  ls_code-code = 'INSERT'.
*  APPEND ls_code TO lt_code.
*  ls_code-code = 'CHANGE'.
*  APPEND ls_code TO lt_code.
*
*  SET PF-STATUS 'ZSTANDARD_FULLSCREEN' EXCLUDING lt_code.
*  SET TITLEBAR 'TI_1000'.

ENDFORM. " FRM_SET_STATUS


FORM frm_user_command USING i_ucomm LIKE sy-ucomm
                            i_selfield TYPE slis_selfield.


  IF sy-ucomm  EQ 'IMPORT' .

  ENDIF .
*  CASE i_ucomm.
*    WHEN 'BACK'.
*      LEAVE TO SCREEN 0.
*
*    WHEN 'EXIT'.
*      LEAVE PROGRAM.
*
*    WHEN 'IMPORT'. "採購資訊記錄建立
*      LOOP AT gt_alv INTO gs_alv.
*        PERFORM frm_data_import.
*      ENDLOOP .

*    WHEN 'CHANGE'.
*      PERFORM frm_data_change.            "供應商資訊修改
*
*    WHEN 'INSERT'.
*      PERFORM frm_data_insert.            "已存在供應商擴充套件
*
*    WHEN 'INSERT2'.
*      " PERFORM FRM_DATA_INSERT2.           "客戶擴充套件供應商

***    WHEN 'EXPORT'.                                    "------------------------------------20160722登出,採用系統標準電子表格。
***      PERFORM FRM_DATA_EXPORT.

*    WHEN OTHERS.
*  ENDCASE.
ENDFORM. " FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LT_FCAT  text
*&---------------------------------------------------------------------*
FORM frm_fill_fcat TABLES t_fcat TYPE lvc_t_fcat.
  "區域性變數的定義
  DATA ls_fcat TYPE lvc_s_fcat.

  DEFINE m_fieldcat.
    CLEAR ls_fcat.
    ls_fcat-fieldname = &1.
    ls_fcat-coltext   = &2.
    ls_fcat-outputlen = &3.
    ls_fcat-no_zero   = &4.
    IF ls_fcat-fieldname = 'ICON_A'.
      ls_fcat-icon = 'X'.
    ENDIF.
    APPEND ls_fcat TO t_fcat.
  END-OF-DEFINITION.

*  m_fieldcat 'ICON_A    '  '指示燈                  ' '' ''.
  m_fieldcat 'MATNR'  '物料' '' ''.
  m_fieldcat 'LIFNR'  '供應商程式碼 ' '' ''.
  m_fieldcat 'VKORG'  '採購組織 ' '' ''.
  m_fieldcat 'WERKS'  '工廠  ' '' ''.
  m_fieldcat 'NETPR'  '淨價  ' '' ''.
  m_fieldcat 'MWSKZ'  '稅率 ' '' ''.
  m_fieldcat 'PEINH'  '價格單位 ' '' ''.
  m_fieldcat 'WAERS'  '幣種' '' ''.
  m_fieldcat 'LIFAB'  '有效開始日期' '' ''.
  m_fieldcat 'LIFBI'  '有效結束日期 ' '' ''.






ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_IMPORT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_data_import .

  CLEAR :wa_eina,wa_eine,wa_eina_new,wa_eine_new,it_head,it_line,it_eina,it_eine,return,l_netpr,l_komv,l_ekpo.

* **供應商主資料加前導零
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = gs_alv-lifnr
    IMPORTING
      output = gs_alv-lifnr.

  wa_eina-lifnr = gs_alv-lifnr.  " 供應商編號
  wa_eina-matnr = gs_alv-matnr.  "物料
  wa_eine-ekorg = gs_alv-vkorg.  "採購組織
  wa_eine-werks = gs_alv-werks.  " 工廠
  wa_eine-esokz = '0'. " 0 標準採購 3 委外
  wa_eine-netpr = gs_alv-netpr.  " 淨價
  wa_eine-waers = gs_alv-waers ."幣種
*  wa_eine-ekgrp = 'D01'.        ” 採購組
  wa_eine-norbm = '1'.            "標準採購訂單數量
  wa_eine-aplfz = '1'.            "計劃交貨時間
*  wa_eine-effpr = gs_alv-abmpr.   "採購資訊記錄中的有效價格
  wa_eine-mwskz = gs_alv-mwskz.           " 稅碼
  wa_eine-peinh = gs_alv-peinh.   " 價格單位

  wa_eine-webre = 'X'  ." 基於收貨的發票校驗

*  wa_eina-lifab = gs_alv-lifab.  "有效開始日期 沒用
*  wa_eina-lifbi = gs_alv-lifbi.  "有效結束日期  沒用

  " 報價單號


*  CONCATENATE 'ZSDP201建立' INTO WA_EINA-IDNLF.

  CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.


  CALL FUNCTION 'ME_DIRECT_INPUT_INFORECORD'
    EXPORTING
      activity         = 'V' "V 修改,H建立
      i_eina           = wa_eina
      i_eine           = wa_eine
      i_no_suppose     = ''
      i_vorga          = 'A'
*     I_NO_SUPPOSE     = 'X'"重要
*     I_VORGA          = 'B'
*     i_skip_nr_check  = '1'
    IMPORTING
      e_eina           = wa_eina_new
      e_eine           = wa_eine_new
    TABLES
      t_head           = it_head
      t_line           = it_line
    EXCEPTIONS
      textname_invalid = 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.




  CALL FUNCTION 'ME_POST_INFORECORD'
    EXPORTING
      i_matnr  = wa_eina-matnr
      o_matnr  = wa_eina-matnr
    TABLES
      t_eina_i = it_eina.


*APPEND wa_eine_new to it_eine.
  CALL FUNCTION 'ME_UPDATE_INFORECORD_COND'
    TABLES
      reine = it_eine.



  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

  READ TABLE it_eina INDEX 1.

*  WRITE:/ icon_green_light   AS ICON, l_tabix,'行','採購資訊記錄建立成功,資訊記錄號:',it_eina-infnr.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv2 .


  DEFINE append_field.
    gs_fieldcat-fieldname = &1.
    gs_fieldcat-seltext_l = &2.
    APPEND gs_fieldcat TO gt_fieldcat.
    CLEAR: gs_fieldcat.
  END-OF-DEFINITION.


  append_field 'LIGHT'  '指示燈 ' .
  append_field 'RESULT'  '處理結果 ' .
  append_field: 'MATNR'  '編號' .
  append_field 'LIFNR'  '供應商程式碼 '.
  append_field 'VKORG'  '採購組織 '.
  append_field 'WERKS'  '工廠  '.
  append_field 'NETPR'  '淨價  ' .
  append_field 'MWSKZ'  '稅率 ' .
  append_field 'PEINH'  '價格單位 ' .
  append_field 'WAERS'  '幣種' .
  append_field 'LIFAB'  '有效開始日期' .
  append_field 'LIFBI'  '有效結束日期 ' .
  append_field 'P'  '採購' .
  append_field 'W'  '委外' .
  append_field 'KSTBM'  '階梯數量' .
  append_field 'KBETR'  '階梯價格' .





  gs_layout-box_fieldname = 'MARK'.
  gs_layout-colwidth_optimize = 'X'.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_STATUS_SET2'
      i_callback_user_command  = 'FRM_USER_COMMAND2'
*
*     I_GRID_SETTINGS          =
      is_layout                = gs_layout
      it_fieldcat              = gt_fieldcat
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      t_outtab                 = gt_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.


FORM frm_status_set2 USING ut_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZSTANDARD_FULLSCREEN'.

ENDFORM.


FORM frm_user_command2 USING uv_ucomm LIKE sy-ucomm
                          us_selfield TYPE slis_selfield.


  IF  sy-ucomm EQ 'IMPORT' .
*    LOOP AT gt_alv into gs_alv .
*   PERFORM   frm_data_import .
*   ENDLOOP .
    CLEAR gv_c .

    IF cb_1 EQ 'X'.
      gv_c = 'X' .
    ENDIF .


    lt_alv = gt_alv .
    SORT lt_alv BY matnr lifnr vkorg werks p w.
    DELETE  ADJACENT DUPLICATES FROM lt_alv COMPARING matnr lifnr vkorg werks p w .

    LOOP AT lt_alv INTO ls_alv  WHERE mark EQ 'X' .
      IF r_3 EQ 'X' .
        PERFORM  frm_data_import_bdc .  "新增加
      ELSE .
        PERFORM   frm_data_import_bdc2  ."修改
      ENDIF .
      CLEAR ls_alv.
    ENDLOOP .
*     更新結果
    SORT lt_alv BY matnr lifnr vkorg werks p w.
    LOOP AT gt_alv INTO gs_alv .
      CLEAR ls_alv .
      READ TABLE lt_alv INTO ls_alv WITH KEY  matnr = gs_alv-matnr
                                              lifnr = gs_alv-lifnr
                                              vkorg = gs_alv-vkorg
                                              werks = gs_alv-werks
                                              p     = gs_alv-p
                                              w     = gs_alv-w
                                              BINARY SEARCH .
      gs_alv-light = ls_alv-light .
      gs_alv-result = ls_alv-result .

      MODIFY gt_alv FROM gs_alv .

    ENDLOOP .


  ENDIF  .
  us_selfield-refresh = 'X'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_IMPORT_BDC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_data_import_bdc .
*   *設定方式
  l_option-dismode = 'N'.
*    l_option-dismode = 'E'.
  l_option-updmode = 'S'.
  l_option-defsize = 'X'.
  l_option-nobinpt = 'X'.
  l_option-racommit = 'X'." ne.
  CLEAR:gt_bdcdata,gt_bdcdata[].
  PERFORM frm_bdc_dynpro     USING 'SAPMM06I' '0100'.
  PERFORM frm_bdc_field      USING 'BDC_CURSOR' 'EINE-EKORG' .
  PERFORM frm_bdc_field      USING 'BDC_OKCODE' '/00' .
  PERFORM frm_bdc_field      USING 'EINA-LIFNR' ls_alv-lifnr. "  供應商編號
  PERFORM frm_bdc_field      USING 'EINA-MATNR' ls_alv-matnr. "物料
  PERFORM frm_bdc_field      USING 'EINE-EKORG' ls_alv-vkorg .  "採購組織
  PERFORM frm_bdc_field      USING 'EINE-WERKS' ls_alv-werks .  " 工廠
  IF ls_alv-p EQ 'X' .
    PERFORM frm_bdc_field      USING 'RM06I-NORMB' 'X' .  "標準採購
  ENDIF .

  IF ls_alv-w EQ 'X' .
    PERFORM frm_bdc_field      USING 'RM06I-LOHNB' 'X' .  "標準採購
  ENDIF .




  PERFORM frm_bdc_dynpro     USING 'SAPMM06I' '0101'.
  PERFORM frm_bdc_field      USING 'BDC_CURSOR' 'EINA-MAHN1' .
  PERFORM frm_bdc_field      USING 'BDC_OKCODE' '=EINE' .

  PERFORM frm_bdc_dynpro     USING 'SAPMM06I' '0102'.
  PERFORM frm_bdc_field      USING 'BDC_CURSOR' 'EINE-MWSKZ' .
  PERFORM frm_bdc_field      USING 'BDC_OKCODE' '=KO' .
  PERFORM frm_bdc_field      USING 'EINE-APLFZ' '10' .
  PERFORM frm_bdc_field      USING 'EINE-NORBM' '1' .
  PERFORM frm_bdc_field      USING 'EINE-MWSKZ' ls_alv-mwskz.  " 稅碼
  PERFORM frm_bdc_field      USING 'EINE-NETPR' ls_alv-netpr . " 淨價
  PERFORM frm_bdc_field      USING 'EINE-WAERS' ls_alv-waers . "幣種
  PERFORM frm_bdc_field      USING 'EINE-PEINH' ls_alv-peinh . " 價格單位

  PERFORM frm_bdc_dynpro     USING 'SAPMV13A' '0201'.
  PERFORM frm_bdc_field      USING 'BDC_CURSOR' 'RV13A-DATAB' .
  PERFORM frm_bdc_field      USING 'BDC_OKCODE' '=SICH' .
  PERFORM frm_bdc_field      USING 'RV13A-DATAB' ls_alv-lifab .
  PERFORM frm_bdc_field      USING 'RV13A-DATBI' ls_alv-lifbi  .




  CLEAR : gt_messtab[] .
  CALL TRANSACTION 'ME11' USING gt_bdcdata
                           OPTIONS FROM l_option
                           MESSAGES INTO gt_messtab.


 READ TABLE gt_messtab INTO gs_messtab WITH KEY msgid = '06' msgnr = '331'.
  IF sy-subrc <> 0.
    LOOP AT gt_messtab INTO gwa_messtab.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = gwa_messtab-msgid
          msgnr               = gwa_messtab-msgnr
          msgv1               = gwa_messtab-msgv1
          msgv2               = gwa_messtab-msgv2
          msgv3               = gwa_messtab-msgv3
          msgv4               = gwa_messtab-msgv4
        IMPORTING
          message_text_output = lv_msg.

      IF ls_alv-result IS INITIAL.
        ls_alv-result = lv_msg.
      ELSE.
        CONCATENATE lv_msg '/' ls_alv-result INTO ls_alv-result.
      ENDIF.
      CLEAR: gwa_messtab.
    ENDLOOP.
    ls_alv-light = '@[email protected]'.
  ELSE.
    ls_alv-light = '@[email protected]'.
    ls_alv-result = '處理成功!'.

  ENDIF.

  MODIFY lt_alv FROM ls_alv TRANSPORTING light result .
  CLEAR: ls_alv.



ENDFORM.

FORM frm_bdc_dynpro  USING  program  dynpro.
  CLEAR: gs_bdcdata.
  gs_bdcdata-program  = program.
  gs_bdcdata-dynpro   = dynpro.
  gs_bdcdata-dynbegin = 'X'.
  APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.


FORM frm_bdc_field  USING  fnam  fval.
  CLEAR gs_bdcdata.
  gs_bdcdata-fnam = fnam.
  gs_bdcdata-fval = fval.
  APPEND gs_bdcdata TO gt_bdcdata.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_IMPORT_BDC2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_da