长文本

维护长文本对象

SO10

 

READ_TEXT

长文本可以用函数 READ_TEXT 取出

perform frm_text_get using 'VBBK' gt_head-vbeln 'Z005' changing gt_head-text1.

form frm_text_get  using uv_object

                        uv_name

                        uv_id

               changing cv_text.

  data:

    lv_object like thead-tdobject,

    lv_name   like thead-tdname,

    lv_id     like thead-tdid,

    lt_lines  like table of tline with header line.

 

  lv_object = uv_object.

  lv_name = uv_name.

  lv_id = uv_id.

 

  call function 'READ_TEXT'

    exporting

      id                      = lv_id

      language                = sy-langu

      name                    = lv_name

      object                  = lv_object

    tables

      lines                   = lt_lines

    exceptions

      id                      = 1

      language                = 2

      name                    = 3

      not_found               = 4

      object                  = 5

      reference_check         = 6

      wrong_access_to_archive = 7

      others                  = 8.

  if sy-subrc <> 0.

* Implement suitable error handling here

  endif.

 

  loop at lt_lines.

    cv_text = cv_text && lt_lines-tdline.

  endloop.

 

endform.

  • READ_TEXT在查不到对应的长文本时会报错(E),所以要先判断长文本是否存在

判断有没有长文本的方法(查看STXL中是否有TDNAME)

  • 查看长文本抬头方法:双击文本编辑器(或点击‘编辑器’按钮),进入WORD编辑模式,转到表头,查看长文本信息

也可以在FUNCTION READ_TEXT中打断点,调试得出

在读取长文本时,LINES中TDLINE的长度刚好是长文本的一行    

  • 采购订单长文本可以用BAPI读出

DATA: IT_POTXT LIKE TABLE OF BAPIEKPOTX WITH HEADER LINE ."订单项目文本

CALL FUNCTION 'BAPI_PO_GETDETAIL'

EXPORTING

PURCHASEORDER = ITAB_PAGECTRL-EBELN

ITEM_TEXTS = 'X'

TABLES

PO_ITEM_TEXTS = IT_POTXT.

 

SAVE_TXT 保存长文本

注:如果文本对象和name不存在,使 用SAVE_TXT是不行的,必须要用CREATE_TEXT

不写savemode_direct = 'X' 时有个BUG,第二次写入的行长度小于第一行时,末尾会有一部分字符没有改掉;第二次写入的行数少于第一次时,第一次多出来的部分不会被清空掉

perform set_text using 'KNA1' kunnr 'Z001' is_generaldata-z001.

form set_text  using uv_object

      uv_name

      uv_id

      uv_text.

 

  data:

    ls_header type thead,

    ls_stxl like stxl,

    lt_ltxts  type standard table of tline with header line.

 

  ls_header-tdobject = uv_object .

  ls_header-tdid      = uv_id.

  ls_header-tdspras   = '1'.

  ls_header-tdname    = uv_name.

 

  lt_ltxts-tdformat = '*'.

  lt_ltxts-tdline = uv_text.

  append lt_ltxts.

 

  select single *

    into ls_stxl

    from stxl

    where tdobject = uv_object and tdid = uv_id and tdspras = '1' and tdname = uv_name.

  if sy-subrc = 0.

    call function 'SAVE_TEXT'

      exporting

        client   = sy-mandt

        header   = ls_header

        savemode_direct = 'X'

      tables

        lines    = lt_ltxts

      exceptions

        id       = 1

        language = 2

        name     = 3

        object   = 4

        others   = 5.

    if sy-subrc = 0.

    endif.

  else.

    call function 'CREATE_TEXT'

      exporting

        fid       = ls_header-tdid

        flanguage = '1'

        fname     = ls_header-tdname

        fobject   = ls_header-tdobject

*       SAVE_DIRECT       = 'X'

*       FFORMAT   = '*'

      tables

        flines    = lt_ltxts

      exceptions

        no_init   = 1

        no_save   = 2

        others    = 3.

  endif.

 

 

endform.

 

长文本是以LRAW类型存在STXL表中的,在使用函数SAVE_TEXT时,就自动实现了文本到LRAW的转换和储存

注意:在有些业务中,比如保存生产订单长文本,需要savemode_direct = 'X',且保存完了之后,修改AUFK的LTEXT = SY-LANGU。

 

长文本控件

查看例子:输入SAPTEXTEDIT*,F4,选择一个例子,如SAPTEXTEDIT_DEMO_3

 

拆分长字符串,防止自己拆乱码

SWA_STRING_SPLIT

 

长文本控件代码

 

......

DATA:BEGIN OF IT_TEXT OCCURS 0, "长文本内表

  LINE(220), "可自定义长度,220为SMARTFORMS文本最大输出长度

  END OF IT_TEXT.

 

DATA LONG_TEXT(440).

 

DATA:

      CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,

      EDITOR TYPE REF TO CL_GUI_TEXTEDIT.

 

MODULE STATUS_2001 OUTPUT.

  SET PF-STATUS '2001'.

  SET TITLEBAR '2001'.

 

  IF CONTAINER IS INITIAL.

    CREATE OBJECT CONTAINER

      EXPORTING

        CONTAINER_NAME = 'TEXT_EDITOR'.

 

    CREATE OBJECT EDITOR

      EXPORTING

        MAX_NUMBER_CHARS           = 220

        STYLE                      = 0 "0显示,非0不显示

        PARENT                     = CONTAINER

        WORDWRAP_MODE              = CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION "自动截断长文本适应内表字段LINE长度

        WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>TRUE.

  ENDIF.

ENDMODULE.                 " STATUS_2001  OUTPUT

 

MODULE EXIT INPUT.

  CALL METHOD CONTAINER->FREE. "用METHOD FREE会清空对象,但没有清空地址

  CALL METHOD EDITOR->FREE.

  CLEAR:CONTAINER,EDITOR,IS_INPUT,LONG_TEXT.

  LEAVE TO SCREEN 0.

ENDMODULE.                 " EXIT  INPUT

 

MODULE USER_COMMAND_2001 INPUT.

  CALL METHOD EDITOR->GET_TEXT_AS_R3TABLE

    IMPORTING

      TABLE = IT_TEXT[]. "按换行位置分割,并非按LINE最大长度分割

 

  LOOP AT IT_TEXT.

    LONG_TEXT = LONG_TEXT && IT_TEXT-LINE.

  ENDLOOP.

 

  IS_INPUT-TEXT1 = LONG_TEXT+0(220).

  IS_INPUT-TEXT2 = LONG_TEXT+220(220).

ENDMODULE.                 " USER_COMMAND_2001  INPUT

......

 

批量取长文本

FORM GET_TEXT_BATCH . types: begin of ty_stxl, "项目

           tdobject type stxl-tdobject,

           tdid     type stxl-tdid,

           tdname   type stxl-tdname,

           clustr   type stxl-clustr,

           clustd   type stxl-clustd,

         end of ty_stxl.

 

  types: begin of ty_stxl_raw, "压缩的文本

           clustr type stxl-clustr,

           clustd type stxl-clustd,

         end of ty_stxl_raw.

 

  types:begin of ty_text, "解压的文本

          tdobject type stxl-tdobject,

          tdid     type stxl-tdid,

          tdname   type stxl-tdname,

          tdline   type string,

        end of ty_text.

 

  data:

    lt_stxh type table of stxh with header line, "抬头

    lt_stxl type  table of ty_stxl with header line. "项目

  data lt_stxl_raw type table of ty_stxl_raw with header line.

  data lt_tline type standard table of tline with header line.

  data lt_text type table of ty_text with header line.

 

  loop at gt_alv.

    lt_stxh-tdobject = 'QMEL'.

    lt_stxh-tdname = gt_alv-qmnum.

    lt_stxh-tdid = 'LTXT'.

    append lt_stxh.

  endloop.

 

*项目

  select tdobject tdid tdname clustr clustd

  into corresponding fields of table lt_stxl

  from stxl

  for all entries in lt_stxh "WITH APPLICATION DATA AND TDNAME

  where relid    = 'TX'          "standard text

  and tdobject = lt_stxh-tdobject

  and tdname   = lt_stxh-tdname

  and tdid     = lt_stxh-tdid

  and tdspras  = sy-langu.

 

* 解压文本

  loop at lt_stxl.

    clear:lt_stxl_raw,lt_stxl_raw[], lt_tline,lt_tline[],lt_text.

    lt_stxl_raw-clustr = lt_stxl-clustr.

    lt_stxl_raw-clustd = lt_stxl-clustd.

    append lt_stxl_raw.

    import tline = lt_tline from internal table lt_stxl_raw.

    loop at lt_tline.

      lt_text-tdline = lt_text-tdline && lt_tline-tdline.

    endloop.

    lt_text-tdobject = lt_stxl-tdobject.

    lt_text-tdid = lt_stxl-tdid.

    lt_text-tdname = lt_stxl-tdname.

    append lt_text.

  endloop.

 

  sort lt_text by tdobject tdid tdname.

 

*写入gt_alv

  loop at gt_alv.

    read table lt_text

    with key

    tdobject = 'QMEL'

    tdid = 'LTXT'

    tdname = gt_alv-qmnum

    binary search.

    if sy-subrc = 0.

      gt_alv-ltext = lt_text-tdline.

    endif.

    modify gt_alv.

  endloop. ENDFORM.

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部