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

2022-12-02 14:54:02 浏览数 (2)


开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

HELLO ,这里是百里,一个学习中的ABAPER,在SAP系统中存在数据元素的概念,如单号,客户号,料号等等,这些数据均为固定的长度,在比较元素内容时,往往需要增加前导0,或者取消前导0.或者在用户查看时,也会要求去除对应数据的前导0内容.此时就用到去除前导0的动作.

真假前导0

真前导0的概念是如单号 vbeln = '00000010' ,通过去除前导0 ,最终获取内容为 '10' . 假前导0只是在ALV 对应的界面展示出来时为'10',但是本身值还是原来对应的值.

隐藏前导0,数据值不变

此种方式就是本身值并没有对做对应的前导0去除,可以进行对应的逻辑计算,关联取数等动作.只是在ALV展示界面内容时给用户更好的感官. 因为SAP字段8-20位的都有查看起来会很不友好.

数据定义

代码语言:javascript复制
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.

获取数据

代码语言:javascript复制
START-OF-SELECTION .  
  
PERFORM GETDATA  .

FORM getdata .  
  
SELECT VBELN ,POSNR ,MATNR FROM VBAP INTO  TABLE @GT_DATA WHERE Vbeln in @s_vbeln .  
  
  
  
  
ENDFORM.

数据展示

代码语言:javascript复制
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拼接内容.

使用方式

调用函数

代码语言:javascript复制
增加前导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动作,然后重新赋值到内表.

代码语言:javascript复制
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 人点赞