有关SAP中等于空的问题
2018-03-09 13:15
183 查看
20.17. 表字段初始值、NULL等问题20.17.1. SE11表设置中的Initial Values如果一个表是新创建的,数据库中的所有字段都会被设计成非NULL,此时与钩不钩上“Initial Values”框没有关系,且都会设置默认值,并且所有的主键都会强制将“Initial Values”框钩上该标示只在修改表结构且在现有表结构增加一个字段时,才起作用,并且只对新增的字段有影响如果在给现已有的表中增加一个字段,调整表结构时,如果新加的字段没有钩上“InitialValues”,则对应到数据库表设计中表示该字段则为NULL;如果钩上了,则数据库中的相应字段不为NULL,并且会设置一个默认值20.17.2. 底层数据库表字段默认值字符类型的字段默认值大多数(极个别使用空字符串)为一个空格,数字字符串与日期为相应位数的0字符中,数字类型为0: 上面数据库表设计视图中的默认值所对应的创建SQL如下:createdefault [ecc].[str_default] as ‘‘ 一个空格createdefault [ecc].[empstr_default] as ‘‘ 空字符串createdefault [ecc].[raw_default] as 0x00createdefault [ecc].[numc5_default] as ‘00000‘createdefault [ecc].[numc8_default] as ‘00000000‘createdefault [ecc].[num_default] as 020.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类型字段的初始值为 000...00C ,最后的 C 表示整数位为12位,剩下小数位数为 16 -12 – 1 =3 位,其中算术式中的1表示一个小数点,所以整体来看类型为P的字段初始值还是0):向表中插入初始行后,字符字段全为一个空格,数字类型为0:20.17.3.2.读取数据CLEAR: wa_strc.SELECT SINGLE * INTO CORRESPONDING FIELDSOF wa_strc FROM ytest2.得到的结果与上面插入数据一样。即使手动将数据库中的一个空格修改成多个,还是能读取出来恢复成插入时的初始数据。另外,以下SQL还是能读出数据:SELECT SINGLE * INTO CORRESPONDING FIELDSOF 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中的“空”、INITIALDATA: n(4) TYPE n VALUE ‘0000‘.IF ‘‘ = ‘ ‘ AND ‘‘ = 0 AND ‘ ‘ = 0 AND ‘‘ ISINITIAL AND ‘ ‘ IS INITIAL AND 0 IS INITIAL AND n ISINITIAL. WRITE: ‘ISINITIAL‘. 以上条件为真ENDIF.但‘0000‘数字常量串不能视为初始,下面条件也为真:IF ‘‘ <> ‘0000‘ AND ‘ ‘ <> ‘0000‘ AND ‘0000‘ ISNOT 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客户端问题,与MSN有关
- SAP中有关Routing/Work Center/Cost Center/Activity type问题
- 有关单色位图创建和保存的问题,大家帮我看看,谢谢啦~
- 有关逻辑炸弹方面的问题
- 有关SYSDATE与DBLINK的问题
- [Qt]有关QpushButton的setAutoExclusive的问题
- 有关doc文档转化的问题
- PHP中foreach有关引用的问题
- nod1001 数组中和等于k的数对问题
- 有关计数问题的dp
- 有关bitmap优化问题
- 折腾了两天的跨站脚本提交问题,与IIS7有关
- 一个与小球碰撞有关的有趣问题
- [置顶] 有关业余技术开发的一些问题
- 新手求教。。有关onPreviewFrame未被调用的问题
- 有关Lucene的问题(6):Lucene的事务性
- 终于解决了SAP B1 的一个User Tables 因为数据量巨大而对其操作慢的问题
- 有关string.Fromat()要格式化的字符串有“{”和“}”的问题
- 安卓有关数据共享的8个问题回答笔记
- asp.net中有关文件HTTP上传服务器保存的问题(捷易拍sdk开发方面)