今天进行了一些测试,对于以前发生的一些灵异事件终于茅塞顿开了。
今天的内容,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编译成了 ##。