将ls_struc从代码页" 1110"转换为代码页" 0100"(在UNICODE环境中)

2020-09-06 18:26发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我目前正在使用以下结构翻译结构:将ls_struc从代码页" 1110"转换为代码页" 0100"。

当然,在Unicode中,这不再允许,因此我已使用cl_abap_conv_out_ce将其替换为新逻辑。

这一直有效,除非结构中的一个字段包含哈希。 例如,字段ls_struc-desc =" MANDA xyz ### 123"。

在执行unicode之前,即使用TRANSLATE命令,输出如下:

使用新的Unicode类,输出字符串现在有所不同:

这些字符串应该相同,即我在Unicode环境中应具有相同的结果。 非常感谢所有帮助,我已经花了3天的时间来解决此问题。 :(

我的代码如下:

PERFORM create_linefeed更改lv_linefeed。使用ls_struc更改视图长度
更改lv_view_offlen。
使用ls_struc更改PERFORM new_record

lv_view_offlenCHANGING lv_xstring。
传输lv_xstring TO文件。 > *&----------------------------------------------- ---------------------- *
*&表格CREATE_LINEFEED" Unicode
* &------------------------------------------------- -------------------- *
*换行0100 konvertieren
* ---- -------------------------------------------------- ---------------- *
FORM create_linefeed更改p_linefeed。
尝试。
调用方法cl_abap_conv_out_ce => create
导出
编码='0100'
* endian ='L'
*替换='。'
* ignore_cerr = ABAP_FALSE
接收
转换= p_linefeed。
CATCH cx_parameter_invalid_range。
CATCH cx_sy_codepage_converter_init。
ENDTRY。
ENDFORM。 > *&------------- -------------------------------------------------- ------ *
*&表格LENGTH_OF_VIEW" Unicode
*&--------------- -------------------------------------------------- ---- *
*自助餐厅
* ------------------- -------------------------------------------------- -*
使用p_recordCHANGING p_view_offlen形成视图长度。
TRY。
呼叫方法cl_abap_view_offlen => create_legacy_viewEXPORTING
data = p_record RECEIVINGref = p_view_offlen。
CATCH cx_parameter_invalid_type。
ENDFORM。 " LENGTH_OF_VIEW" Unicode
*&------------------------------- -------------------------------------- *
* &Form NEW_RECORD" Unicode
*&--------------------------------- ------------------------------------ *
* Datensatz + den Buffer schreiben中的换行
* ---------------------------------- ------------------------------------ *
使用p_record p_view_offlenCHANGING p_xstring_buffer形成新记录
TRY。
呼叫方法lv_linefeed-> convert_strucEXPORTING data = p_record视图= p_view_offlenIMPORTING
buffer = p_xstring_buffer。
CATCH cx_sy_codepage_converter_init。
CATCH cx_sy_conversion_codepage。
br> CATCH cx_parameter_invalid_range。
ENDTRY。
ENDFORM。" NEW_RECORD" Unicode

(829乙)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我目前正在使用以下结构翻译结构:将ls_struc从代码页" 1110"转换为代码页" 0100"。

当然,在Unicode中,这不再允许,因此我已使用cl_abap_conv_out_ce将其替换为新逻辑。

这一直有效,除非结构中的一个字段包含哈希。 例如,字段ls_struc-desc =" MANDA xyz ### 123"。

在执行unicode之前,即使用TRANSLATE命令,输出如下:

使用新的Unicode类,输出字符串现在有所不同:

这些字符串应该相同,即我在Unicode环境中应具有相同的结果。 非常感谢所有帮助,我已经花了3天的时间来解决此问题。 :(

我的代码如下:

PERFORM create_linefeed更改lv_linefeed。使用ls_struc更改视图长度
更改lv_view_offlen。
使用ls_struc更改PERFORM new_record

lv_view_offlenCHANGING lv_xstring。
传输lv_xstring TO文件。 > *&----------------------------------------------- ---------------------- *
*&表格CREATE_LINEFEED" Unicode
* &------------------------------------------------- -------------------- *
*换行0100 konvertieren
* ---- -------------------------------------------------- ---------------- *
FORM create_linefeed更改p_linefeed。
尝试。
调用方法cl_abap_conv_out_ce => create
导出
编码='0100'
* endian ='L'
*替换='。'
* ignore_cerr = ABAP_FALSE
接收
转换= p_linefeed。
CATCH cx_parameter_invalid_range。
CATCH cx_sy_codepage_converter_init。
ENDTRY。
ENDFORM。 > *&------------- -------------------------------------------------- ------ *
*&表格LENGTH_OF_VIEW" Unicode
*&--------------- -------------------------------------------------- ---- *
*自助餐厅
* ------------------- -------------------------------------------------- -*
使用p_recordCHANGING p_view_offlen形成视图长度。
TRY。
呼叫方法cl_abap_view_offlen => create_legacy_viewEXPORTING
data = p_record RECEIVINGref = p_view_offlen。
CATCH cx_parameter_invalid_type。
ENDFORM。 " LENGTH_OF_VIEW" Unicode
*&------------------------------- -------------------------------------- *
* &Form NEW_RECORD" Unicode
*&--------------------------------- ------------------------------------ *
* Datensatz + den Buffer schreiben中的换行
* ---------------------------------- ------------------------------------ *
使用p_record p_view_offlenCHANGING p_xstring_buffer形成新记录
TRY。
呼叫方法lv_linefeed-> convert_strucEXPORTING data = p_record视图= p_view_offlenIMPORTING
buffer = p_xstring_buffer。
CATCH cx_sy_codepage_converter_init。
CATCH cx_sy_conversion_codepage。
br> CATCH cx_parameter_invalid_range。
ENDTRY。
ENDFORM。" NEW_RECORD" Unicode

(829乙)
付费偷看设置
发送
4条回答
N-Moskvin
1楼 · 2020-09-06 19:05.采纳回答

您的代码将仅包含字符的结构转换为代码页0100( EBCDIC 273 )。 我认为它没有问题。

 ls_struc =值#(
     坚定= 1
     ltext ='123456ABCDEF')。

 将字符转换为EBCDIC 273之后的相应十六进制代码:
 F0F0F0F1(公司)
 40404040404040404040
 40404040404040404040
 4040
 404040
 F1F2F3F3
 4040
 40
 40
 40 

所以,问题可能出在输入上。 旧版代码是从代码页1110(" HP-Unix"-与拉丁文1 ),但现在您不再从1110转换,而是假设以前已经将字符(正确地)从1110转换为Unicode。

您是否在Legacy系统中运行新代码,只需替换一下 如果要在Unicode系统中运行它,而LS_STRUC是从数据库表中获取的,则表转换中可能存在问题。

这样,在您的Legacy系统中通过事务代码SCP更改了代码页的可能性很小,而在Unicode系统中却没有。

这是我在Unicode系统中用于测试的代码 (格式正确,并且可以编译):

类型:ds_out的开头,
          firma TYPE numc4,
          begda TYPE C LENGTH 10,
          endda TYPE C LENGTH 10,
          fitec TYPE C长度2
          ktext TYPE C长度3,
          ltext TYPE C长度100,
          fityp TYPE C长度2
          kzkonz TYPE C长度1
          kzkost TYPE C长度1
          kzjob TYPE C长度1
        ds_out结束。

 数据:ls_struc TYPE ds_out,
       lv_linefeed类型参考cl_abap_conv_out_ce,
       lv_view_offlen TYPE引用到cl_abap_view_offlen,
       lv_xstring TYPE xstring。

 ls_struc =值#(
     坚定= 1
     begda =''
     endda =''
     fitec =''
     ktext =''
     ltext ='123456ABCDEF'
     fityp =''
     kzkonz =''
     kzkost =''
     kzjob ='')。

 执行create_linefeed
     更改lv_linefeed。
 PERFORM观看时长
     使用ls_struc
     更改lv_view_offlen。
 进行new_record
     使用ls_struc
             lv_view_offlen
     更改lv_xstring。

 BREAK-POINT。

 *&------------------------------------------------  --------------------- *
 *&表格CREATE_LINEFEED" Unicode
 *&------------------------------------------------  --------------------- *
 *换行0100
 * -------------------------------------------------  --------------------- *
 表格create_linefeed
 更改p_linefeed。
   尝试。
       呼叫方法cl_abap_conv_out_ce =>建立
         出口
           编码='0100'
 *尾数='L'
 *替换='。
 * ignore_cerr = ABAP_FALSE
         接收
           转换= p_linefeed。
     捕获cx_parameter_invalid_range。
     捕获cx_sy_codepage_converter_init。
   ENDTRY。
 ENDFORM。  " CREATE_LINEFEED" Unicode
 *&------------------------------------------------  --------------------- *
 *&表格LENGTH_OF_VIEW" Unicode
 *&------------------------------------------------  --------------------- *
 *Längedes Datensatzes ermitteln
 * -------------------------------------------------  --------------------- *
 表格length_of_view
 使用p_record
 更改p_view_offlen。
   尝试。
       呼叫方法cl_abap_view_offlen => create_legacy_view
         出口
           数据= p_record
         接收
           参考= p_view_offlen。
     捕获cx_parameter_invalid_type。
   ENDTRY。
 ENDFORM。  " LENGTH_OF_VIEW" Unicode
 *&------------------------------------------------  --------------------- *
 *&表格NEW_RECORD" Unicode
 *&------------------------------------------------  --------------------- *
 * Datensatz + Line schreiben中的换行
 * -------------------------------------------------  --------------------- *
 FORM new_record
 使用p_record p_view_offlen
 更改p_xstring_buffer。
   尝试。
       调用方法lv_linefeed-> convert_struc
         出口
           数据= p_record
           视图= p_view_offlen
         输入
           缓冲区= p_xstring_buffer。
     捕获cx_sy_codepage_converter_init。
     捕获cx_sy_conversion_codepage。
     捕获cx_parameter_invalid_type。
     捕获cx_parameter_invalid_range。
   ENDTRY。
 ENDFORM。  " NEW_RECORD" Unicode 
骆驼绵羊
2楼-- · 2020-09-06 18:40

嗨,桑德拉

感谢您的回答。 抱歉,我的代码未格式化!

我的结构如下所示:

BEGIN OF ds_out,

firma TYPE numc4,
begda TYPE C LENGTH 10,

endda TYPE C LENGTH 10,
fitec TYPE C LENGTH 2,
ktext TYPE C LENGTH 3,
ltext TYPE C长度100,
fityp TYPE C LENGTH 2,
kzkonz TYPE C LENGTH 1,
kzkost TYPE C长度1,
kzjob TYPE C长度1,
结束于ds_out。

是导致问题的字段" ltext",即在SE11中它似乎具有哈希值。 当然,在SAP GUI中,它显示为"#",但显然是某种特殊字符。

数据来自SAP表。

我试图将其输出到 :

在二进制模式下为输出打开数据集文件。

huskylover
3楼-- · 2020-09-06 18:41

代码仍未格式化! ;-)(您看到CODE按钮了吗?)

Bunny_CDM
4楼-- · 2020-09-06 19:05

顺便说一句,您能否显示十六进制值而不是字符,以确保转换正常。

一周热门 更多>