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

10 篇文章 0 订阅

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

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

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

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

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

image407


image408

image410

 

image411

 

image412

上面数据库表设计视图中的默认值所对应的创建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初始值、底层数据库表默认值相互转换

image413

20.17.3.1.向表中插入初始值

在通过ABAP向数据库中插入数据时,不可能将NULL插入到表中,因为SAP系统将数据插入到数据库表之前会判断各字段值是否是ABAP程序中相应的初始值,如果为ABAP程序初始值,则使用相对应ABAP词典中的内置类型初始值进行插入;所以数据库表中字段值为NULL只有一种情况,就是调整表结构时(增加字段),没有将Initial Values钩上

DATAwa_strc LIKE ytest2..

CLEARwa_strc.

INSERT ytest2 FROM wa_strc.

内存中的数据(其中类型为P类型字段的初始值为 000...00C ,最后的 C 表示整数位为12位,剩下小数位数为 16 -12 – 1 = 3 位,其中算术式中的1表示一个小数点,所以整体来看类型为P的字段初始值还是0):


image414

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

jyzUGRCTiWBEiABEiABFIJ8LZDKhp2kAAJkAAJREaAmhfZBWU5JEACJEACqQSoealo2EECJEACJBAZgYTf8x48fFxbkXfv3MZaezsbta3Y7wuRVfgVJKtoWDX2Uu7vboZDriKy5wnYohqVjE3M2v8A03hi51WNBOgAAAAASUVORK5CYII=


image415

20.17.3.2.读取数据

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

wOzXnrW2vteEwAAAABJRU5ErkJggg==

image416

20.18.             ABAP中的“空”、INITIAL

DATAn(4TYPE VALUE '0000'.

IF '' ' ' AND '' AND ' ' 0  AND '' IS INITIAL AND ' ' IS INITIAL  AND IS INITIAL AND 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

另外,如果是查询条件字段是DateNumcQUAN类型时,Where条件后面的值不会使用引号引起来,而是把它们直接看作是数字类型,特别是DateNumc类型,所对应的数据库表字段的类型为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的查询界面:

wMx9iiNVnpkawAAAABJRU5ErkJggg==

image417

SAPALV是指SAP中的一个开发框架,用于显示和操作ALV(ABAP列表视图)报表。ALV是一种用于在SAP系统中显示和编辑数据的标准列表视图。在SAPALV框架中,可以使用类CL_SALV_FULLSCREEN_ADAPTER的实例来传递ALV的样式和设置参数。在SAPALV开发中,可以通过将lt_styletab的行插入到ls_listrow-cellstyles中来设置样式。要在OO方式下显示ALV,可以使用类CL_GUI_ALV_GRID的方法SET_TABLE_FOR_FIRST_DISPLAY来设置显示参数,例如SEL_MODE字段的赋值为A、B、C或D。使用函数REUSE_ALV_GRID_DISPLAY_LVC来显示ALV时,可以给参数is_layout_lvc的SEL_MODE字段赋值。而使用函数REUSE_ALV_GRID_DISPLAY来显示ALV时,虽然有参数IS_LAYOUT,但没有SEL_MODE参数。另外,使用类CL_SALV_TABLE来显示ALV时也是一种方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SAP ALV 选择模式](https://blog.csdn.net/cywjck/article/details/93964047)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [SAP ALV 详细说明](https://blog.csdn.net/Trassion/article/details/7383050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值