您的位置:首页 > 其它

ct04特性批量导入、特性长文本批量导入(BAPI_CHARACT_CREATE、BAPI_CHARACT_CHANGE、BAPI_CHARACT_ADDLONGTEXT)

2016-05-30 18:58 344 查看
*&---------------------------------------------------------------------*
*& REPORT  ZPP_CHARACT_IMPORT
*&
*& REPORTNAME   :特性值批导程序
*&---------------------------------------------------------------------*
*& CREATED BY   : LIUXINYUAN
*& CREATED DATE : 2016-05-25
*&---------------------------------------------------------------------*

REPORT zpp_charact_import.

TYPE-POOLS:slis.
TYPE-POOLS:icon.

TABLES:marc.
TYPE-POOLS:tpit.
DATA:it_tab TYPE truxs_t_text_data.
TYPES:BEGIN OF ty_itab,

      code(30),

      name(30),

      type(4),

      lenth(2),

      must(1),

      dec(2),

      unit(3),

      value(30),

      value_n(3000),
END OF ty_itab.
**定义一个带有HEADER LINE的内存表ITAB
DATA:itab TYPE TABLE OF ty_itab WITH HEADER LINE.
DATA:tt_itab TYPE TABLE OF ty_itab WITH HEADER LINE.
DATA:wa_itab TYPE ty_itab.
FIELD-SYMBOLS:<fs_itab> TYPE ty_itab.

TYPES:BEGIN OF ty_itab1,

      code(30),

      name(30),

      type(4),

      lenth(2),

      must(1),

      dec(2),

      unit(3),

      value(30),

      value_n(30),

      result(1),

      message(200),
END OF ty_itab1.

DATA:lt_itab TYPE TABLE OF ty_itab1 WITH HEADER LINE.

DATA:BEGIN OF gt_cawn OCCURS 0,
*        atinn LIKE caBn-atinn,
*        adzhl LIKE caBn-adzhl,

        atnam LIKE cabn-atnam,

        atinn LIKE cawn-atinn,

        atzhl LIKE cawn-atzhl,

        adzhl LIKE cawn-adzhl,

        atwrt LIKE cawn-atwrt,

      END OF gt_cawn.
*DATA:gt_cabn_tmp LIKE TABLE OF gt_cabn WITH HEADER LINE.

DATA:g_info TYPE string.

DATA:charactdetail LIKE bapicharactdetail,

     changenumber  LIKE bapicharactkey-changenum,

     charactdescr  TYPE TABLE OF bapicharactdescr WITH HEADER LINE,

     charactvalueschar TYPE TABLE OF bapicharactvalueschar WITH HEADER LINE,

     charactvaluesdescr TYPE TABLE OF bapicharactvaluesdescr WITH HEADER LINE,

     return TYPE TABLE OF bapiret2 WITH HEADER LINE.

DATA:wa_ret               LIKE bapiret2,

     charactdetailnew     LIKE bapicharactdetail OCCURS 0,

     char_detail          LIKE bapicharactdetail,

     charactdescrnew      LIKE bapicharactdescr OCCURS 0,

     char_descr_new       LIKE bapicharactdescr,

     charactvaluescharnew LIKE bapicharactvalueschar OCCURS 0 WITH HEADER LINE,

     char_val_char        LIKE bapicharactvalueschar,

     charactvaluesnumnew  LIKE bapicharactvaluesnum OCCURS 0,

     char_val_num         LIKE bapicharactvaluesnum,

     charactvaluescurr    LIKE bapicharactvaluescurr OCCURS 0,

     charactvaluesdescrnew   LIKE bapicharactvaluesdescr OCCURS 0,

     "charactvaluesdescr   LIKE bapicharactvaluesdescr ,

     charactreferences    LIKE bapicharactreferences OCCURS 0,

     charactrestrictions  LIKE bapicharactrestrictions OCCURS 0.

DATA:lt_tline LIKE tline OCCURS 0 WITH HEADER LINE.

DATA:l_len TYPE i,

      l_linetxt(3000),

      l_txtlen TYPE i,

      l_entxt(1000),

      l_tabix TYPE i,

      l_count TYPE i.

*DATA:lv_txtname LIKE thead-tdname,
*     ls_header LIKE thead.

PARAMETER p_file LIKE rlgrap-filename DEFAULT 'C:\'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. "类似上传附件时的那个浏览按钮

******************初始屏幕结束**********************************************************************

******************批量导入的BAPI**********************************************************************

  CALL FUNCTION 'WS_FILENAME_GET'

    EXPORTING

      def_filename     = space

      def_path         = p_file

      mask             = text-001

      mode             = 'O'

    IMPORTING

      filename         = p_file

    EXCEPTIONS

      selection_cancel = 0.

START-OF-SELECTION.
*excel 数据导入

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'

    EXPORTING

      i_tab_raw_data       = it_tab

      i_filename           = p_file

    TABLES

      i_tab_converted_data = itab

    EXCEPTIONS

      conversion_failed    = 1

      OTHERS               = 2.

  IF sy-subrc <> 0.
* Implement suitable error handling here

  ELSE.

    DELETE itab INDEX 1.

  ENDIF.

  LOOP AT itab ASSIGNING <fs_itab>.

    TRANSLATE <fs_itab>-code TO UPPER CASE.

    TRANSLATE <fs_itab>-name TO UPPER CASE.

    TRANSLATE <fs_itab>-type TO UPPER CASE.

    TRANSLATE <fs_itab>-value TO UPPER CASE.

    TRANSLATE <fs_itab>-value_n TO UPPER CASE.

  ENDLOOP.

  REFRESH lt_itab.

  CLEAR lt_itab.

  SORT itab BY code.

  REFRESH tt_itab.

  CLEAR tt_itab.

  tt_itab[] = itab[].

* 把新增的记录和修改的记录分离(itab中存放新增记录;tt_itab中存放要修改的记录)

  SORT tt_itab BY code.

  LOOP AT tt_itab ASSIGNING <fs_itab>.

    REFRESH return.

    CLEAR return.

    CALL FUNCTION 'BAPI_CHARACT_EXISTENCECHECK'

      EXPORTING

        charactname = <fs_itab>-code

      TABLES

        return      = return.

    CLEAR return.

    READ TABLE return WITH KEY id = 'C1' number = '002'.

    IF sy-subrc EQ 0.

      DELETE itab WHERE code = <fs_itab>-code.

    ELSE.

      DELETE tt_itab.

      CONTINUE.

    ENDIF.

  ENDLOOP.

* --------以下代码创建特性值--------

  LOOP AT itab.

    MOVE-CORRESPONDING itab TO wa_itab.

    AT NEW code.

      CLEAR charactdetail.

      REFRESH charactdescr.

      CLEAR charactdescr.

      REFRESH charactvalueschar.

      CLEAR charactvalueschar.

      REFRESH charactvaluesdescr.

      CLEAR charactvaluesdescr.

      REFRESH return.

      CLEAR return.

      charactdetail-charact_name = wa_itab-code."'S_NF5220_2090_SASRAFJ'.

      charactdetail-data_type    = wa_itab-type."'CHAR'.

      charactdetail-length       = wa_itab-lenth."30.

      charactdetail-status       = 1.

      IF wa_itab-must = 'X'.

        charactdetail-entry_required = wa_itab-must.

      ENDIF.

      charactdescr-language_int   = sy-langu.

      charactdescr-language_iso   = 'ZH'.

      charactdescr-description    = wa_itab-name."'NF5220 外插SAS RAID卡'.

      APPEND charactdescr.

      CLEAR lt_itab.

      MOVE-CORRESPONDING wa_itab TO lt_itab.

    ENDAT.

    charactvalueschar-value_char = wa_itab-value."'0010_V064U040M1707000_BRE018'.

    APPEND charactvalueschar.

    charactvaluesdescr-language_int  = sy-langu.

    charactvaluesdescr-language_iso  = 'ZH'.

    charactvaluesdescr-value_char    = wa_itab-value."'0010_V064U040M1707000_BRE018'.

    charactvaluesdescr-description   = wa_itab-value_n."'A_4R0_5405_256M_MSAS300_PCIE_R'.

    APPEND charactvaluesdescr.

    AT END OF code.

      CALL FUNCTION 'BAPI_CHARACT_CREATE'

        EXPORTING

          charactdetail      = charactdetail

          changenumber       = changenumber

          keydate            = sy-datum

        TABLES

          charactdescr       = charactdescr

          charactvalueschar  = charactvalueschar

          charactvaluesdescr = charactvaluesdescr

          return             = return.

      CLEAR return.

      READ TABLE return WITH KEY type = 'E'.

      IF sy-subrc EQ 0.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        CLEAR g_info.

        CALL FUNCTION 'MESSAGE_TEXT_BUILD'

          EXPORTING

            msgid               = return-id

            msgnr               = return-number

            msgv1               = return-message_v1

            msgv2               = return-message_v2

            msgv3               = return-message_v3

            msgv4               = return-message_v4

          IMPORTING

            message_text_output = g_info.

        lt_itab-result = 'E'.

        lt_itab-message = g_info.

      ELSE.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

          EXPORTING

            wait = 'X'.

        lt_itab-result = 'S'.

        lt_itab-message = '创建特性值成功!'.

      ENDIF.

      APPEND lt_itab.

      CLEAR lt_itab.

    ENDAT.

  ENDLOOP.
* --------以上代码创建特性值--------

* --------以下代码修改特性值--------

  LOOP AT tt_itab.

    MOVE-CORRESPONDING tt_itab TO wa_itab.

    AT NEW code.

      REFRESH return.

      CLEAR return.

      CLEAR char_detail.

      CLEAR charactdescrnew.

      REFRESH charactdescrnew.

      CLEAR charactvaluesnumnew.

      REFRESH charactvaluesnumnew.

      CLEAR charactvaluescharnew.

      REFRESH charactvaluescharnew.

      CLEAR charactvaluescurr.

      REFRESH charactvaluescurr.

      CLEAR charactvaluesdescrnew.

      REFRESH charactvaluesdescrnew.

      CLEAR charactreferences.

      REFRESH charactreferences.

      CLEAR charactrestrictions.

      REFRESH charactrestrictions.

      CALL FUNCTION 'BAPI_CHARACT_GETDETAIL'

        EXPORTING

          charactname         = wa_itab-code

        IMPORTING

          charactdetail       = char_detail

        TABLES

          charactdescr        = charactdescrnew

          charactvaluesnum    = charactvaluesnumnew

          charactvalueschar   = charactvaluescharnew

          charactvaluescurr   = charactvaluescurr

          charactvaluesdescr  = charactvaluesdescrnew

          charactreferences   = charactreferences

          charactrestrictions = charactrestrictions

          return              = return.

      APPEND char_detail TO charactdetailnew.

      CLEAR lt_itab.

      MOVE-CORRESPONDING wa_itab TO lt_itab.

    ENDAT.

    CLEAR charactvaluescharnew.

    READ TABLE charactvaluescharnew WITH KEY  value_char = wa_itab-value.

    IF sy-subrc NE 0.

      CLEAR char_val_char.

      char_val_char-value_char = wa_itab-value.

      APPEND char_val_char TO charactvaluescharnew.

      CLEAR charactvaluesdescr.

      charactvaluesdescr-language_int            = sy-langu.

      WRITE  charactvaluesdescr-language_int  TO charactvaluesdescr-language_iso.

      charactvaluesdescr-value_char              =  wa_itab-value.

      charactvaluesdescr-description         = wa_itab-value_n.

      APPEND charactvaluesdescr TO charactvaluesdescrnew.

    ENDIF.

    AT END OF code.

      CALL FUNCTION 'ZBAPI_CHARACT_CHANGE'

        EXPORTING

          charactname           = wa_itab-code

          is_change             = 'X'

        TABLES

          charactdetailnew      = charactdetailnew

          charactdescrnew       = charactdescrnew

          charactvaluescharnew  = charactvaluescharnew

          charactvaluesdescrnew = charactvaluesdescrnew

          return                = return.

      CLEAR return.

      READ TABLE return WITH KEY type = 'E'.

      IF sy-subrc EQ 0.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        CLEAR g_info.

        CALL FUNCTION 'MESSAGE_TEXT_BUILD'

          EXPORTING

            msgid               = return-id

            msgnr               = return-number

            msgv1               = return-message_v1

            msgv2               = return-message_v2

            msgv3               = return-message_v3

            msgv4               = return-message_v4

          IMPORTING

            message_text_output = g_info.

        lt_itab-result = 'E'.

        lt_itab-message = g_info.

      ELSE.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

          EXPORTING

            wait = 'X'.

        lt_itab-result = 'S'.

        lt_itab-message = '修改特性值成功!'.

      ENDIF.

      APPEND lt_itab.

      CLEAR lt_itab.

    ENDAT.

  ENDLOOP.
* --------以上代码修改特性值--------

  CLEAR itab.

  LOOP AT tt_itab.

    MOVE-CORRESPONDING tt_itab TO itab.

    APPEND itab.

    CLEAR itab.

  ENDLOOP.

  LOOP AT lt_itab WHERE result = 'E'.

    DELETE itab WHERE code = lt_itab-code.

  ENDLOOP.

  IF itab[] IS NOT INITIAL.

    PERFORM frm_txt_create.

  ENDIF.

  IF lt_itab[] IS NOT INITIAL.

    PERFORM frm_download.

    MESSAGE '特性批导结果已保存到C盘根目录下,请查看!' TYPE 'I'.

  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_download .

  DATA:lv_filename TYPE string.

  CLEAR lv_filename.

  CONCATENATE 'C:/特性批导结果表' sy-datum sy-uzeit '.TXT' INTO lv_filename.

  CALL FUNCTION 'GUI_DOWNLOAD'

    EXPORTING

      filename = lv_filename

      filetype = 'ASC'

      append   = ' '

    TABLES

      data_tab = lt_itab.

  IF sy-subrc <> 0.

  ENDIF.
ENDFORM.                    "FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*&      Form  FRM_TXT_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_txt_create .

*--------以下代码新增特性长文本--------

  REFRESH gt_cawn.

  CLEAR gt_cawn.

  SELECT b~atnam

         a~atinn

         a~atzhl

         a~adzhl

         a~atwrt

         INTO TABLE gt_cawn

         FROM cawn AS a INNER JOIN cabn AS b ON a~atinn = b~atinn AND a~adzhl = b~adzhl

         FOR ALL ENTRIES IN itab

         WHERE b~atnam = itab-code.

  LOOP AT itab ASSIGNING <fs_itab>.

    IF strlen( <fs_itab>-value_n ) > 30.

      CLEAR gt_cawn.

      READ TABLE gt_cawn WITH KEY atnam = <fs_itab>-code atwrt = <fs_itab>-value.

      IF sy-subrc EQ 0.

        REFRESH lt_tline.

        CLEAR lt_tline.

        CLEAR l_entxt.

        l_entxt = <fs_itab>-value_n+30(2700).

        IF l_entxt(1) EQ '"'.

          SHIFT  l_entxt LEFT DELETING LEADING '"'.

          l_txtlen = strlen( l_entxt ) - 1.

          IF l_txtlen > 0.

            IF l_entxt+l_txtlen(1) EQ '"'.

              l_entxt = l_entxt+0(l_txtlen).

            ENDIF.

          ENDIF.

        ENDIF.

        WHILE l_entxt IS NOT INITIAL.

          lt_tline-tdformat = '*'.

          SPLIT l_entxt AT cl_abap_char_utilities=>newline  INTO l_linetxt l_entxt.

          l_len = strlen( l_linetxt ).

          WHILE l_len > 132.

            lt_tline-tdline = l_linetxt+l_count(132).

            APPEND lt_tline.

            l_count = l_count + 132.

            l_len = l_len - 132.

            lt_tline-tdformat = ''.

          ENDWHILE.

          IF l_len > 0.

            lt_tline-tdline = l_linetxt+l_count(l_len).

            APPEND lt_tline.

          ENDIF.

          CLEAR l_linetxt.

        ENDWHILE.

        REFRESH return.

        CLEAR return.

        CALL FUNCTION 'BAPI_CHARACT_ADDLONGTEXT'

          EXPORTING

            charactname  = <fs_itab>-code

            value_char   = <fs_itab>-value

            keydate      = sy-datum

            language_iso = 'ZH'

          TABLES

            longtext     = lt_tline

            return       = return.

        CLEAR return.

        READ TABLE return WITH KEY type = 'E'.

        IF sy-subrc EQ 0.

          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        ELSE.

          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

            EXPORTING

              wait = 'X'.

        ENDIF.

      ENDIF.

    ENDIF.

  ENDLOOP.
*--------以上代码新增特性长文本--------

ENDFORM.                    " FRM_TXT_CREATE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: