ABAP 中的回车换行

今天进行了一些测试,对于以前发生的一些灵异事件终于茅塞顿开了。

   今天的内容,ABAP的分隔符。

   系统怎么识别我们写的代码的回车分隔呢?

   我编写了一个实例。

   CALL SCREEN  9000.

然后在PBO中的MODUEL中写入如下的代码:

当然 在9000中画个CONTAINER 名字C_QUERY. 在屏幕的CONTAINER以外的地方画一个按钮,功能码:PB_OK

DATA GV_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTUM_CONTAINER.

 IF GV_CUSTOM_CONTAINER IS INITIAL.
    CREATE OBJECT GV_CUSTOM_CONTAINER
      EXPORTING
        CONTAINER_NAME              'C_QUERY'.
  ENDIF.

  CREATE OBJECT GV_TEXT_EDITOR
        EXPORTING
             PARENT GV_CUSTOM_CONTAINER
             WORDWRAP_MODE CL_GUI_TEXTEDIT=>WORDWRAP_AT_WINDOWBORDER
             WORDWRAP_TO_LINEBREAK_MODE CL_GUI_TEXTEDIT=>FALSE
        EXCEPTIONS
             ERROR_CNTL_CREATE      1
             ERROR_CNTL_INIT        2
             ERROR_CNTL_LINK        3
             ERROR_DP_CREATE        4
             GUI_TYPE_NOT_SUPPORTED 5.

 

我在PAI代码加入如下控制。

    WHEN 'PB_OK'.
      DATA: MESS LIKE SM04DIC-POPUPMSG.
      CALL METHOD GV_TEXT_EDITOR->GET_TEXTSTREAM
        IMPORTING
          TEXT GV_STRING.
      CALL METHOD CL_GUI_CFW=>FLUSH. "前台的输入文本被刷到服务器段,被代码接收文本.
      MESS GV_STRING.
   DATA LV_SIGN(2) TYPE C.
  cl_abap_char_utilities=>horizontal_tab
  LV_SIGN CL_ABAP_CHAR_UTILITIES=>CR_LF.
  DATA LS_STRING TYPE  STRING.
  DATA LT_STRING TYPE TABLE OF STRING.

  SPLIT MESS AT LV_SIGN INTO TABLE   LT_STRING.

  
  LOOP AT  LT_STRING INTO LS_STRING .

  IF LS_STRING IS INITIAL.

  DELETE TABLE LT_SRTING FORM LS_STRING.

  ELSE.

  REPLACE  LV_SIGN WITH ''  INTO LS_STRING .
  CONDENSE
 LS_STRING.

   ENDIF.
  ENDLOOP. 


      LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 9000.
      LOOP AT  LT_STRING INTO LS_STRING  .
        WRITE / LS_STRING .
      ENDLOOP.

 

 

简易就写到这里了。

大体就是这个思路。然后运行程序,显示的文本框中随便输入一些字符,主要多按一些回车。

然后执行程序可以看到LSIT,正常输出。

 但是我们如果注释掉  LV_SIGN CL_ABAP_CHAR_UTILITIES=>CR_LF.这句话

我们会发现,我们每按一些回车,那么就会出现## 这个字符。

我试图用REPLACE '##' with ' ' INTO LS_STRING.

结果失败了,我们使用普通的字符来才做这个 回车的## ,根本不识别。

这是我以前的写的逻辑。

今天再看一个关于CL_ABAP_CHAR_ULITILES 的这个类的时候,偶然发现的OLE在处理文本的时候,对于回车的分隔都是通过调用这个类的静态方法作为标识的。我突然联想到了我以前写的这个程序。所以测试了一下用CL_abap_char_utilities=>horizontal_tab拆分,发现只是一个#,我到类里面查了一下存在CL_ABAP_CHAR_UTILITIES=>CR_LF ,这个2个字符的分隔符。于是我试了一下,结果成功了。

 

我可以肯定,CL_ABAP_CHAR_UTILITIES=>CR_LF  这个 ‘##’ 不属于任何语言或者 字符。

因为我在项目中遇到了VL71打印交货单的时候,如果在文本中直接打个回车,却不输入任何内容的时候,打印中,会报一个“VBBE的.......断裂的错误”。调试标准程序可以知道是一个 FM:READ_TEXT的 异常导致的。而原因就在于 CL_ABAP_CHAR_UTILITIES=>CR_LF  这个分隔符 不属于ZH(中文)语言的中的‘##’。

 附注:CL_ABAP_CHAR_UTILITIES=>CR_LF   真实值是 :  %_CR_LF ,被GUI编译成了 ##。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值