*&---------------------------------------------------------------------*
*& 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.