如何使用字符串字面量查询原始值与输入值不一致的SAP数据表?
问题说明
我创建了以MATNR和另外两个字段为主键的自定义表z_test_db,并通过ABAP代码插入了4条测试数据(代码如下)。用字符串条件MATNR = '4711'查询这个Z表能正常返回结果,但用同样的条件查询SAP标准表MARA时却没有数据返回。排查后发现,MARA表中MATNR字段的实际存储值是带前导零的000000000000004711,只是SE16N界面会自动显示为去掉前导零的4711。
delete from z_test_db. data ls_tab type z_test_db. data now type timestamp. get time stamp field now. ls_tab = value #( matnr = '4711' vorne = 0010 terminal = 'AAA' etkpgm = 'XXX' drucker = 'MO-ED-01' voretkm = 1 etkcopy = 1 eruser = sy-uname ertime = now aeuser = '' aetime = 0 kzaktv = 'X' kzaaeu = '' kzaaet = 0 ). insert z_test_db from ls_tab. get time stamp field now. ls_tab = value #( matnr = '4712' vorne = 0010 terminal = 'AAA' etkpgm = 'XXX' drucker = 'MO-ED-01' voretkm = 1 etkcopy = 1 eruser = sy-uname ertime = now aeuser = '' aetime = 0 kzaktv = 'X' kzaaeu = '' kzaaet = 0 ). insert z_test_db from ls_tab. get time stamp field now. ls_tab = value #( matnr = '4711' vorne = 0010 terminal = 'BBB' etkpgm = 'XXX' drucker = 'MO-ED-01' voretkm = 1 etkcopy = 1 eruser = sy-uname ertime = now aeuser = '' aetime = 0 kzaktv = 'X' kzaaeu = '' kzaaet = 0 ). insert z_test_db from ls_tab. get time stamp field now. ls_tab = value #( matnr = '4712' vorne = 0010 terminal = 'BBB' etkpgm = 'XXX' drucker = 'MO-ED-01' voretkm = 1 etkcopy = 1 eruser = sy-uname ertime = now aeuser = '' aetime = 0 kzaktv = 'X' kzaaeu = '' kzaaet = 0 ). insert z_test_db from ls_tab.
解决方法
使用物料编号转换函数处理查询值
SAP提供了标准转换函数CONVERSION_EXIT_MATN1_INPUT,可以把不带前导零的物料短码转换成系统存储用的带前导零格式。示例代码:DATA: lv_matnr_short TYPE char18 VALUE '4711', lv_matnr_long TYPE mara-matnr. CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' EXPORTING input = lv_matnr_short IMPORTING output = lv_matnr_long. SELECT * FROM mara WHERE matnr = lv_matnr_long. " 这里处理查询到的结果 ENDSELECT.ABAP 7.50+直接在SQL中调用转换函数
如果系统版本是ABAP 7.50及以上,可以直接在SELECT语句里嵌入转换函数,省去单独调用的步骤:SELECT * FROM mara WHERE matnr = CONVERSION_EXIT_MATN1_INPUT( input = '4711' ).让Z表MATNR字段和标准表保持一致规则
要是后续需要Z表和MARA做关联查询,建议修改z_test_db的MATNR字段,设置它参考标准数据元素MATNR。这样在维护Z表数据时,系统会自动补前导零;查询时输入短码也会自动转换,从根源上避免格式不匹配的问题。
内容的提问来源于stack exchange,提问作者Radinator
相关产品推荐
相关产品推荐

