在数据库中存储'μm'的正确数据类型?



问题

我需要将一些值放入带单位的Z表中,这些值不在SAP标准中(微米(。

编辑:我说的是"μm"本身,而不是它的意义——我制作了一个表,它有"单位"字段,将"μm’放在该字段中,还有"值"字段,它们是int,厚度大约为30。

因此,我可以用它来报告类似的显示,"这种特定材料的厚度为30μm"。

问题

我从PI那里得到了这些数据,PI从遗留系统(可能是基于unicode的(发送这些值。我必须使用ABAP将这些数据放到Z表中。

  1. 设置字段类型、字符长度2(像um,而不是μm(安全吗?

  2. 如何对特殊值执行比较逻辑[ex(如果f1="μm"。]

如有任何帮助,我们将不胜感激!

适当长度的答案在内置类字符类型的文档中得到回答。

  • 在为类似字符的类型指定长度时,请注意字符的长度(以字节为单位(取决于所使用的字符表示。对于ABAP编程语言使用的字符表示UCS-2,字符的长度为两个字节

关于UCS-2:

UCS-2

两字节Unicode字符表示。在这种表示中,所有字符都由两个字节(16位(表示。在UCS-2中,可以对65536个不同的字符进行编码,这些字符对应于Unicode标准的所谓基本多语言平面(BMP(。与UTF-16相比,UCS-2不支持来自代理区域的字符。ABAP编程语言支持Unicode系统中的UCS-2,因此没有代理。

DATA(lv_x) = '𓀀'. "C length 2
DATA(lv_y) = 'μ'. "C length 1

由于μ存在于UC2字符集(00B5 MICRO SIGN(中,因此它将在ABAP中占据一个字符,并且可以这样存储和比较
您可以更改数据库表的字符表示形式,但ABAP从中读取后,它将被转换为UCS-2。

读取内容为μm的UTF-8文件效果良好

cl_gui_frontend_services=>file_open_dialog( CHANGING file_table  = lt_files
rc          = lv_rc
user_action = lv_action ).
IF lv_action <> cl_gui_frontend_services=>action_ok OR lv_rc <> 1.
RETURN.
ENDIF.
DATA lt_tab TYPE STANDARD TABLE OF string.
cl_gui_frontend_services=>gui_upload( EXPORTING filename = |{ lt_files[ 1 ]-filename }|
filetype = 'ASC'
codepage = '4110'
CHANGING  data_tab = lt_tab ).
DATA(lv_text) = REDUCE string( INIT s = `` FOR <lv_line> IN lt_tab NEXT s = s && <lv_line> ).
DATA(lv_unit) = CONV zmy_units-unit( lv_text ).
INSERT zmy_units FROM @( VALUE zmy_units(
unit        = lv_text
description = 'Test' ) ).
SELECT SINGLE * FROM zmy_units WHERE unit = 'μm' INTO @DATA(ls_unit).
WRITE ls_unit-unit.
NEW-LINE.
WRITE |{ xsdbool( ls_unit-unit = 'μm' ) }|.
* Result
* μm
* X

有关通过RFC编码的更多信息,请参阅根据SAP标准的转换-使用远程函数调用的通信。

最新更新