ABAP之前导0的灵活应用场景

举报
百里丶落云 发表于 2022/12/31 23:31:32 2022/12/31
【摘要】 序HELLO ,这里是百里,一个学习中的ABAPER,在SAP系统中存在数据元素的概念,如单号,客户号,料号等等,这些数据均为固定的长度,在比较元素内容时,往往需要增加前导0,或者取消前导0.或者在用户查看时,也会要求去除对应数据的前导0内容.此时就用到去除前导0的动作. 真假前导0真前导0的概念是如单号 vbeln = '00000010' ,通过去除前导0 ,最终获取内容为'10' ....

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展示的结果.

image.png
image.png

真前导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.

结果

image.png

技术总结

本篇文章讲述了工作中会出现的经常使用前导0去除动作.是一个非常重要且容易出错的地方,经常工作中取数时,一查询不到数据就可以看下是否是因为前导0的原因造成无法取数,

失之东隅,收之桑榆 . 学习需要不断总结不断摸索. 思考及记录. 这里是百里一个努力的学习者 .

wallhaven-8xvwvo.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。