固定资产批导程序(1)

*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
* Program Name:ZFIC001
* Date written:
* Author's name:SongQiong
* Last update:
* Program title:固定资产期初批量导入程序
* Project Name:
* Version:
*&---------------------------------------------------------------------*
* Description: (Incl. Related Function Area and System)
*&---------------------------------------------------------------------*
*
*&---------------------------------------------------------------------*
* Change History
*&---------------------------------------------------------------------*
*     Date   |   Programmer   |   Corr. #   |   Description
*            |                |             |
REPORT zfic001.
*&---------------------------------------------------------------------*
*数据与变量定义
*&---------------------------------------------------------------------*
TYPE-POOLS icon.
CONSTANTS:cn_flag TYPE char1 VALUE 'X'.
TABLES sscrfields.
INCLUDE zs4_common.
DATA smp_dyntxt TYPE smp_dyntxt.
*"模板下载
DATA:gv_objid_xls           TYPE wwwdatatab-objid VALUE 'ZCOF001',
     gv_export_filename_xls TYPE string VALUE '固定资产期初批量导入模板'.
TYPES:BEGIN OF ty_alv,
        status  TYPE icon_d,
        message TYPE char255,
        anln1   TYPE anla-anln1.
    INCLUDE    TYPE zsco002_excel.
TYPES:END OF ty_alv.
DATA:gt_alv TYPE TABLE OF ty_alv,
     gs_alv TYPE ty_alv.
*_>EXCEL导入参照结构
DATA:gt_upload TYPE TABLE OF zsco002_excel,
     gs_upload TYPE zsco002_excel.
*->ALV相关
DATA: gs_layout   TYPE lvc_s_layo,
      gs_settings TYPE lvc_s_glay.
DATA: gt_fcat TYPE lvc_t_fcat,
      gs_fcat TYPE lvc_s_fcat.
DATA: gt_sort TYPE lvc_t_sort,
      gs_sort TYPE lvc_s_sort.
DATA: gv_struct TYPE dd02l-tabname.
DATA: ucm LIKE sy-ucomm.
DATA: gt_events TYPE  slis_t_event,
      gs_event  TYPE  slis_alv_event.
DATA: g_grid TYPE REF TO cl_gui_alv_grid.
*&---------------------------------------------------------------------*
*选择屏幕定义
*&---------------------------------------------------------------------*
SELECTION-SCREEN: FUNCTION KEY 1."选择屏幕上的按钮定义
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_upload TYPE rlgrap-filename."上传路径
SELECTION-SCREEN END OF BLOCK b1.
*->屏幕初始化,设置图标和文本
INITIALIZATION.
  smp_dyntxt-icon_id   = icon_table_settings .
  smp_dyntxt-quickinfo = 'Preselected Carrier'.
  smp_dyntxt-icon_text = '下载导入模板'.
  sscrfields-functxt_01 = smp_dyntxt.
*->选择文件事件
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_upload.
  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      field_name = 'P_UPLOAD'
    IMPORTING
      file_name  = p_upload.
*下载事件
AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_download_xls_template USING  gv_objid_xls
                                               gc_file_type_xls
                                               gv_export_filename_xls.
  ENDCASE.
*&---------------------------------------------------------------------*
*程序开始
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM frm_upload_data.
  PERFORM frm_auth_check.
  PERFORM frm_data_check.
  PERFORM frm_show_result.
*&---------------------------------------------------------------------*
*权限检查
*&---------------------------------------------------------------------*
FORM frm_auth_check .
*->权限检查
  LOOP AT gt_alv INTO gs_alv.
    AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
     ID 'BUKRS' FIELD 'gs_alv-bukrs'.
    IF sy-subrc <> 0.
      MESSAGE e001(zfic001) WITH gs_alv-bukrs.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& 数据有效性检查
*&---------------------------------------------------------------------*
FORM frm_data_check .
*->暂时不需要
ENDFORM.
*&---------------------------------------------------------------------*
*& 数据开始上载
*&---------------------------------------------------------------------*
FORM frm_upload_data .
  DATA: lt_tab  TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
  DATA: l_str   TYPE string.
  DATA: l_no    TYPE i VALUE 1,
        l_char  TYPE char4 VALUE '0001',
        l_tabix LIKE sy-tabix.
  FIELD-SYMBOLS:<fs> TYPE any.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename    = p_upload
      i_begin_col = 1
      i_begin_row = 2
      i_end_col   = 255
      i_end_row   = 65536
    TABLES
      intern      = lt_tab[].
  LOOP AT lt_tab.
    CONDENSE lt_tab-value.
    ASSIGN COMPONENT lt_tab-col OF STRUCTURE gs_upload TO <fs>.         "动态方法将值传到相应的内表
    l_str = lt_tab-value.
    CONDENSE l_str.
    IF l_str CS ','.
      REPLACE ALL OCCURRENCES OF ',' IN l_str WITH ''.
      CONDENSE l_str.
    ENDIF.
    IF lt_tab-col = '1'.
      l_str = lt_tab-value+0(4).
    ENDIF.
    <fs> = l_str.
    AT END OF row.
      APPEND gs_upload TO gt_upload.
      MOVE-CORRESPONDING gs_upload TO gs_alv.
      APPEND gs_alv TO gt_alv.
      CLEAR gs_upload.
    ENDAT.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& 显示ALV列表
*&---------------------------------------------------------------------*
FORM frm_show_result .
  DATA: lv_stylerow TYPE lvc_s_styl.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-sel_mode   = 'A'.
  gv_struct            = 'ZSCO002_EXCEL'.
*  gs_layout-stylefname = 'CELLSTYLES'.
  PERFORM frm_get_fieldcat_via_fm   USING    gv_struct
                                    CHANGING gt_fcat.
  CLEAR gs_fcat.
  gs_fcat-fieldname = 'STATUS'.
  gs_fcat-scrtext_s =  '状态'.
  gs_fcat-scrtext_l =  '状态'.
  gs_fcat-scrtext_l =  '状态'.
  gs_fcat-outputlen =  '4'.
  gs_fcat-no_zero   =  'X'.
  APPEND gs_fcat TO gt_fcat.
  CLEAR gs_fcat.
  gs_fcat-fieldname = 'MESSAGE'.
  gs_fcat-scrtext_s =  '消息'.
  gs_fcat-scrtext_l =  '消息 '.
  gs_fcat-scrtext_l =  '消息'.
  gs_fcat-outputlen =  '4'.
  gs_fcat-no_zero   =  'X'.
  APPEND gs_fcat TO gt_fcat.
  CLEAR gs_fcat.
  gs_fcat-fieldname = 'ANLN1'.
  gs_fcat-scrtext_s =  '资产号    '.
  gs_fcat-scrtext_l =  '资产号    '.
  gs_fcat-scrtext_l =  '资产号    '.
  gs_fcat-outputlen =  '16'.
  gs_fcat-no_zero   =  'X'.
  APPEND gs_fcat TO gt_fcat.
  LOOP AT gt_fcat INTO gs_fcat.
    CASE gs_fcat-fieldname.
      WHEN 'SEL'.
        gs_fcat-edit = 'X'.
        gs_fcat-checkbox = 'X'.
    ENDCASE.
    MODIFY gt_fcat FROM gs_fcat.
  ENDLOOP.
  DATA:l_grid_settings TYPE lvc_s_glay.
  l_grid_settings-edt_cll_cb = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'PF_STATUS_SET'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fcat[]
      i_save                   = 'A'
      it_events                = gt_events
      i_grid_settings          = l_grid_settings
    TABLES
      t_outtab                 = gt_alv[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& 设置STATUS
*&---------------------------------------------------------------------*
FORM pf_status_set USING extab TYPE slis_t_extab.
  SET PF-STATUS 'ZFIC001_STATUS'.
ENDFORM.
*&---------------------------------------------------------------------*
*& 设置USER-COMMAND
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
    WHEN '&CREATE'.
      PERFORM frm_create_asset.
    WHEN '&F02' OR '&F15' OR '&F12'.
      LEAVE TO SCREEN 0.
  ENDCASE.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid.
  CALL METHOD g_grid->check_changed_data.
  CALL METHOD g_grid->refresh_table_display.
*设置刷新
  rs_selfield-refresh = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& 创建资产
*& RUN BAPI BAPI_FIXEDASSET_OVRTAKE_CREATE
*&---------------------------------------------------------------------*
FORM frm_create_asset .
*->BAPI相关结构
  DATA: l_key           TYPE bapi1022_key,
        l_asset         TYPE bapi1022_1-assetmaino,
        wa_generaldata  TYPE bapi1022_feglg001,
        wa_generaldatax TYPE bapi1022_feglg001x,
        wa_inventory    TYPE bapi1022_feglg011,
        wa_inventoryx   TYPE bapi1022_feglg011x,
        wa_postinginfo  TYPE bapi1022_feglg002,
        wa_postinginfox TYPE bapi1022_feglg002x,
        wa_timedepend   TYPE bapi1022_feglg003,
        wa_timedependx  TYPE bapi1022_feglg003x,
        wa_allocations  TYPE bapi1022_feglg004,
        wa_allocationsx TYPE bapi1022_feglg004x,
        lt_areas        TYPE TABLE OF bapi1022_dep_areas,
        wa_areas        TYPE bapi1022_dep_areas,
        lt_areasx       TYPE TABLE OF bapi1022_dep_areasx,
        wa_areasx       TYPE bapi1022_dep_areasx,
        lt_cumuvalues   TYPE TABLE OF bapi1022_cumval,
        wa_cumuvalues   TYPE bapi1022_cumval,
        lt_postvalues   TYPE TABLE OF bapi1022_postval,
        wa_postvalues   TYPE bapi1022_postval,
        lt_transactions TYPE TABLE OF bapi1022_trtype,
        wa_transactions TYPE bapi1022_trtype,
        lt_return       TYPE TABLE OF bapiret2,
        wa_return       TYPE bapiret2,
        l_year          TYPE char4,
        l_flag          TYPE char1,
        l_date          TYPE sy-datum,
        l_str           TYPE string.
*进度条
  DATA: l_perc TYPE i VALUE 0.
  DATA: l_line  TYPE string,
        l_total TYPE string.
  DATA: l_stxt TYPE string.
  DATA: l_sperc(3) TYPE c.
*取出所有公司代码的当前会计年度
  IF gt_alv[] IS NOT INITIAL.
    SELECT * FROM t093c
          FOR ALL ENTRIES IN @gt_alv
          WHERE bukrs = @gt_alv-bukrs
          INTO TABLE @DATA(lt_093c).
    SELECT * FROM t001
          FOR ALL ENTRIES IN @gt_alv
          WHERE bukrs = @gt_alv-bukrs
          INTO TABLE @DATA(lt_001).
  ENDIF.
  DESCRIBE TABLE gt_alv LINES l_total.
  LOOP AT gt_alv INTO gs_alv.
    ADD 1 TO l_line.
    MOVE gs_alv-bukrs TO l_key.
    l_year = gs_alv-cap_date+0(4).
*->判断是历史资产还是当前资产
    READ TABLE lt_093c INTO DATA(wa_093c) WITH KEY bukrs = gs_alv-bukrs.
    IF sy-subrc EQ 0.
      IF  l_year < wa_093c-lgjahr.
        l_flag = cn_flag."X表示历史资产,空表示当前资产
      ENDIF.
    ENDIF.
*->generaldata,需要加前导0
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = gs_alv-assetclass
      IMPORTING
        output = gs_alv-assetclass.
    wa_generaldata-assetclass     = gs_alv-assetclass.
    wa_generaldata-descript       = gs_alv-descript.
    wa_generaldata-main_descript  = gs_alv-main_descript.
    wa_generaldata-serial_no      = gs_alv-serial_no.
    wa_generaldata-invent_no      = gs_alv-invent_no.
    wa_generaldata-quantity       = gs_alv-quantity.
    wa_generaldata-base_uom       = gs_alv-base_uom.
    wa_generaldatax-descript      = cn_flag.
    wa_generaldatax-main_descript = cn_flag.
    wa_generaldatax-serial_no     = cn_flag.
    wa_generaldatax-invent_no     = cn_flag..
    wa_generaldatax-quantity      = cn_flag.
    wa_generaldatax-base_uom      = cn_flag.
*->inventory
    wa_inventory-note             = gs_alv-note.
    wa_inventory-note             = cn_flag.
*->postinginfomation
    wa_postinginfo-cap_date       = gs_alv-cap_date.
    wa_postinginfox-cap_date      = cn_flag.
*->timedependent
    wa_timedepend-costcenter      = gs_alv-cost_center.
    wa_timedependx-costcenter     = cn_flag.
*->allocation
    wa_allocations-evalgroup1     = gs_alv-evalgroup1.
    wa_allocationsx-evalgroup1    = cn_flag.
    wa_allocations-evalgroup2     = gs_alv-evalgroup2.
    wa_allocationsx-evalgroup2    = cn_flag.
*->lt_areas
    wa_areas-area                 = '01'.
    wa_areas-ulife_yrs            = gs_alv-ulife_yrs.
    wa_areas-dep_key              = gs_alv-dep_key.
    wa_areas-change_yr            = gs_alv-ulife_yrs.
    APPEND wa_areas TO lt_areas.
    wa_areasx-area                = '01'.
    wa_areasx-ulife_yrs           = cn_flag.
    wa_areasx-dep_key             = cn_flag.
    wa_areasx-change_yr           = cn_flag.
    APPEND wa_areasx TO lt_areasx.
*->历史资产
    IF l_flag = 'X'.
      wa_cumuvalues-fisc_year       = wa_093c-lgjahr. "lt_cumuvalues
      wa_cumuvalues-area            = '01'.
      wa_cumuvalues-acq_value       = gs_alv-acq_value.
      wa_cumuvalues-ord_dep         = 0 - gs_alv-cumu_ord_dep.
      APPEND wa_cumuvalues TO lt_cumuvalues.
      wa_postvalues-fisc_year        = wa_093c-lgjahr."lt_postvalues
      wa_postvalues-area             = '01'.
      wa_postvalues-ord_dep          = 0 - gs_alv-post_ord_dep.
      APPEND wa_postvalues TO lt_postvalues.
    ELSE.
      wa_cumuvalues-fisc_year       = wa_093c-lgjahr. "lt_cumuvalues
      wa_cumuvalues-area            = '01'.
      wa_cumuvalues-acq_value       = 0.
      wa_cumuvalues-ord_dep         = 0 - gs_alv-cumu_ord_dep.
      APPEND wa_cumuvalues TO lt_cumuvalues.
      wa_postvalues-fisc_year        = wa_093c-lgjahr."lt_postvalues
      wa_postvalues-area             = '01'.
      wa_postvalues-ord_dep          = 0 - gs_alv-post_ord_dep.
      APPEND wa_postvalues TO lt_postvalues.
*->lt_transactions
      wa_transactions-fisc_year  = l_year.
      wa_transactions-current_no = '00001'.
      wa_transactions-area       = '01'.
      CLEAR l_date.
      MOVE gs_alv-cap_date TO l_date.
      l_date+0(4) = l_year.
      wa_transactions-valuedate  = l_date.
      wa_transactions-assettrtyp = '100'.
      wa_transactions-amount     = gs_alv-acq_value.
*->公司货比码
      READ TABLE lt_001 INTO DATA(wa_001) WITH KEY bukrs = gs_alv-bukrs.
      IF sy-subrc EQ 0.
        wa_transactions-currency = wa_001-waers.
      ENDIF.
      APPEND wa_transactions TO lt_transactions.
    ENDIF.
    CALL FUNCTION 'BAPI_FIXEDASSET_OVRTAKE_CREATE'
      EXPORTING
        key                 = l_key
        generaldata         = wa_generaldata
        generaldatax        = wa_generaldatax
        inventory           = wa_inventory
        inventoryx          = wa_inventoryx
        postinginformation  = wa_postinginfo
        postinginformationx = wa_postinginfox
        timedependentdata   = wa_timedepend
        timedependentdatax  = wa_timedependx
        allocations         = wa_allocations
        allocationsx        = wa_allocationsx
      IMPORTING
*       companycode         = l_companycode
        asset               = l_asset
*       subnumber           =
*       assetcreated        =
      TABLES
        depreciationareas   = lt_areas
        depreciationareasx  = lt_areasx
*       INVESTMENT_SUPPORT  =
*       EXTENSIONIN         =
        cumulatedvalues     = lt_cumuvalues
        postedvalues        = lt_postvalues
        return              = lt_return
        transactions        = lt_transactions
*       PROPORTIONALVALUES  =
*       POSTINGHEADERS      =
      .
    IF l_asset IS NOT INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
      gs_alv-anln1  = l_asset.
      gs_alv-status = icon_led_green."绿灯
    ELSE.
      LOOP AT lt_return INTO wa_return.
        IF l_str IS INITIAL.
          MOVE wa_return-message TO l_str.
        ELSE.
          CONCATENATE l_str '/' wa_return-message INTO l_str.
        ENDIF.
      ENDLOOP.
      MOVE l_str TO gs_alv-message.
      gs_alv-status = icon_led_red."红灯
    ENDIF.
    MODIFY gt_alv FROM gs_alv.
    l_perc = l_line * 100 / l_total.
    CONCATENATE '已导入: 第' l_line '条,' '共'  l_total  INTO l_stxt.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        percentage = l_perc     "百分比的数值,用来控制秒表的指针。
        text       = l_stxt.   "状态栏显示的文本。
    CLEAR:
     l_str,
     wa_generaldata,
     wa_generaldatax,
     wa_inventory,
     wa_inventoryx,
     wa_postinginfo,
     wa_postinginfox,
     wa_timedepend,
     wa_timedependx,
     wa_allocations,
     wa_allocationsx,
     lt_cumuvalues[],
     lt_postvalues[],
     lt_return[],
     lt_transactions.
  ENDLOOP.
ENDFORM.
 
--------------------- 
作者:倔强的ABAPER 
来源:CSDN 
原文:https://blog.csdn.net/sq1986127/article/details/83344701 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值