【业务案例】+ 资产主数据批导程序的一些报错——BAPI_FIXEDASSET_OVRTAKE_CREATE

目录

前言:

一、BUG分析

报错一:旧数据接管的会计年度未确定

报错二:输入号码在 S00000000000 和 S99999999999 之间的资产号码

报错三:使用年限期间数必须小于会计年度变式中的期间数

报错四:BAPI创建成功,但是AS03查询不到

报错五:为什么会出现上述问题四的情况

二、代码

选择屏幕界面

GUI状态

EXCEL模板

代码如下


前言:

在上项目之前,业务顾问会提供一些字段,让用户根据模板提供业务上面的数据,然后据此作为期初数据批量导入到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时的参数的设置,批导程序的代码的话,可以看我的另一个文章,比较全面

ABAP小白开发操作手册+(五)新增批导程序_abap教程-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值