ABAP之前导0的灵活应用场景
序
HELLO ,这里是百里,一个学习中的ABAPER,在SAP系统中存在数据元素的概念,如单号,客户号,料号等等,这些数据均为固定的长度,在比较元素内容时,往往需要增加前导0,或者取消前导0.或者在用户查看时,也会要求去除对应数据的前导0内容.此时就用到去除前导0的动作.
真假前导0
真前导0的概念是如单号 vbeln = '00000010'
,通过去除前导0 ,最终获取内容为'10'
.
假前导0只是在ALV 对应的界面展示出来时为'10'
,但是本身值还是原来对应的值.
隐藏前导0,数据值不变
此种方式就是本身值并没有对做对应的前导0去除,可以进行对应的逻辑计算,关联取数等动作.只是在ALV展示界面内容时给用户更好的感官. 因为SAP字段8-20位的都有查看起来会很不友好.
数据定义
TABLES : VBAP .
TYPES :BEGIN OF TY_DATA ,
VBELN TYPE VBAP-VBELN ,
POSNR TYPE VBAP-POSNR ,
MATNR TYPE VBAP-MATNR ,
END OF TY_DATA .
DATA :GS_DATA TYPE TY_DATA .
DATA :GT_DATA TYPE TABLE OF TY_DATA .
DATA: wa_layout TYPE lvc_s_layo.
DATA:wa_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE lvc_t_fcat.
DATA gs_grid TYPE lvc_s_glay. "新
DATA:gwa_edit TYPE lvc_s_styl,
git_edit TYPE lvc_t_styl.
获取数据
START-OF-SELECTION .
PERFORM GETDATA .
FORM getdata .
SELECT VBELN ,POSNR ,MATNR FROM VBAP INTO TABLE @GT_DATA WHERE Vbeln in @s_vbeln .
ENDFORM.
数据展示
FORM bulid_fieldcat .
DEFINE add_col.
* ADD 1 TO pos.
* lw_fieldcat-col_pos = pos.
wa_fieldcat-fieldname = &1.
wa_fieldcat-ref_field = &2.
wa_fieldcat-ref_table = &3.
wa_fieldcat-scrtext_l = &4.
wa_fieldcat-outputlen = &5.
wa_fieldcat-no_zero = &6.
wa_fieldcat-edit = &7.
wa_fieldcat-edit_mask = &8.
wa_fieldcat-key = &9.
CASE `wa_fieldcat`-fieldname.
WHEN 'MATCODE' OR 'MATNAME' .
wa_fieldcat-edit = 'X' .
" WHEN 'slbox'.
" wa_fieldcat-checkbox = 'X' .
" wa_fieldcat-edit = 'X' .
" wa_fieldcat-edit_mask = 'X'.
" WHEN 'VBELN' .
" wa_fieldcat-HOTSPOT = 'X' .
" WHEN 'KBETR'.
" wa_fieldcat-decimals_o = 2 .
" WHEN 'FKIMG' .
" wa_fieldcat-decimals_o = 0 .
WHEN OTHERS.
ENDCASE .
APPEND wa_fieldcat TO gt_fieldcat.
CLEAR : wa_fieldcat.
END-OF-DEFINITION.
REFRESH: gt_fieldcat.
" add_col 'slbox' space space '选项' space space space space space.
add_col 'VBELN' space space 'VBELN' space space space space space.
add_col 'POSNR' space space 'POSNR' space space space space space.
add_col 'MATNR' space space 'MATNR' space space space '==MATN1' 'X'.
ENDFORM.
结果
通过修改对应宏定义数据内容进行是否展示真假前导0的概念.
wa_fieldcat-edit_mask = &8. wa_fieldcat-key = &9.
写入内容参照料号数据中的历程. 如 matnr 的历程为 MATN1 我们就写 ‘==MATN1’ . 如图为写了历程以后去除前导0结果和默认前导0展示的结果.
真前导0去除,对应数据值变更
此种方式是直接修改对应数值,即把原来的数据值的前导0全部去除再赋值给新的值.如果在关联,取数等逻辑时,使用该方法内容,这回出现关联失败的情况,即明明我用了关联条件,但是与另外一个取数表就是无法关联内容,一条都查不到.
此项是一个非常坑的地方.
那个这个地方有什么用呢. 目前百里使用的地方为ole下载,字符串拼接等地方,需要特意的去除对应的前导0拼接内容.
使用方式
调用函数
增加前导0
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = ls_alv-matnr
IMPORTING
output = ls_alv-matnr.
去除前导0
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = ls_alv-matnr
IMPORTING
output = ls_alv-matnr.
数据处理
依然调用前面相同数据,增加LOOP循环内容,通过调用函数,真去除前导0动作,然后重新赋值到内表.
SELECT VBELN ,POSNR ,MATNR FROM VBAP INTO TABLE @GT_DATA WHERE Vbeln in @s_vbeln .
LOOP AT GT_DATA into GS_DATA.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = GS_DATA-matnr
IMPORTING
output = GS_DATA-matnr.
MODIFY GT_DATA FROM GS_DATA .
CLEAR GS_DATA .
ENDLOOP.
ENDFORM.
结果
技术总结
本篇文章讲述了工作中会出现的经常使用前导0去除动作.是一个非常重要且容易出错的地方,经常工作中取数时,一查询不到数据就可以看下是否是因为前导0的原因造成无法取数,
失之东隅,收之桑榆 . 学习需要不断总结不断摸索. 思考及记录. 这里是百里一个努力的学习者 .
- 点赞
- 收藏
- 关注作者
评论(0)