设为首页 收藏本站
查看: 1479|回复: 0

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

[复制链接]

尚未签到

发表于 2015-9-21 13:00:08 | 显示全部楼层 |阅读模式
DSC0000.gif
声明:原创作品,转载时请注明文章来自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:
DSC0001.png
DSC0002.png
DSC0003.png
DSC0004.png DSC0005.png DSC0006.png
上面数据库表设计视图中的默认值所对应的创建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初始值、底层数据库表默认值相互转换
DSC0007.png
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):
DSC0008.png
向表中插入初始行后,字符字段全为一个空格,数字类型为0:
DSC0009.png
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语句就是这样):
DSC00010.png
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,这样在查询时会先将数据库表字段的值转换为数字类型后再进行比较:
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的查询界面:
DSC00011.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-116769-1-1.html 上篇帖子: Introduction of new feature ‘Tag Cloud’ with SAP CRM 7.0 Ehp 1 下篇帖子: SAP顾问所需要的沟通技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表