关闭

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

标签: ct04特性批量导入特性长文本批量导入BAPI_CHARACT_CREATEBAPI_CHARACT_CHANGEBAPI_CHARACT_ADDLONG
988人阅读 评论(0) 收藏 举报
分类:
*&---------------------------------------------------------------------*
*& 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(1EQ '"'.
          SHIFT  l_entxt LEFT DELETING LEADING '"'.
          l_txtlen = strlen( l_entxt ) - 1.
          IF l_txtlen > 0.
            IF l_entxt+l_txtlen(1EQ '"'.
              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
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:812497次
    • 积分:11848
    • 等级:
    • 排名:第1248名
    • 原创:339篇
    • 转载:221篇
    • 译文:0篇
    • 评论:50条
    文章存档
    最新评论