• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
^ω^SAp傻X^o^
博客园    首页    新随笔    联系   管理    订阅  订阅
库存期初数据批量调账 成本组件分解
*&---------------------------------------------------------------------*
*& Report ZCOD001
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& 版本号 日期 作者 修改描述 ReqID
*& V001 2016.9.29 刘容  成本组件分解
* 如果模板更新请到SMW0更新 ZCOD001.XLS模板
*&---------------------------------------------------------------------*
REPORT zcod001.
" 成本组件分解
TABLES: sscrfields.
*&-------alv类型定义
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE slis_layout_alv,
      gd_repid     LIKE sy-repid.
DATA: functxt TYPE smp_dyntxt.
TYPES:BEGIN OF ty_upload_data,
        material    TYPE mara-matnr, " 物料号
        plant       TYPE marc-werks, " 工厂
        year(4)     TYPE c, " 年度
        period(3)   TYPE c, " 记帐期间
        val_type    TYPE string, " 评估类型

        kst001      TYPE string,
        kst002      TYPE string,
        kst003      TYPE string,
        kst004      TYPE string,
        kst005      TYPE string,
        kst006      TYPE string,
        kst007      TYPE string,
        kst008      TYPE string,
        kst009      TYPE string,
        kst010      TYPE string,
*&-------------显示结果字段
        type(1)     TYPE c, "消息类型
        message(60) TYPE c,    "消息
        light(4)    TYPE c,    "执行情况
        zsel(1)     TYPE c,
      END OF ty_upload_data.

DATA:gt_upload_data TYPE STANDARD TABLE OF ty_upload_data,
     gw_upload_data TYPE                   ty_upload_data.
FIELD-SYMBOLS :  <fls_data> LIKE LINE OF gt_upload_data.
DATA:l_flag TYPE c. " 标识

*&---------检查物料和工厂存在否
TYPES : BEGIN OF ty_marc,
          matnr TYPE marc-matnr,
          werks TYPE marc-werks,
        END OF ty_marc.

DATA : gt_marc TYPE TABLE OF ty_marc.
DATA : gs_marc LIKE LINE OF gt_marc.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
PARAMETERS: p_file TYPE rlgrap-filename  ."导入文件
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN COMMENT 01(20) TEXT-h01.
SELECTION-SCREEN: FUNCTION KEY 1.

INITIALIZATION.
  functxt-icon_id   = icon_export.
  functxt-quickinfo = '模版下载'(001).
  functxt-icon_text = '模版下载'(001).
  sscrfields-functxt_01 = functxt.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_browser_file.

AT SELECTION-SCREEN.
*&--------------模板下载
  IF sscrfields-ucomm = 'FC01'.
    PERFORM temp_excel_get USING 'ZCOD001.XLS'.
  ELSEIF sscrfields-ucomm = 'ONLI'.
    IF p_file IS  NOT INITIAL.
      PERFORM frm_upload_data.
*&------------检查数据
      PERFORM frm_check_data.
*&-------------alv展示批导钱的数据
      PERFORM build_fieldcatalog.
      PERFORM build_layout.
      PERFORM display_alv_report.

    ENDIF.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FRM_BROWSER_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_browser_file .
  DATA v_material LIKE rlgrap-filename.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mask             = ',*.* ,*.*.'
      mode             = '0'
      title            = '请选择要上传的信息文件'
    IMPORTING
      filename         = v_material
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc <> 0.

  ENDIF.
  p_file = v_material.
ENDFORM.                    " FRM_BROWSER_FILE

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_upload_data .

  DATA: l_raw TYPE truxs_t_text_data.
* 从EXCEL上传到内表
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    =
      i_line_header        = 'X'
      i_tab_raw_data       = l_raw
      i_filename           = p_file
    TABLES
      i_tab_converted_data = gt_upload_data
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
    STOP.
  ENDIF.
  "DELETE gt_upload_data INDEX 1.

ENDFORM.                    " FRM_UPLOAD_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_BAPI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_bapi .

  DATA:lt_ckml_t_change_ccs TYPE STANDARD TABLE OF ckml_s_change_ccs,
       lw_ckml_s_change_ccs TYPE                   ckml_s_change_ccs.

  DATA: it_ckmlpp TYPE cki_t_ckmlpp,
        it_ckmlcr TYPE cki_t_ckmlcr.


* 数据检查

*获取上传数据,转换数据
  LOOP AT gt_upload_data ASSIGNING <fls_data> WHERE type IS INITIAL.


    lw_ckml_s_change_ccs-material = <fls_data>-material.
    lw_ckml_s_change_ccs-plant =  <fls_data>-plant.
*    lw_ckml_s_change_ccs-val_type =  <fls_data>-val_type.
    lw_ckml_s_change_ccs-year =  <fls_data>-year.
    lw_ckml_s_change_ccs-period =  <fls_data>-period.
    lw_ckml_s_change_ccs-category = 'ZU'.
    lw_ckml_s_change_ccs-curr_type = '10'."<fls_data>-VAL_TYPE.
    lw_ckml_s_change_ccs-kst001 =  <fls_data>-kst001.
    lw_ckml_s_change_ccs-kst002 =  <fls_data>-kst002.
    lw_ckml_s_change_ccs-kst003 =  <fls_data>-kst003.
    lw_ckml_s_change_ccs-kst004 =  <fls_data>-kst004.
    lw_ckml_s_change_ccs-kst005 =  <fls_data>-kst005.
    lw_ckml_s_change_ccs-kst006 =  <fls_data>-kst006.
    lw_ckml_s_change_ccs-kst007 =  <fls_data>-kst007.
    lw_ckml_s_change_ccs-kst008 =  <fls_data>-kst008.
    lw_ckml_s_change_ccs-kst009 =  <fls_data>-kst009.
    lw_ckml_s_change_ccs-kst010 =  <fls_data>-kst010.

    APPEND lw_ckml_s_change_ccs TO lt_ckml_t_change_ccs.
    CLEAR lw_ckml_s_change_ccs.

  ENDLOOP.

  " 通过导入的物料编码、工厂字段查找表CKMLHD,取CKMLHD-KALNR;通过字段值KALNR,
  " 查找表MLCD,KALNR、BDATJ=会计年度、POPER=输入的会计期间、CATEG=‘ZU’、PTYP=‘B+‘,
  " 取MLCD-BVALT作为函数的PROC_ALT字段值
  " 备选采购/过程
  TYPES: BEGIN OF ty_mlcd,
           matnr  TYPE ckmlhd-matnr,
           bwkey  TYPE ckmlhd-bwkey,
           kalnr  TYPE mlcd-kalnr,
           bdatj  TYPE mlcd-bdatj,
           poper  TYPE mlcd-poper,
           bvalt  TYPE mlcd-bvalt,
           untper TYPE mlcd-untper,
           curtp  TYPE mlcd-curtp,
         END OF ty_mlcd.

  DATA:lt_mlcd TYPE STANDARD TABLE OF ty_mlcd WITH HEADER LINE.

  IF  lt_ckml_t_change_ccs IS NOT INITIAL.
    SELECT
       ckmlhd~matnr
       ckmlhd~bwkey
       mlcd~kalnr
       mlcd~bdatj
       mlcd~poper
       mlcd~bvalt
       mlcd~untper
       mlcd~curtp
      INTO CORRESPONDING FIELDS OF TABLE lt_mlcd
      FROM mlcd INNER JOIN ckmlhd
      ON mlcd~kalnr = ckmlhd~kalnr
      FOR ALL ENTRIES IN lt_ckml_t_change_ccs
      WHERE matnr = lt_ckml_t_change_ccs-material
      AND bwkey = lt_ckml_t_change_ccs-plant
      AND bdatj = lt_ckml_t_change_ccs-year
      AND poper = lt_ckml_t_change_ccs-period
    AND categ = 'ZU'
    AND ptyp = 'B+'.
  ENDIF.
  IF lt_mlcd[] IS NOT INITIAL.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE it_ckmlpp FROM ckmlpp
      FOR ALL ENTRIES IN lt_mlcd
      WHERE kalnr = lt_mlcd-kalnr
        AND bdatj = lt_mlcd-bdatj
    AND poper = lt_mlcd-poper
    AND untper = lt_mlcd-untper.

    SELECT * INTO CORRESPONDING FIELDS OF TABLE it_ckmlcr FROM ckmlcr
      FOR ALL ENTRIES IN lt_mlcd
      WHERE kalnr = lt_mlcd-kalnr
        AND bdatj = lt_mlcd-bdatj
        AND poper = lt_mlcd-poper
    AND untper = lt_mlcd-untper
    AND curtp = lt_mlcd-curtp.
  ENDIF.


  LOOP AT lt_ckml_t_change_ccs INTO  lw_ckml_s_change_ccs.
    READ TABLE  lt_mlcd WITH KEY matnr = lw_ckml_s_change_ccs-material
                                 bwkey = lw_ckml_s_change_ccs-plant
                                 bdatj = lw_ckml_s_change_ccs-year
                                 poper = lw_ckml_s_change_ccs-period.
    IF sy-subrc = 0.
      lw_ckml_s_change_ccs-proc_alt = lt_mlcd-bvalt. " 备选采购/过程
      MODIFY lt_ckml_t_change_ccs FROM lw_ckml_s_change_ccs.
    ENDIF.
  ENDLOOP.

  CALL METHOD cl_fins_acdoc_ml_util=>set_ckml_buffer
    EXPORTING
      it_ckmlpp = it_ckmlpp
      it_ckmlcr = it_ckmlcr.


  " 调用BAPI
  IF lt_ckml_t_change_ccs IS NOT INITIAL.
    CALL FUNCTION 'CKMMC_MANCHANG_AUTOMATED'
      EXPORTING
        it_ccs  = lt_ckml_t_change_ccs
*       I_KONGR =
*       I_RUN_TYPE       =
*       I_RUN_APPL       =
        i_keart = 'H'.
    MESSAGE ID sy-msgid TYPE 'S'
    NUMBER sy-msgno  WITH sy-msgv1 sy-msgv2  INTO <fls_data>-message.
    IF sy-subrc = 0 .
      <fls_data>-type = 'S'.
      COMMIT WORK AND WAIT.
    ELSE.
      <fls_data>-type = 'E'.
    ENDIF.
    CASE :  <fls_data>-type.
      WHEN 'S'.
        <fls_data>-light = '@5B@'.
      WHEN 'W'.
        <fls_data>-light  = '@5D@'.    "黄灯
      WHEN 'E'.
        <fls_data>-light = '@5C@'.
    ENDCASE.
  ENDIF.
*  IF sy-subrc = 0.
*    "WRITE : /  '期初库存成本组件分解,导入成功'.
*    MESSAGE '期初库存成本组件分解,导入成功' TYPE 'S'.
*  ELSE.
*    "WRITE : / '期初库存成本组件分解,导入失败'.
*    MESSAGE '期初库存成本组件分解,导入成功' TYPE 'S'.
*  ENDIF.

ENDFORM.                    " FRM_BAPI

FORM temp_excel_get USING p_objid TYPE wwwdata-objid.
  DATA: l_objdata     LIKE wwwdatatab,
        l_destination LIKE rlgrap-filename,
        l_rc          LIKE sy-subrc,
        l_errtxt      TYPE string.
  DATA: l_fullpath  TYPE string,
        l_extension TYPE string,
        l_fname     LIKE rlgrap-filename,
        l_formkey   LIKE  wwwdatatab.

  l_extension = p_objid.
  PERFORM get_file_name USING '.xls'
                              'Excel|*.xls;'
                     CHANGING l_fullpath.
  IF l_fullpath = space.
    MESSAGE '请选择下载文件名' TYPE 'E'.
  ELSE.
    CONCATENATE l_fullpath '' INTO l_fname.
    SELECT SINGLE relid objid
      FROM wwwdata
      INTO CORRESPONDING FIELDS OF l_objdata
      WHERE relid = 'MI'
    AND objid = p_objid .

    IF sy-subrc NE 0 OR l_objdata-objid = space.
      MESSAGE e001(00) WITH '文件不存在!'.
    ELSE.
      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
        EXPORTING
          key         = l_objdata
          destination = l_fname
        IMPORTING
          rc          = l_rc
        CHANGING
          temp        = l_fname.
      IF l_rc NE 0.
        MESSAGE e001(00) WITH '文件下载失败!'.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.

FORM get_file_name USING p_extension
                         p_file_filter
                CHANGING p_fullpath.
  DATA: l_filename TYPE string,
        l_path     TYPE string,
        l_fullpath TYPE string,
        l_titile   TYPE string,
        l_init_dir TYPE string.

  CLEAR p_fullpath.
  l_titile    = TEXT-t04.
  l_init_dir  = TEXT-t03.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = l_titile
      default_extension    = '.xls'
      initial_directory    = l_init_dir
      prompt_on_overwrite  = 'X'
      file_filter          = p_file_filter
    CHANGING
      filename             = l_filename
      path                 = l_path
      fullpath             = l_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  p_fullpath = l_fullpath.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcatalog .
  CLEAR: fieldcatalog.
  DEFINE build_fieldcat.
    fieldcatalog-fieldname = &1.
    fieldcatalog-seltext_m = &2.
    fieldcatalog-outputlen = &3.
    IF fieldcatalog-fieldname = 'LIGHT'.
      fieldcatalog-key  = 'X'.
    ENDIF.
    IF fieldcatalog-fieldname = 'MATERIAL'.
       fieldcatalog-no_zero = 'X'.
      ENDIF.
    APPEND fieldcatalog TO fieldcatalog.
    CLEAR fieldcatalog.
  END-OF-DEFINITION.
  build_fieldcat 'LIGHT' '结果信息灯' 10.
  build_fieldcat 'MESSAGE' '消息' 25.
  build_fieldcat 'MATERIAL' '物料号' 12.
  build_fieldcat 'PLANT   ' '工厂'   4.
  build_fieldcat 'YEAR    ' '年度'   4.
  build_fieldcat 'PERIOD  ' '记帐期间' 8.
  build_fieldcat 'VAL_TYPE' '评估类型' 8.

  build_fieldcat 'KST001' '原料-变式' 12.
  build_fieldcat 'KST002' '包材-变式' 12.
  build_fieldcat 'KST003' '成本字段3' 12.
  build_fieldcat 'KST004' '人工-变式' 12.
  build_fieldcat 'KST005' '成本字段5' 12.

  build_fieldcat 'KST006' '机器-变式' 12.
  build_fieldcat 'KST007' '成本字段7' 12.
  build_fieldcat 'KST008' '制造费用-变式' 14.
  build_fieldcat 'KST009' '成本字段9' 12.
  build_fieldcat 'KST010' '成本字段10' 12.
  build_fieldcat 'TYPE' '结果' 4.



ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  BUILD_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_layout .
  gd_layout-zebra             = 'X'.
  gd_layout-box_fieldname = 'ZSEL'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV_REPORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_alv_report .
  gd_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = gd_repid
      is_layout                = gd_layout
      it_fieldcat              = fieldcatalog[]  "输出的列信息
      i_save                   = 'A'          "变式可保存
      i_callback_pf_status_set = 'FRM_SET_STATUS'  "状态栏
      i_callback_user_command  = 'FRM_USER_COMMAND' "按钮处理
    TABLES
      t_outtab                 = gt_upload_data    "输出内容内表
    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 frm_user_command USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.
  DATA: l_grid  TYPE REF TO cl_gui_alv_grid,
        l_subrc TYPE sy-subrc.
* 取得当前alv的grid
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = l_grid.
  CALL METHOD l_grid->check_changed_data.
  rs_selfield-refresh = 'X'.
  CASE r_ucomm.
    WHEN 'SAVE'.
      PERFORM frm_bapi.
    WHEN OTHERS.
  ENDCASE.
  rs_selfield-refresh = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.
ENDFORM. "user_command

FORM frm_set_status USING pt_extab TYPE slis_t_extab .
  SET PF-STATUS 'STANDARD'.
ENDFORM. "Frm_SET_STATUS
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_data .
  CLEAR : gt_marc.
  IF gt_upload_data IS  INITIAL.
    MESSAGE '清单无数据' TYPE 'E'.
  ENDIF.
  LOOP AT gt_upload_data ASSIGNING <fls_data>.

*&----------物料加前导零
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = <fls_data>-material
      IMPORTING
        output       = <fls_data>-material
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.
    SELECT
       matnr
       werks
      INTO TABLE gt_marc
      FROM marc
      FOR ALL ENTRIES IN gt_upload_data
      WHERE
        matnr = gt_upload_data-material
      AND werks = gt_upload_data-plant
      .
    SORT gt_marc BY matnr werks.
    READ TABLE gt_marc WITH KEY matnr = <fls_data>-material
                                werks = <fls_data>-plant
                                 TRANSPORTING NO FIELDS BINARY SEARCH.
    IF sy-subrc <> 0.
      <fls_data>-light = '@5C@'.
      <fls_data>-type = 'E'.
      CONCATENATE '物料' <fls_data>-material '在工厂' <fls_data>-plant  '下不存在'
                              INTO <fls_data>-message.
    ENDIF.
  ENDLOOP.
ENDFORM.

 

^_^很多人都把资料锁进了note里,以后还怎么百度呢^_^
posted on 2017-03-07 08:42  ^ω^SAP傻X^o^  阅读(1473)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3