[SAPABAP开发技术总结]初始值、空、NULL、INITIAL等问题
20.17.表字段初始值、NULL等问题
20.17.1.SE11表设置中的
如果⼀个表是新创建的,数据库中的所有字段都会被设计成⾮NULL,此时与钩不钩上“Initial Values”框没有关系,且都会设置默认值,并且所有的主键都会强制将“Initial Values”框钩上
该标⽰只在修改表结构且在现有表结构增加⼀个字段时,才起作⽤,并且只对新增的字段有影响
如果在给现已有的表中增加⼀个字段,调整表结构时,如果新加的字段没有钩上“Initial Values”,则对应到数据库表设计中表⽰该字段则
为NULL;如果钩上了,则数据库中的相应字段不为NULL,并且会设置⼀个默认值
20.17.2.底层数据库表字段默认值
字符类型的字段默认值⼤多数(极个别使⽤空字符串)为⼀个空格,数字字符串与⽇期为相应位数的0字符中,数字类型为0:
上⾯数据库表设计视图中的默认值所对应的创建SQL如下:
createdefault [ecc].[str_default] as ' '      ⼀个空格
createdefault [ecc].[empstr_default] as ''    空字符串
wa字符串是什么
createdefault [ecc].[raw_default] as 0x00
createdefault [ecc].[numc5_default] as '00000'
createdefault [ecc].[numc8_default] as '00000000'
createdefault [ecc].[num_default] as 0
20.17.3.ABAP初始值、底层数据库表默认值相互转换
20.17.3.1.向表中插⼊初始值
在通过ABAP向数据库中插⼊数据时,不可能将NULL插⼊到表中,因为SAP系统将数据插⼊到数据库表之前会判断各字段值是否是ABAP程序中相应的初始值,如果为ABAP程序初始值,则使⽤相对应ABAP词典中的内置类型初始值进⾏插⼊;所以数据库表中字段值为NULL只有⼀种情况,就是调整表结构时
(增加字段),没有将Initial Values钩上
DATA: wa_strc LIKE ytest2..
CLEAR: wa_strc.
INSERT ytest2 FROM wa_strc.
内存中的数据(其中类型为P类型字段的初始值为 00C ,最后的 C 表⽰整数位为12位,剩下⼩数位数为 16 -12 – 1 = 3 位,其中算术式中的1表⽰⼀个⼩数点,所以整体来看类型为P的字段初始值还是0):
向表中插⼊初始⾏后,字符字段全为⼀个空格,数字类型为0:
20.17.3.2.读取数据
CLEAR: wa_strc.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF  wa_strc FROM ytest2.
得到的结果与上⾯插⼊数据⼀样。即使⼿动将数据库中的⼀个空格修改成多个,还是能读取出来恢复成
插⼊时的初始数据。另外,以
下SQL还是能读出数据:
SELECT SINGLE * INTO CORRESPONDING FIELDS OF  wa_strc FROM ytest2 WHERE
key1 eq and key1 eq ' ' and key1 eq '  ' 分别为⼀个、两个、三个空格
但如果加上key1 is null,则查询不出数据。
由此可以看出,数据库中的默认值加载到ABAP内存中后,也会转换成相应ABAP程序内置类型相应的初始值
20.17.4.SAP系统中的表字段不允许为NULL的原因
下⾯VAL2字段值为NULL时,使⽤ val2 <> 33 查询时,VAL2为NULL值是查询不出来的(标准SQL语句就是这样):
20.18.ABAP中的“空”、INITIAL
DATA: n(4) TYPE n VALUE '0000'.
IF '' = ' ' AND '' = 0 AND ' ' = 0  AND '' IS INITIAL AND ' ' IS INITIAL  AND 0 IS INITIAL AND n IS INITIAL.
WRITE: 'IS INITIAL'.  以上条件为真
ENDIF.
但'0000'数字常量串不能视为初始,下⾯条件也为真:
IF '' <> '0000' AND ' ' <> '0000' AND '0000' IS NOT INITIAL.
' '空格(''空字符也⾏)来判断(XX EQ ' '如果是数字类型,则需要与0进⾏对⽐),⽽不能使⽤ is NULL来查询,因为SAP中的表字段⼏乎没有为NULL的,基本上都是⼀个空格,所以不能使⽤is NULL。从ST05可以看出:is NULL会原样写在SQL语句中,⽽空字符串或空格字符串都会转换成⼀个空格,这正好与数据库字符类型字段的默认字段对应:
SELECT SINGLE * FROM mara WHERE matnr IS NULL OR matnr = '' OR matnr = ' ' OR  matnr = '  '.
SELECT WHERE "MANDT" = '210' AND ( "MATNR" IS NULL OR "MATNR" = ' ' OR "MATNR" = ' ' OR "MATNR" = ' ' ) AND ROWNUM <= 1
另外,如果是查询条件字段是Date、Numc、QUAN类型时,Where条件后⾯的值不会使⽤引号引起来,⽽是把它们直接看作是数字类型,特别是Date与Numc类型,所对应的数据库表字段的类型为Nvarchar,这样在查询时会先将数据库表字段的值转换为数字类型后再进⾏⽐较:
下⾯是此⽣成SQL的查询界⾯:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。