栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 数据挖掘与分析

ABAP小技巧

ABAP小技巧

 目录

1、OP ALV转 OO ALV

2、字符串替换

3、跳转事务携带参数

4、下拉函数

5、快捷增加去除前导零

6、增加进度提示

7、F4搜索帮助

8、Dialog下拉框

9、编号自增长

10、生产订单的状态

11、连续打印

12、MODULE STATUS排除状态栏

13、退出标准程序回到初始页(例如VA02删除销售订单不允许,回到VA02页面)

14、通过编号找到描述表

15、F9找增强

16、标准类找BADI

17、获取ALV筛选后的数据

18、激活SAP Getway

20、打开GUI键值对匹配

21、数据批量导出Excel,乱行

22、多条错误信息提示框显示

23、在生产机和测试机修改代码(慎用)

24、F4IF_INT_TABLE_VALUE_REQUEST不显示值

25、SmartForms语言翻译

26、标准屏幕上增强获取操作码

27、转JSON串方法,KEY大写或小写

28、ListBox下拉框去掉空白行

29、增强里提示信息

30、submit调用传值

31、报表设置变式,动态日期设置

32、Editor提示框

33、根据表达式替换

34、AlV级别下拉框

35、UUID

36、查询字符在字符串最后的位置

37、获取用户人员和地址编号

38、错误信息捕获

39、选择屏幕上输入参数不转换大写

40、ALV排序

41、ALV TOP OF PAGE

42、传输请求DUMP,查看信息


1、OP ALV转 OO ALV
1、check后获取内容和屏幕不一致
data:o_alv type REF TO cl_gui_alv_grid.

在user_command下
   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    importING
      e_grid = o_alv.

   CALL METHOD o_alv->check_changed_data
*    importING
*      e_valid   =
*    CHANGING
*      c_refresh = 'X'

即可解决

2、在op alv输出之前就转成oo alv

FORM frm_init_events .
  CLEAR:gt_events,gs_events.
  gs_events-name = 'CALLER_EXIT'.
  gs_events-form = 'FRM_CALLER_EXIT'.
  APPEND gs_events TO gt_events.
ENDFORM.

FORM frm_caller_exit USING ls_data TYPE slis_data_caller_exit.
  data: o_alv TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    importING
      e_grid = o_alv.
ENDFORM.

2、字符串替换
data: lv_str type string value '123,456,789.000'.

REPLACe ALL OCCURRENCES OF ',' IN lv_str WITH space.

3、跳转事务携带参数
1.如果是选择屏幕无法通过SET PARAMETER携带参数则用SUBMIT
SUBMIT pp_pick_list  VIA SELECTION-SCREEN   "停留屏幕
          WITH s_matnr IN lr_matnr
          WITH s_aufnr IN lr_aufnr AND RETURN. "返回后回到现在的页面

2.直接通过Call Transction
CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.

4、下拉函数
  1、在POV事件里设置
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'KEY' "指明内表那一列作为值
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = 'P_LIST' "将内表显示在屏幕字段
      value_org        = 'S' "C表示cell,S表示structure
      multiple_choice  = ''  "多项选择,用于SELECT-OPTIONS
      display          = ''  "C则只能显示,不能选择
      callback_program = sy-repid
    TABLES
      value_tab        = lt_list
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.
  
  2、在FORM里设置
  data:LIST  TYPE VRM_VALUES , "list box的值列表
        VALUE LIKE LINE OF LIST . "list box的结构
  VALUE-KEY = '01'.
  VALUE-TEXT = '修改'.
  APPEND VALUE TO LIST .
  VALUE-KEY = '02'.
  VALUE-TEXT = '显示'.
  APPEND VALUE TO LIST .
  "调用函数展示
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID     = 'P_CZ'
      VALUES = LIST.

5、快捷增加去除前导零
"增加前导0
data: ls_matnr TYPE matnr VALUE '15000042'.
DATA(ls_in_matnr) = |{ ls_matnr ALPHA = IN }|.
WRITE: ls_in_matnr.  "示例结果:000000000015000042

"删除前导0
data: gs_matnr TYPE matnr VALUE '000000000015000042'.
DATA(gs_out_matnr) = |{ gs_matnr ALPHA = OUT }|.
WRITE:/ gs_out_matnr.  "示例结果:15000042

6、增加进度提示
DO 1000 TIMES.
  LV_PERCENTAGE = sy-index / 1000.
  DATA(lv_temp) = | { sy-index } / 1000 '正在处理,耐心等候' |.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = LV_PERCENTAGE
      text       = lv_temp.
ENDDO.

7、F4搜索帮助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_lifex-low.
  PERFORM frm_get_lifex_f4_help USING 'S_LIFEX-LOW'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_lifex-high.
  PERFORM frm_get_lifex_f4_help USING 'S_LIFEX-HIGH'.

FORM frm_get_lifex_f4_help  USING p_field TYPE help_info-dynprofld.
  data: BEGIN OF lt_value  OCCURS 0,
           lifex TYPE likp-lifex,
         END OF lt_value.
  SELECT lifex INTO TABLE lt_value[] FROM likp WHERe lifex NE ''.


  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'LIFEX'
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = p_field "显示在哪个控件上
      value_org        = 'S'
      callback_program = sy-repid
    TABLES
      value_tab        = lt_value[].

ENDFORM.

Dialog:
PROCESS ON VALUE-REQUEST.
   FIELD GV_ZDBDH MODULE F4_HELP_ZDBDH.

8、Dialog下拉框
  DATA lt_values TYPE vrm_values WITH HEADER LINE.

  CLEAR lt_values.
  lt_values-key = 'A'.
  lt_values-text = '销售部'.
  APPEND lt_values.

  CLEAR lt_values.
  lt_values-key = 'B'.
  lt_values-text = '市场部'.
  APPEND lt_values.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = 'GV_DROpDOWN'    "dialog控件名
      values          = lt_values[]
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.

9、编号自增长
T-CODE:SNRO

间隔:
    编号长度域:NUMC10
    % 警告:99.0

定制:
    缓冲:无缓冲

Function

data: LV_NUMBER TYPE I.
CALL FUNCTION 'NUMBER_GET_NEXT'
  EXPORTING
    nr_range_nr                   = '02'        "编号
    object                        = 'YTEST001'  "对象名称
    QUANTITY                      = '1'
 importING
   NUMBER                        = LV_NUMBER
 EXCEPTIONS
   INTERVAL_NOT_FOUND            = 1
   NUMBER_RANGE_NOT_INTERN       = 2
   OBJECT_NOT_FOUND              = 3
   QUANTITY_IS_0                 = 4
   QUANTITY_IS_NOT_1             = 5
   INTERVAL_OVERFLOW             = 6
   BUFFER_OVERFLOW               = 7
   OTHERS                        = 8

10、生产订单的状态
表:TJ02
关联状态表:JEST

11、连续打印
LV_CONTROL_PARAMETERS TYPE SSFCTRLOP

在循环打印中
    AT FIRST.
      LV_CONTROL_PARAMETERS-NO_CLOSE = 'X'.
    ENDAT.
    AT LAST.
      LV_CONTROL_PARAMETERS-NO_CLOSE = SPACE.
    ENDAT.

在循环最后
    LV_CONTROL_PARAMETERS-NO_OPEN = 'X'.

12、MODULE STATUS排除状态栏
  data:fcodes TYPE  TABLE OF fcode .
  CLEAR fcodes .
  IF rb_sea EQ 'X' .
    APPEND 'CHANGE' TO fcodes .
  ELSEIF rb_mod EQ 'X' .
    APPEND 'DELETE' TO fcodes .
  ELSEIF rb_del EQ 'X' .
    APPEND 'CHANGE' TO fcodes .
  ENDIF .
  "添加EXCLUDING排除按钮
  SET PF-STATUS 'STATUS_0100' EXCLUDING fcodes .
  SET TITLEBAR 'TITLE0100'.

13、退出标准程序回到初始页(例如VA02删除销售订单不允许,回到VA02页面)
LEAVE TO TRANSACTION SY-TCODE.

14、通过编号找到描述表
找到对应的域元素
点进去
点击值范围
点击值表
点击头部转到->文本表

15、F9找增强
CALL CUSTOMER-FUNCTION
CALL BADI
GET BADI
CALL METHOD

一代增强:在程序的子例程里,以UserExit开头的程序
二代增强:通过Customer-Function调用,以Exit_程序名_xxx 命名
         在表里MODSAP里通过出口函数找增强名称
三代增强:通过Call Badi打断点来查找,或者在类CL_EXITHANDLER里的get_instance方法打断点

16、标准类找BADI
CL_EXITHANDLER=>GET INSTANCE

17、获取ALV筛选后的数据
data: lc_grid TYPE REF TO cl_gui_alv_grid,
      lv_FIDX TYPE lvc_t_fidx.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  importING
    e_grid = lc_grid.

CALL METHOD lc_grid->check_changed_data.

"获取被筛选掉的数据索引内表
CALL METHOD lc_grid->get_filtered_entries
  importING
    et_filtered_entries = lv_FIDX.

18、激活SAP Getway

20、打开GUI键值对匹配

21、数据批量导出Excel,乱行
假设导出10W行数据
    在第98000行乱行
        则需要重新导出 index:98000 - 100000
            不然数据会缺少

22、多条错误信息提示框显示
data: gt_error TYPE esp1_message_tab_type,
      gs_error LIKE LINE OF gt_error.

MSGID:消息号    例如 ZMM
MSGTY:消息类型  例如 E
MSGNO:消息号    例如 009
MSGV1:消息1
MSGV2:消息2
MSGV3:消息3
MSGV4:消息4
LINENO :显示序号

     CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
       TABLES
         i_message_tab = gt_error.

23、在生产机和测试机修改代码(慎用)
data:BEGIN OF itab OCCURS 0,

       line(200) TYPE c,         "如果代码中某行大于了200个字符,请重新设定值,

     END OF itab.

PARAMETERS: progname(120).       "程序名称

READ REPORT progname INTO itab.  "把指定的程序读取到内表

EDITOR-CALL FOR itab.            "对内表数据进行修改(即代码进入编辑状态)

INSERT REPORT progname FROM itab."把修改后的程序插回sap

24、F4IF_INT_TABLE_VALUE_REQUEST不显示值
原因:数据源里的字段不能用C,需要参考数据元素

25、SmartForms语言翻译

SE63->->->

26、标准屏幕上增强获取操作码
FCODE
SY-UCOMM

27、转JSON串方法,KEY大写或小写
/ui2/cl_json=>pretty_mode-none          " 大写
/ui2/cl_json=>pretty_mode-low_case      " 小写
/ui2/cl_json=>pretty_mode-camel_case    " 驼峰

lv_json_str = /ui2/cl_json=>serialize( data = ls_send
                                       pretty_name = /ui2/cl_json=>pretty_mode-low_case ).

28、ListBox下拉框去掉空白行
1、选择屏幕 设置必输即可 OBLIGATORY
2、普通dialog 设置 required

29、增强里提示信息
有的标准增强里,无法输出MESSAGE
可以用FM:
        CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
          EXPORTING
            titel     = '提示'
            textline1 = 'XXX'
*           TEXTLINE2 = ' '
*           start_column = 25
*           start_row = 6
          .

30、submit调用传值
1、传输paramaters参数
submit report with p_werks = '1000'

2、传输select-options参数
data: lt_seltab TYPE TABLE OF rsparams,
      ls_seltab LIKE LINE OF lt_seltab.

"也可传参paramater,kind = P
ls_seltab-selname = 'S_WERKS'.
ls_seltab-kind    = 'S'.
ls_seltab-sign    = 'I'.
ls_seltab-option  = 'EQ'.
ls_seltab-low     = '1000'.
ls_seltab-high    = '2000'.
append ls_seltab to lt_seltab.

"传输参数
submit report with selection-table lt_seltab.

3、paramater和select-options结合
submit report with p_werks = '1000'
              with selection-table = lt_seltab

4、调用完后,返回到当前程序
submit report and return

5、调用程序,跳过选择屏幕
submit report via selection-screen

6、调用程序,指定变式
submit report using selection-set 'variant'

7、调用程序,将结果写在内存里返回到当前程序
submit report exporting list to memory

使用FM:LIST_FROM_MEMORY和LIST_TO_ASCI接收alv参数


  

31、报表设置变式,动态日期设置

还可以设置当前日期的前几天,后几天,范围等等

32、Editor提示框
CALL FUNCTION 'ADA_POPUP_WITH_TABLE'
   EXPORTING
     startpos_col = 1
     startpos_row = 1
   TABLES
     valuetab     = lt_mes.

33、根据表达式替换
" 将 lv_batch 里的所有字母替换成 *
REPLACE ALL OCCURRENCES OF REGEX '[A-Z]' IN lv_batch WITH '*'.

34、AlV级别下拉框
使用OO ALV即可简单实现,标准例子:BCALV_EDIT_06、BCALV_EDIT_07

1、LVC_S_FCAT-drdn_hndl = '1'.

两种都可实现:
1.1
data: gt_ddval TYPE lvc_t_dral,
      gs_ddval TYPE lvc_s_dral.

gs_ddval-handle = '1'.
gs_ddval-value = 'ABC'.
APPEND gs_ddval TO gt_ddval.

CALL METHOD o_alv->set_drop_down_table
  EXPORTING
    it_drop_down_alias = gt_ddval.

1.2
data: gt_dropdown TYPE lvc_t_drop,
      gs_dropdown TYPE lvc_s_drop.

gs_dropdown -handle = '1'.
gs_dropdown -value = 'ABC'.
APPEND gs_dropdown TO gt_dropdown .

CALL METHOD o_alv->set_drop_down_table
  EXPORTING
    it_drop_down = gt_dropdown .

        

35、UUID
    TRY.
        CALL METHOD CL_SYSTEM_UUID=>IF_SYSTEM_UUID_STATIC~CREATE_UUID_C32
          RECEIVING
            UUID = LV_UUID.

      CATCH CX_UUID_ERROR .
    ENDTRY.

36、查询字符在字符串最后的位置
data: moff TYPE i,
      mlen TYPE i,
      mcnt TYPE i.

FIND ALL OCCURRENCES OF 'X'
     IN Str
       MATCH OFFSET moff     "最后一次出现位置
       MATCH LENGTH mlen   "匹配字符长度
       MATCH COUNT  mcnt.  " 计数匹配次数

37、获取用户人员和地址编号
函数:ICL_USER_PERSNUMBER_GET

38、错误信息捕获
LOOP AT lt_return INTO ls_return WHERe type = 'EAX'.
   lv_msg  = lv_msg && ls_return-message.
ENDLOOP.

loop at i_messtab where msgtyp = 'E' or msgtyp = 'A'.
    call function 'MESSAGE_TEXT_BUILD'
      exporting
        msgid               = i_messtab-msgid
        msgnr               = i_messtab-msgnr
        msgv1               = i_messtab-msgv1
        msgv2               = i_messtab-msgv2
        msgv3               = i_messtab-msgv3
        msgv4               = i_messtab-msgv4
      importing
        message_text_output = lv_msg.
endloop.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     INTO lv_msg
     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

39、选择屏幕上输入参数不转换大写

在后面加lower case即可

40、ALV排序
GS_SORT-FIELDNAME = 'XXX'.
GS_SORT-UP = 'X'.  " UP升序 DOWN降序
APPEND GS_SORT TO GT_SORT.

41、ALV TOP OF PAGE
I_CALLBACK_TOP_OF_PAGE  =  'FRM_TOP_OF_PAGE'

FORM FRM_TOP_OF_PAGE.
    data: GT_PAGE TYPE SLIS_T_LISTHEADER,
          GS_PAGE TYPE SLIS_LISTHEADER.

    CLEAR GS_PAGE.
    GS_PAGE-TYP  = 'H'.
    GS_PAGE-INFO  = '抬头文本'
    APPEND GS_PAGE TO GT_PAGE.

    CLEAR GS_PAGE.
    GS_PAGE-TYP  = 'S'.
    GS_PAGE-KEY  = '黑体关键字'.
    GS_PAGE-INFO = '文本信息'.
    APPEND GS_PAGE TO GT_PAGE.

    CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
        EXPORTING
          IT_LIST_COMMENTARY = GT_PAGE.

ENDFORM.

42、传输请求DUMP,查看信息

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/278784.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号