目录
报错二:输入号码在 S00000000000 和 S99999999999 之间的资产号码
前言:
在上项目之前,业务顾问会提供一些字段,让用户根据模板提供业务上面的数据,然后据此作为期初数据批量导入到SAP系统里面,之后可以进行期初数据的测试,这次的案例是在向测试系统导入资产主数据,然后出现了一系列的报错。
导入资产主数据时,有两种情况,第一种情况是资产编号已经存在,只不过没有存储在SAP系统里,是由外围系统保存的,现在需要迁入到SAP系统上来;第二种情况是资产编号不存在,由SAP系统自动生成资产编号。本次是第一种情况哈~
创建资产主数据函数一般会用这两个:
BAPI_FIXEDASSET_OVRTAKE_CREATE
BAPI_FIXEDASSET_CREATE1
两个bapi的参数都差不多,功能也差不多,对上面的两种资产主数据导入情况都使用。但是第二个BAPI的参数简单一些,网上大家使用第二个bapi的案例多一些,如果大家要使用的话,可以使用第二个,感觉靠谱一点,参考也多。
但是这次我是在已有程序的基础上修改的BUG,程序中使用的是第一个BAPI。批导程序的代码我附在文末。
好了前导说完了,那就开始BUUUUUUG之旅~
一、BUG分析
报错一:旧数据接管的会计年度未确定
是因为程序里面使用了下列函数AISCO_CALCULATE_FIRST_DAY,输入公司代码,获取会计年度,这个数据是在后台表T093C表中取数的,通过SE16N可以看到后台表数据没有数,所以直接报错了。在项目中的时候 可以换一个后台表直接取数,T001B之类的表,也可以换成直接复制,这里我和业务顾问确认之后直接约定了赋值为2025。
CALL FUNCTION 'AISCO_CALCULATE_FIRST_DAY'
EXPORTING
i_bukrs = it_doc-bukrs
IMPORTING
e_to_year = ld_fisc_year.
报错二:输入号码在 S00000000000 和 S99999999999 之间的资产号码
这是调用BAPI:BAPI_FIXEDASSET_OVRTAKE_CREATE时返回的报错
因为这次是将已有的资产编号导入系统,不是由系统自动生成编号,检查了数据发现资产编号需要在调用BAPI的时候填入两个地方
一个是参数KEY
另一个是GENERALDATA参数
之前没有在key参数里面赋值,所以失败了,添加上即可。
报错三:使用年限期间数必须小于会计年度变式中的期间数
在导入数据的时候
这个问题我也不知道怎么解决,不太清楚计划使用期间这些是怎么计算的,配置上面的时间变式是K4,就是12个正常月份+4个月特殊记账期间。这里我把计划使用期间修改为12也是报错的,总之最后解决方法是没有传输计划年使用期、计划使用期间、已使用期间、已使用年度这几个值,在BAPI里面也删除了对应的传输标识’X’,然后就成功了,经过业务顾问检查,没有什么问题,折旧什么的逻辑都OK,(不知道计划使用期间没上传为什么没影响emm反正就这样吧~)BAPI的传输参数如下:
ULIFE_YRS:计划使用年
ULIFE_PRDS:计划使用期间
EXP_ULIFE_YRS:已使用年
EXP_ULIFE_PRDS:已使用期间
然后就不报错了,如下:
然后我在复盘的时候就发现了真正的问题!!系统里面可以下载模板,下载的模板里面有个测试用例,这个计划年使用期、计划使用期间、已使用年、已使用月,是这样子导入的哇!!计划使用3年,已经用了2年6个月,就分别写入3、0、2、6就可以了,为什么用户要写3、36、2、24??请回答我!请回答我!!!
吃一堑再吃一堑再吃两堑
报错四:BAPI创建成功,但是AS03(事务代码)和ANLA(后台表)都查询不到,再次导入数据就报错编号已存在
如下图所示,上面是BAPI调用成功的截图,但是使用AS03查询资产编号的时候,无法查询到,并且重新导入相同的资产编号的时候,仍然会报错编号已存在,但是真的不存在!!
后面在DEBUG的时候,终于找到了编号保存的位置,保存在了ANLH表里面,校验的时候就失败了,显示重复。代码位置如下:
因为我们现在是在测试机导入数据,所以这个情况就没有管,如果需要解决的话,将后台表ANLH的数据删除就可以了,推荐使用代码删除,比较规范。在删除之前确保数据完整性,ANEK和ANEP表里面可以查看到该资产数据有没有与其它数据具有关联性,如果有关联就不能删,反正和业务顾问确认后再行动。
报错五:为什么会出现上述问题四的情况?
好吧,这个我是真的不知道了。但是因为做测试我也做了笔记,我复刻出来了相同的情况。我之前有提到过,我是使用的BAPI:BAPI_FIXEDASSET_OVRTAKE_CREATE来创建资产主数据的,之前一直在程序里面测试,因为程序是很早之前乙方写的代码,BUG都改了好几轮,我就不太相信代码的准确性了,所以我就把数据提取出来,直接使用SE37运行BAPI来测试数据了,好么,问题就出现在这里。
直接运行BAPI,尽管字段和批导程序的字段一模一样(是真的一样,我仔细核对了!),直接运行BAPI虽然成功但是数据就只存在于ANLH里面,没有进入ANLA以及其它表里面,在程序里面调用相同的BAPI,相同的字段,就是成功的。程序里面就只是多了一个COMMIT WORK,可是直接运行BAPI是不需要commitwork的,我也解释不了了这个原因。(蹲评论后续~)
最后,我只能说这个BAPI还是太极限了(哈哈哈哈),可以换成另一个BAPI使用BAPI_FIXEDASSET_CREATE1,两个BAPI差不多,但是后面这个BAPI的案例多一些,网上好找答案^_^
好了,以上~
二、代码
选择屏幕界面
GUI状态
EXCEL模板
字段有点多,EXCEL有两个截图。
代码如下
*&---------------------------------------------------------------------*
*& Report ZFIU2702
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfiu2702.
TABLES:sscrfields,t001.
TYPES:BEGIN OF ty_msg,
message LIKE bapiret2-message,
END OF ty_msg.
DATA:BEGIN OF it_doc OCCURS 0,
bukrs TYPE anla-bukrs, "公司代码
anlkl TYPE anla-anlkl, "资产分类
txt50 TYPE anla-txt50, "资产描述
txa50 TYPE anla-txa50, "附加资产描述
anlhtxt TYPE anlh-anlhtxt, "资产主号文本
sernr TYPE anla-sernr, "序列号 旧资产编号
* invnr TYPE anla-invnr, "存货号
menge TYPE anla-menge, "数量
meins TYPE anla-meins, "计量单位
aktiv TYPE anla-aktiv, "资产资本化日期
kostl TYPE anlz-kostl, "成本中心
* kostlv TYPE anlz-kostlv, "责任成本中心
*----- ADD NEW FIELD BY ZHANGYH 20210520 START --*
* werks TYPE anlz-werks, "工厂"
* stort TYPE anlz-stort, "位置" 字段变更 LI.XB 20210621
* ord41 TYPE anla-ord41, "增加方式"
* ord42 TYPE anla-ord42, "使用状况"
ord43 TYPE anla-ord43, "备用"
ord44 TYPE anla-ord44,
*----- ADD NEW FIELD BY ZHANGYH 20210520 END --*
* lifnr TYPE lifnr,
* herst TYPE herst,
afasl TYPE anlb-afasl, "折旧码
ndjar TYPE anlb-ndjar, "计划年使用期
ndper TYPE anlb-ndper, "计划使用期间
ndabj TYPE anlc-ndabj, "已经使用年
ndabp TYPE anlc-ndabp, "已经使用月
kansw TYPE anlc-kansw, "原值
knafa TYPE anlc-knafa, "以前年度折旧
nafag TYPE anlc-nafag, "当期年度折旧
* zfph TYPE string, "发票号长文本 "发票号删除 LI.XB 20231008
* zzlocation TYPE anlu-zzlocation, "位置 字段新增 LI.XB 20210621
* zzcertificate_id TYPE anlu-zzcertificate_id, "证书号 字段新增 LI.XB 20210621
type TYPE c, "消息类型 字段新增 LI.XB 20210621
msg TYPE bapi_msg, "消息文本 字段新增 LI.XB 20210621
anln1 TYPE anlu-anln1, "资产编号 字段新增 LI.XB 20210621
* result TYPE char20, "运行结果
* error_msg TYPE TABLE OF ty_msg, "错误信息
* msg TYPE bapi_msg,
* tsl TYPE timestampl,
* num TYPE syst_tabix,
END OF it_doc.
*----->Used for call BAPI:BAPI_FIXEDASSET_OVRTAKE_CREATE
DATA:
gs_key TYPE bapi1022_key,
gs_generaldata TYPE bapi1022_feglg001,
gs_generaldatax TYPE bapi1022_feglg001x,
gs_timedepend TYPE bapi1022_feglg003,
gs_timedependx TYPE bapi1022_feglg003x,
gs_allocations TYPE bapi1022_feglg004,
gs_allocationsx TYPE bapi1022_feglg004x,
gs_leasing TYPE bapi1022_feglg005,
gs_leasingx TYPE bapi1022_feglg005x,
gs_origin TYPE bapi1022_feglg009,
gs_originx TYPE bapi1022_feglg009x,
gs_postinginfo TYPE bapi1022_feglg002,
gs_postinginfox TYPE bapi1022_feglg002x,
gs_inventory TYPE bapi1022_feglg011,
gs_inventoryx TYPE bapi1022_feglg011x,
gs_networthval TYPE bapi1022_feglg006,
gs_networthvalx TYPE bapi1022_feglg006x,
gs_realestate TYPE bapi1022_feglg007,
gs_realestatex TYPE bapi1022_feglg007x,
it_depreciation TYPE TABLE OF bapi1022_dep_areas,
gs_depreciation TYPE bapi1022_dep_areas,
it_depreciationx TYPE TABLE OF bapi1022_dep_areasx,
gs_depreciationx TYPE bapi1022_dep_areasx,
it_transactions TYPE TABLE OF bapi1022_trtype,
gs_transactions TYPE bapi1022_trtype,
it_postedvalues TYPE TABLE OF bapi1022_postval,
gs_postedvalues TYPE bapi1022_postval,
it_cumulated TYPE TABLE OF bapi1022_cumval,
gs_cumulated TYPE bapi1022_cumval,
it_proportion TYPE TABLE OF bapi1022_propval,
gs_proportion TYPE bapi1022_propval,
it_postingh TYPE TABLE OF bapi1022_postingheader,
gs_postingh TYPE bapi1022_postingheader,
gt_investacctassignmnt TYPE TABLE OF bapi1022_feglg010,
gs_investacctassignmnt TYPE bapi1022_feglg010,
gt_investacctassignmntx TYPE TABLE OF bapi1022_feglg010x,
gs_investacctassignmntx TYPE bapi1022_feglg010x,
it_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
gs_return TYPE bapiret2,
gv_assetcreated TYPE bapi1022_reference,
gv_asset TYPE bapi1022_1-assetmaino.
TYPES:BEGIN OF ty_t093c,
bukrs TYPE t093c-bukrs,
datum TYPE t093c-datum,
END OF ty_t093c.
CONSTANTS:
con_x TYPE char01 VALUE 'X',
con_1 TYPE bf_lnran VALUE '1',
con_01 TYPE bf_afabe_d VALUE '01',
con_02 TYPE bf_afabe_d VALUE '32',
con_cny TYPE waers VALUE 'CNY',
con_ae TYPE char02 VALUE 'AE'.
*------ALV
DATA:
gt_fcat1 TYPE TABLE OF lvc_s_fcat,
gt_fcat2 TYPE TABLE OF lvc_s_fcat,
gs_fcat TYPE lvc_s_fcat,
gv_col TYPE lvc_colpos,
gs_layout TYPE lvc_s_layo.
DATA:gt_t093c TYPE TABLE OF ty_t093c,
gi_t093c TYPE ty_t093c.
DATA: gv_status TYPE c."数据处理状态
gs_layout-zebra = 'X'.
gs_layout-sel_mode = 'A'.
gs_layout-cwidth_opt = 'X'.
*&initialization DOC alv field
DEFINE m_add_fcat.
CLEAR gs_fcat.
gv_col = gv_col + 1.
gs_fcat-col_pos = gv_col.
gs_fcat-fieldname = &1.
gs_fcat-no_sign = ''.
gs_fcat-key = &2.
IF &3 IS INITIAL.
gs_fcat-colddictxt = gs_fcat-selddictxt = gs_fcat-tipddictxt = 'M'.
ELSE.
gs_fcat-scrtext_s = gs_fcat-scrtext_m = gs_fcat-scrtext_l = gs_fcat-coltext = &3.
ENDIF.
gs_fcat-ref_field = &4.
gs_fcat-ref_table = &5.
gs_fcat-outputlen = &6.
APPEND gs_fcat TO &7.
CLEAR gs_fcat.
END-OF-DEFINITION.
CONSTANTS:
cons_filefilter TYPE string VALUE 'Excel模版文件|*.XLSX|*.XLS',
cons_filetitle TYPE string VALUE '选择文件',
cons_initdir TYPE string VALUE ''. "'C:\'.
DATA: gs_function_key TYPE smp_dyntxt. "功能按钮
*----------------------------------------------------------------------*
*DATA: i_s_log TYPE bal_s_log.
*DATA: i_s_msg TYPE bal_s_msg.
*DATA: e_log_handle TYPE balloghndl.
*DATA: l_s_display_profile TYPE bal_s_prof.
**----------------------------------------------------------------------*
**赋值
**----------------------------------------------------------------------*
*i_s_log-extnumber = 'Application Log Demo'."外部编号
*i_s_log-object = 'ZGDZC_MSG'. "主对象
*i_s_log-subobject = 'ZGDZC_LOG'. "子对象
*i_s_log-aldate = sy-datum. "日期
*i_s_log-altime = sy-uzeit. "时间
*i_s_log-aluser = sy-uname. "用户
*i_s_log-alprog = sy-repid. "sy-repid.
SELECTION-SCREEN: FUNCTION KEY 1.
SELECTION-SCREEN: BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_file TYPE rlgrap-filename. "文件
PARAMETERS: p_test TYPE c AS CHECKBOX DEFAULT 'X' . "测试运行
SELECTION-SCREEN: END OF BLOCK bk1.
*-----------------------------------------------------------------------
* INITIALIZATION
*-----------------------------------------------------------------------
INITIALIZATION.
* 工具栏添加下载模板按钮
CLEAR gs_function_key.
gs_function_key-icon_id = icon_read_file.
gs_function_key-icon_text = '模版下载'.
gs_function_key-quickinfo = '模版下载'.
sscrfields-functxt_01 = gs_function_key.
*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*-->下载模板
IF sscrfields-ucomm = 'FC01'.
PERFORM f_download_template.
sscrfields-ucomm = ''.
ENDIF.
*-----------------------------------------------------------------------
* At Selection Screen
*-----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM f_f4_filename.
*-----------------------------------------------------------------------
* START-OF-SELECTION
*-----------------------------------------------------------------------
START-OF-SELECTION.
PERFORM f_clear_values.
*-->读取Excel文件
PERFORM f_read_excel.
PERFORM auth_check.
* IF p_test NE 'X'.
* gv_status = 'X'.
* ENDIF.
*处理流程调整 LI.XB 20210621 START
* IF p_test = 'X'. "测试运行
**-->显示处理结果
* PERFORM f_alv_data.
*
* ELSE. "正式运行
**-->处理数据并call bapi产生固定资产卡片
* PERFORM f_process_data.
* ENDIF.
*-->处理数据并call bapi产生固定资产卡片
IF p_test EQ con_x.
PERFORM f_process_data.
ENDIF.
*-->显示处理结果
PERFORM f_alv_data.
*处理流程调整 LI.XB 20210621 END
*&---------------------------------------------------------------------*
*& 包含 F_F4_FILENAME
*&---------------------------------------------------------------------*
FORM f_f4_filename .
****** *FIELDTABLE是一个表类型,描述文件名字的表
DATA: lt_filetab TYPE filetable,
ls_waftab LIKE LINE OF lt_filetab,
lv_rc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = '打开文件'
* DEFAULT_EXTENSION =
* DEFAULT_FILENAME =
* FILE_FILTER =
* WITH_ENCODING =
initial_directory = 'C:/'
* MULTISELECTION =
CHANGING
file_table = lt_filetab
rc = lv_rc
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
**** *调用系统的消息类
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ELSE.
READ TABLE lt_filetab INTO ls_waftab INDEX 1.
p_file = ls_waftab-filename.
CLEAR: lt_filetab,
ls_waftab.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM F_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
FORM f_download_template .
* 相关变量定义
DATA:lo_objdata LIKE wwwdatatab,
lo_mime LIKE w3mime,
lv_filename TYPE string VALUE '固定资产导入模板',
lv_fullpath TYPE string VALUE 'C:\',
lv_path TYPE string VALUE 'C:\',
ls_destination LIKE rlgrap-filename,
ls_objnam TYPE string,
lv_rc LIKE sy-subrc,
ls_errtxt TYPE string,
lv_objid TYPE wwwdatatab-objid,
lv_dest LIKE sapb-sappfad.
* 模版上传的对象名
lv_objid = 'ZFIU2702'.
* 模板下载路径名
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = '固定资产导入模板'
default_extension = 'XLSX'
default_file_name = lv_filename
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5.
* 没有选择路径
IF lv_fullpath = ''.
MESSAGE '请选择正确的路径!' TYPE 'E'.
ELSE.
*- 路径名
lv_dest = lv_fullpath.
SELECT SINGLE
relid "IMPORT/EXPORT 记录中的区域
objid "SAP WWW 网关对象名
FROM wwwdata
INTO CORRESPONDING FIELDS OF lo_objdata
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = lv_objid.
IF sy-subrc <> 0 OR lo_objdata-objid IS INITIAL.
MESSAGE '没有获得模板数据' TYPE 'E'.
ENDIF.
ls_destination = lv_dest.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = lo_objdata
destination = ls_destination
IMPORTING
rc = lv_rc.
IF lv_rc <> 0.
MESSAGE '模板下载失败' TYPE 'E'.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM F_READ_EXCEL
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
FORM f_read_excel .
DATA:
lt_intern TYPE TABLE OF alsmex_tabline WITH HEADER LINE,
lv_index TYPE i,
lv_tabix LIKE sy-tabix.
FIELD-SYMBOLS:<fs>.
*上载EXCEL文件
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = 1
i_begin_row = 3
i_end_col = 26 "30 限制结束行 LI.XB 20210621 "发票号删除 LI.XB 20231008
i_end_row = 9999
TABLES
intern = lt_intern
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc NE 0.
* MESSAGE S002(ZMSG) WITH TEXT-001 DISPLAY LIKE 'E'.
MESSAGE '文件路径不能为空!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ELSE.
SORT lt_intern BY row col.
ENDIF.
LOOP AT lt_intern.
MOVE lt_intern-col TO lv_index.
ASSIGN COMPONENT lv_index OF STRUCTURE it_doc TO <fs>.
MOVE lt_intern-value TO <fs>.
CASE lv_index.
WHEN 2. "资产分类
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = it_doc-anlkl
IMPORTING
output = it_doc-anlkl.
WHEN 9. "单位
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = it_doc-meins
IMPORTING
output = it_doc-meins
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
WHEN 11. "成本中心
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = it_doc-kostl
IMPORTING
output = it_doc-kostl.
* WHEN 12. "责任成本中心
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = it_doc-kostlv
* IMPORTING
* output = it_doc-kostlv.
ENDCASE.
AT END OF row.
APPEND it_doc.
CLEAR it_doc.
ENDAT.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM F_PROCESS_DATA
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
FORM f_process_data .
DATA:lt_error TYPE TABLE OF bapi_msg.
* DATA:LT_ERROR TYPE BAPIRET2-MESSAGE.
DATA: lv_tabix LIKE sy-tabix.
DATA: ld_fisc_year TYPE bapi1022_cumval-fisc_year.
DATA: lv_str1 TYPE char50,
lv_txt TYPE char50,
lv_perc TYPE p DECIMALS 0,
lv_lines TYPE i.
DATA:lv_message TYPE string.
DATA:ls_extensionin LIKE bapiparex,
lt_extensionin LIKE TABLE OF bapiparex,
ls_bapi_te_anlu TYPE bapi_te_anlu.
* 初始化值--用于CALL BAPI
PERFORM f_init_bapi_call.
* CALL FUNCTION 'BAL_GLB_MEMORY_REFRESH'.
* CALL FUNCTION 'BAL_LOG_CREATE'
* EXPORTING
* i_s_log = i_s_log
* IMPORTING
* e_log_handle = e_log_handle
* EXCEPTIONS
* log_header_inconsistent = 1
* OTHERS = 2.
CLEAR lv_lines.
DESCRIBE TABLE it_doc LINES lv_lines.
" BREAK-POINT.
LOOP AT it_doc.
CLEAR:gs_key,gs_generaldata,gs_timedepend,gs_allocations,gs_origin,gs_postinginfo,gs_inventory,
gs_networthval,gs_realestate,gs_depreciation,gs_transactions,gs_postedvalues,gs_cumulated,
gs_proportion,gs_postingh,gv_asset,gs_investacctassignmnt,gs_investacctassignmntx.
REFRESH:it_depreciation,it_transactions,it_postedvalues,it_cumulated,it_proportion,it_postingh,it_return,gt_investacctassignmnt,gt_investacctassignmntx.
lv_tabix = sy-tabix.
CLEAR: lv_perc, lv_str1, lv_txt.
lv_perc = lv_tabix / lv_lines * 100.
lv_str1 = lv_perc.
CONDENSE lv_str1.
CONCATENATE '正在处理数据...,' lv_str1 '%'
INTO lv_txt.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = lv_perc
text = lv_txt.
*ADD BY GYX S--
IF it_doc-bukrs <> '1050'.
CALL FUNCTION 'AISCO_CALCULATE_FIRST_DAY'
EXPORTING
i_bukrs = it_doc-bukrs
IMPORTING
e_to_year = ld_fisc_year.
ELSE.
ld_fisc_year = '2025'.
ENDIF.
gs_key-companycode = it_doc-bukrs. "公司代码
SELECT SINGLE waers INTO @DATA(lv_waers) FROM t001 WHERE bukrs = @it_doc-bukrs.
GS_KEY-ASSET = it_doc-SERNR.
*->GENERALDATA
gs_generaldata-assetclass = it_doc-anlkl. "资产分类
gs_generaldata-descript = it_doc-txt50. "资产描述
gs_generaldata-descript2 = it_doc-txa50. "附加资产描述
gs_generaldata-main_descript = it_doc-anlhtxt."资产主号文本
IF it_doc-sernr IS NOT INITIAL.
gs_generaldata-serial_no = it_doc-sernr. "序列号
ENDIF.
IF it_doc-menge IS NOT INITIAL.
gs_generaldata-quantity = it_doc-menge. "数量
ENDIF.
IF it_doc-meins IS NOT INITIAL.
gs_generaldata-base_uom = it_doc-meins. "单位
ENDIF.
*新增供应商,制造商
* gs_origin-vendor_no = it_doc-lifnr.
* gs_origin-manufacturer = it_doc-herst.
*->POSTINGINFOMATION
gs_postinginfo-cap_date = it_doc-aktiv. "资产资本化日期
*->TIMEDEPENDENT
gs_timedepend-costcenter = it_doc-kostl. "成本中心
* -----ADD BY ZHANGYH 20210520 ADD NEW FIELD START --*
* GS_TIMEDEPEND-PLANT = IT_DOC-WERKS. "工厂
* GS_TIMEDEPEND-LOCATION = IT_DOC-STORT. "位置 字段变更 LI.XB 20210621
* gs_allocations-evalgroup1 = it_doc-ord41. "增加方式"
* gs_allocations-evalgroup2 = it_doc-ord42. "使用状况"
gs_allocations-evalgroup3 = it_doc-ord43. "备用"
gs_allocations-evalgroup4 = it_doc-ord44.
* -----ADD BY ZHANGYH 20210520 ADD NEW FIELD END --*
*---->折旧范围
gs_depreciation-area = con_01.
IF it_doc-afasl IS NOT INITIAL.
gs_depreciation-dep_key = it_doc-afasl. "折旧码
ENDIF.
IF it_doc-ndjar IS NOT INITIAL.
gs_depreciation-ulife_yrs = it_doc-ndjar. "使用年限
ENDIF.
IF it_doc-ndper IS NOT INITIAL.
gs_depreciation-ulife_prds = it_doc-ndper. "使用期间
ENDIF.
gs_depreciation-exp_ulife_yrs = it_doc-ndabj. "已经使用年
gs_depreciation-exp_ulife_prds = it_doc-ndabp."已经使用月
APPEND gs_depreciation TO it_depreciation.
CLEAR gs_depreciation.
*新增900资产交易类型 LI.XB 20231114
IF it_doc-anlkl = 'ZJ21' OR it_doc-anlkl = 'ZJ22' OR it_doc-anlkl = 'ZJ23'.
IF it_doc-aktiv(4) = ld_fisc_year. "当年资产化
* 购置价
gs_transactions-fisc_year = ld_fisc_year.
gs_transactions-area = con_01.
gs_transactions-current_no = '00001'.
gs_transactions-amount = it_doc-kansw. "资产原值
gs_transactions-assettrtyp = '100'. "资产交易类型 外部购入
gs_transactions-valuedate = it_doc-aktiv.
gs_transactions-currency = lv_waers.
APPEND gs_transactions TO it_transactions.
CLEAR gs_transactions.
ELSE.
gs_transactions-fisc_year = ld_fisc_year.
gs_transactions-area = con_01.
gs_transactions-current_no = '00001'.
gs_transactions-amount = it_doc-kansw. "资产原值
gs_transactions-assettrtyp = '900'. "资产交易类型 外部购入
* IF it_doc-aktiv(4) < ld_fisc_year.
* gs_transactions-valuedate = ld_fisc_year && '0101'.
* ELSE.
* gs_transactions-valuedate = it_doc-aktiv.
* ENDIF.
SELECT SINGLE datum INTO gs_transactions-valuedate
FROM t093c WHERE bukrs = it_doc-bukrs.
IF gs_transactions-valuedate+4(4) = '1231'.
gs_transactions-valuedate = gs_transactions-valuedate + 1.
ELSE.
gs_transactions-valuedate = gs_transactions-valuedate+0(4) && '0101'.
* gs_transactions-valuedate = gs_transactions-valuedate.
ENDIF.
gs_transactions-currency = lv_waers.
APPEND gs_transactions TO it_transactions.
CLEAR gs_transactions.
ENDIF.
ELSE.
IF it_doc-aktiv(4) = ld_fisc_year. "当年资产化
* 购置价
gs_transactions-fisc_year = ld_fisc_year.
gs_transactions-area = con_01.
gs_transactions-current_no = '00001'.
gs_transactions-amount = it_doc-kansw. "资产原值
gs_transactions-assettrtyp = '100'. "资产交易类型 外部购入
gs_transactions-valuedate = it_doc-aktiv.
gs_transactions-currency = lv_waers.
APPEND gs_transactions TO it_transactions.
CLEAR gs_transactions.
ELSE. "往年资产化
* 购置价、往年累计折旧
gs_cumulated-fisc_year = ld_fisc_year.
gs_cumulated-area = con_01.
gs_cumulated-acq_value = it_doc-kansw. "资产原值
gs_cumulated-ord_dep = it_doc-knafa * -1. "资产以前年度折旧
gs_cumulated-currency = lv_waers.
APPEND gs_cumulated TO it_cumulated.
CLEAR gs_cumulated.
ENDIF.
ENDIF.
IF it_doc-nafag IS NOT INITIAL.
gs_postedvalues-fisc_year = ld_fisc_year.
gs_postedvalues-area = con_01.
gs_postedvalues-ord_dep = it_doc-nafag * -1. "当年折旧值
gs_postedvalues-currency = lv_waers.
APPEND gs_postedvalues TO it_postedvalues.
CLEAR gs_postedvalues.
ENDIF.
SET UPDATE TASK LOCAL.
CALL FUNCTION 'BAPI_FIXEDASSET_OVRTAKE_CREATE'
EXPORTING
key = gs_key
testrun = p_test
generaldata = gs_generaldata
generaldatax = gs_generaldatax
* INVENTORY = GS_INVENTORY
* INVENTORYX = GS_INVENTORYX
postinginformation = gs_postinginfo
postinginformationx = gs_postinginfox
timedependentdata = gs_timedepend
timedependentdatax = gs_timedependx
* -----ADD BY ZHANGYH 20210520 ADD NEW FIELD START --*
allocations = gs_allocations
allocationsx = gs_allocationsx
* -----ADD BY ZHANGYH 20210520 ADD NEW FIELD END --*
origin = gs_origin
originx = gs_originx
IMPORTING
asset = gv_asset
assetcreated = gv_assetcreated
TABLES
depreciationareas = it_depreciation
depreciationareasx = it_depreciationx
cumulatedvalues = it_cumulated
postedvalues = it_postedvalues
transactions = it_transactions
* extensionin = lt_extensionin
return = it_return.
CLEAR:lv_message.
LOOP AT it_return INTO gs_return WHERE type CA con_ae.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = gs_return-id
msgnr = gs_return-number
msgv1 = gs_return-message_v1
msgv2 = gs_return-message_v2
msgv3 = gs_return-message_v3
msgv4 = gs_return-message_v4
IMPORTING
message_text_output = lv_message.
CONCATENATE it_doc-msg lv_message INTO it_doc-msg.
ENDLOOP.
IF sy-subrc = 0.
it_doc-type = 'E'.
IF p_test EQ con_x.
it_doc-msg = '数据测试导入失败:' && it_doc-msg.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
it_doc-msg = '数据导入失败:' && it_doc-msg.
ENDIF.
ELSE.
it_doc-type = 'S'.
IF p_test EQ con_x.
it_doc-msg = '数据测试导入成功'.
ELSE.
COMMIT WORK AND WAIT.
it_doc-msg = '数据导入成功'.
it_doc-anln1 = gv_asset.
*****************************************************************************************************
"写入长文本
DATA:ls_theader TYPE thead, "长文本的HEAD
lt_lines TYPE TABLE OF tline,
ls_lines TYPE tline.
ENDIF.
ENDIF.
MODIFY it_doc INDEX lv_tabix TRANSPORTING type msg anln1.
CLEAR: it_doc,gv_assetcreated.
*处理返回消息 LI.XB 20210621 END
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM F_INIT_BAPI_CALL
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
FORM f_init_bapi_call .
gs_generaldatax-assetclass = con_x."资产分类
gs_generaldatax-descript = con_x."资产描述
gs_generaldatax-descript2 = con_x."附加资产描述
gs_generaldatax-serial_no = con_x."序列号
gs_generaldatax-invent_no = con_x."存货号
gs_generaldatax-quantity = con_x. "数量
gs_generaldatax-base_uom = con_x."单位
gs_generaldatax-main_descript = con_x."资产主号文本
* GS_INVENTORYX-DATE = CON_X.
gs_postinginfox-cap_date = con_x."资产资本化日期
gs_timedependx-costcenter = con_x. "成本中心
* gs_timedependx-resp_cctr = con_x."责任成本中心
* -----ADD BY ZHANGYH 20210520 ADD NEW FIELD START ----*
* GS_TIMEDEPENDX-PLANT = CON_X."工厂
* gs_timedependx-location = con_x."位置
* gs_allocationsx-evalgroup1 = con_x.
* gs_allocationsx-evalgroup2 = con_x.
gs_allocationsx-evalgroup3 = con_x.
gs_allocationsx-evalgroup4 = con_x.
gs_depreciationx-area = con_01.
gs_depreciationx-dep_key = con_x. "折旧码
* GS_DEPRECIATIONX-ODEP_START_DATE = CON_X.
*注释 BY GYX S---
**** gs_depreciationx-ulife_yrs = con_x."使用年限
**** gs_depreciationx-ulife_prds = con_x."使用期间
**** gs_depreciation-exp_ulife_yrs = con_x."已经使用年
**** gs_depreciation-exp_ulife_prds = con_x."已经使用月
*注释 BY GYX E----
APPEND gs_depreciationx TO it_depreciationx.
CLEAR gs_depreciationx.
* gs_originx-vendor_no = con_x."供应商
* gs_originx-manufacturer = con_x."制造商
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM F_ALV_DATA
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
FORM f_alv_data .
PERFORM f_build_fieldcat1.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'F_SET_STATUS'
i_callback_user_command = 'F_USER_COMMAND'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fcat1
i_default = con_x
i_save = con_x
TABLES
t_outtab = it_doc
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE s000(zmsg) WITH 'ALV初始化时出现错误'.
STOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM F_BUILD_FIELDCAT1
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
FORM f_build_fieldcat1 .
CLEAR:gv_col.
REFRESH:gt_fcat1.
m_add_fcat:
" 'RESULT' 'X' '运行结果' '' '' '' GT_FCAT1,
'BUKRS' '' '公司代码' 'BUKRS' 'ANLA' '' gt_fcat1,
'ANLKL' '' '资产分类' 'ANLKL' 'ANLA' '' gt_fcat1,
'TXT50' '' '资产描述' 'TXT50' 'ANLA' '' gt_fcat1,
'TXA50' '' '附加资产描述' 'TXA50' 'ANLA' '' gt_fcat1,
'ANLHTXT' '' '资产主号文本' 'ANLHTXT' 'ANLH' '' gt_fcat1,
'SERNR' '' '序列号 ' 'SERNR' 'ANLA' '' gt_fcat1,
* 'INVNR' '' '存货号 旧资产编号' 'INVNR' 'ANLA' '' gt_fcat1,
'MENGE' '' '数量' 'MENGE' 'ANLA' '' gt_fcat1,
'MEINS' '' '单位' 'MEINS' 'ANLA' '' gt_fcat1,
'AKTIV' '' '资产资本化日期' 'AKTIV' 'ANLA' '' gt_fcat1,
'KOSTL' '' '成本中心' 'KOSTL' 'ANLZ' '' gt_fcat1,
* 'KOSTLV' '' '责任成本中心' 'KOSTLV' 'ANLZ' '' gt_fcat1,
* 'WERKS' '' '工厂' 'WERKS' 'ANLZ' '' gt_fcat1,
* 'STORT' '' '位置' 'STORT' 'ANLZ' '' GT_FCAT1,
* 'ORD41' '' '增加方式' 'ORD41' 'ANLA' '' gt_fcat1,
* 'ORD42' '' '使用状况' 'ORD42' 'ANLA' '' gt_fcat1,
'ORD43' '' '评审字段3' 'ORD43' 'ANLA' '' gt_fcat1,
'ORD44' '' '评审字段4' 'ORD44' 'ANLA' '' gt_fcat1,
* 'LIFNR' '' '供应商' 'ORD43' 'ANLA' '' gt_fcat1,
* 'HERST' '' '制造商' 'ORD43' 'ANLA' '' gt_fcat1,
'AFASL' '' '折旧码' 'AFASL' 'ANLB' '' gt_fcat1,
'NDJAR' '' '计划年使用期' 'NDJAR' 'ANLB' '' gt_fcat1,
'NDPER' '' '计划使用期间' 'NDPER' 'ANLB' '' gt_fcat1,
'NDABJ' '' '已经使用年' 'NDABJ' 'ANLC' '' gt_fcat1,
'NDABP' '' '已经使用月' 'NDABP' 'ANLC' '' gt_fcat1,
'KANSW' '' '原值' 'KANSW' 'ANLC' '' gt_fcat1,
'KNAFA' '' '以前年度折旧' 'KNAFA' 'ANLC' '' gt_fcat1,
'NAFAG' '' '当期年度折旧' 'NAFAG' 'ANLC' '' gt_fcat1,
* 'ZZLOCATION' '' '位置' 'ZZLOCATION' 'ANLU' '' GT_FCAT1,"字段新增 LI.XB 20210621
* 'ZZCERTIFICATE_ID' '' '证书号' 'ZZCERTIFICATE_ID' 'ANLU' '' GT_FCAT1,"字段新增 LI.XB 20210621
'TYPE' '' '消息类型' '' '' '' gt_fcat1,"字段新增 LI.XB 20210621
'MSG' '' '消息文本' '' '' '' gt_fcat1,"字段新增 LI.XB 20210621
'ANLN1' '' '资产编号' 'ANLN1' 'ANLU' '' gt_fcat1."字段新增 LI.XB 20210621
* 'ZFPH' '' '发票号' '' '' '' gt_fcat1."字段新增 LI.XB 20210621 "发票号删除 LI.XB 20231008
ENDFORM.
*&--------------------------------------------------------------------*
*& FORM SET_PF_STATUS
*&--------------------------------------------------------------------*
* TEXT
*---------------------------------------------------------------------*
FORM f_set_status USING rt_extab TYPE slis_t_extab.
DATA:lv_value TYPE string.
SET PF-STATUS 'STANDARD'.
IF p_test = 'X'.
lv_value = '测试运行'.
* ELSE.
* LV_VALUE = '实际执行'.
ENDIF.
SET TITLEBAR 'T001' WITH lv_value.
ENDFORM. "F_SET_STATUS
*&--------------------------------------------------------------------*
*& FORM F_USER_COMMAND
*&--------------------------------------------------------------------*
* TEXT
*---------------------------------------------------------------------*
FORM f_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lo_valid,
lo_guid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_guid.
CALL METHOD lo_guid->check_changed_data
IMPORTING
e_valid = lo_valid.
CASE r_ucomm.
WHEN 'IMPORT'.
PERFORM f_process_data.
ENDCASE.
rs_selfield-refresh = 'X'.
ENDFORM. "F_USER_COMMAND
*&---------------------------------------------------------------------*
*& FORM F_CLEAR_VALUES
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
FORM f_clear_values .
REFRESH it_doc. CLEAR:it_doc.
CLEAR gv_status.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form AUTH_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM auth_check .
* DATA:LS_LIST TYPE LINE OF it_doc.
DATA lt_excel LIKE TABLE OF it_doc.
APPEND LINES OF it_doc TO lt_excel .
SORT lt_excel BY bukrs.
DELETE ADJACENT DUPLICATES FROM lt_excel COMPARING bukrs.
DATA(lv_n) = lines( lt_excel ).
IF lv_n > 1.
MESSAGE '存在不一致的公司代码,请检查数据!' TYPE 'E'.
ELSE.
ENDIF.
ENDFORM.
三、总结
虽然这个代码BUG很多,但是它可以不分往年和今年的资产,全部都可以一次性导入,操作比较简单,有个测试运行选项,在使用的时候先导入进入测试一下,没报错之后再用GUI状态的按钮进行数据导入,一条数据有错的话全部数据都会回滚。
代码主要是看调用BAPI时的参数的设置,批导程序的代码的话,可以看我的另一个文章,比较全面