首页 技术 正文
技术 2022年11月18日
0 收藏 453 点赞 3,410 浏览 2869 个字

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4265616.html

20.17.       表字段初始值、NULL等问题… 249

20.17.1.            SE11表设置中的Initial Values. 249

20.17.2.            底层数据库表字段默认值… 249

20.17.3.            ABAP初始值、底层数据库表默认值相互转换… 250

20.17.3.1.         向表中插入初始值… 250

20.17.3.2.         读取数据… 251

20.17.4.            SAP系统中的表字段不允许为NULL的原因… 251

20.18.       ABAP中的“空”、INITIAL. 251

20.17.             表字段初始值、NULL等问题

20.17.1.      SE11表设置中的Initial Values

如果一个表是新创建的,数据库中的所有字段都会被设计成非NULL,此时与钩不钩上“Initial Values”框没有关系,且都会设置默认值,并且所有的主键都会强制将“Initial Values”框钩上

该标示只在修改表结构且在现有表结构增加一个字段时,才起作用,并且只对新增的字段有影响

如果在给现已有的表中增加一个字段,调整表结构时,如果新加的字段没有钩上“Initial Values”,则对应到数据库表设计中表示该字段则为NULL;如果钩上了,则数据库中的相应字段不为NULL,并且会设置一个默认值

20.17.2.      底层数据库表字段默认值

字符类型的字段默认值大多数(极个别使用空字符串)为一个空格,数字字符串与日期为相应位数的0字符中,数字类型为0:

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题 [SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题 [SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

上面数据库表设计视图中的默认值所对应的创建SQL如下:

createdefault [ecc].[str_default] as ‘ ‘      一个空格

createdefault [ecc].[empstr_default] as ”    空字符串

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初始值、底层数据库表默认值相互转换

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

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类型字段的初始值为 000…00C ,最后的 C 表示整数位为12位,剩下小数位数为 16 -12 – 1 = 3 位,其中算术式中的1表示一个小数点,所以整体来看类型为P的字段初始值还是0):

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

向表中插入初始行后,字符字段全为一个空格,数字类型为0:

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

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语句就是这样):

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

20.18.             ABAP中的“空”、INITIAL

) 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,这样在查询时会先将数据库表字段的值转换为数字类型后再进行比较:

SELECT WHERE “MANDT” = ‘210’ AND “MATNR” = ‘FOOTBALL’ AND “ERSDA” = 00000000 AND “LAEDA” = 20120511 AND “BLANZ” = 000 AND “COMPL” = 01 AND “BRGEW” = 0 AND “NTGEW” = 10

下面是此生成SQL的查询界面:

[SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902