SAP ABAP 断点调试(四):一次完整的 Debug 需求案例演示

简介: Debug 是对程序运行时环境的跟踪和观测,Debug 调试是开发者需要掌握的核心技能,是解决疑难杂症的金钥匙。这是 SAP ABAP 断点调试的第四篇文章,通过一次完整的 Debug 需求案例演示,贯穿需求、过程和成果输出。

关键字:SAP ABAP Debug 断点调试 BREAK


SAP ABAP 断点调试(一):Debug 基础知识
SAP ABAP 断点调试(二):ABAP Debugger(调试器)
SAP ABAP 断点调试(三):经典 Debug 场景
SAP ABAP 断点调试(四):一次完整的 Debug 需求案例演示

1 Debug 需求

  • 需求描述:在动态编程中,需要主动根据搜索帮助选择一个子例程,以执行目标功能。
  • 需求示例,如下图所示,
    在这里插入图片描述

2 Debug 过程

  • (1)FORM 子例程清单没有找到实体存储。
  • (2)在程序字段上按 F1,进入技术信息,
    在这里插入图片描述
  • (3)可以找到 POV(process on value-request) 实现,
    在这里插入图片描述
  • (4)继续深入堆栈查找关键实现,
    在这里插入图片描述
  • (5)找到函数F4_PROG_SUBPROGRAM
    在这里插入图片描述
  • (6)SE37 测试函数F4_PROG_SUBPROGRAM
    在这里插入图片描述
    测试通过!
  • (7)如果还想继续深入,可以通过 DEBUG 函数F4_PROG_SUBPROGRAM,最终会来到这里,
    在这里插入图片描述
  • (8)继续 F5 深入,又跨程序调用了
    在这里插入图片描述
    子例程列表被存放在内表REPOSITORY[],进入 PERFORM driver_list_output 后发现已经是对数据的输出了,那么我们返回往前找。
  • (9)创建监控点(Watchpoint)查找内表REPOSITORY[]的值变化,
    在这里插入图片描述
    注意创建监控点(Watchpoint)的程序名称和变量需要被程序加载后才能创建成功。
  • (10)按 F8 跟踪,得到答案,函数WB_TREE_GET_OBJECTS
    在这里插入图片描述
    在这里插入图片描述
  • (11)测试函数 WB_TREE_GET_OBJECTS
    在这里插入图片描述
    测试通过!

3 Debug 成果

至此,一共有三种方法可以获得 FORM 子例程清单,对应都可以用来开发搜索帮助。

  • (1)使用函数 VALUE_REQUEST_READ'
  l_prg = l_field-fieldvalue.
  CALL FUNCTION 'VALUE_REQUEST_READ'
    EXPORTING
      dynpfield  = 'DYNP_VARS-SET_BP-FORM'
      dynpname   = sy-dynnr
      progname   = l_repid
      value_type = 'FRM'
      include    = l_prg.
  • (2)使用函数 F4_PROG_SUBPROGRAM
      CALL FUNCTION 'F4_PROG_SUBPROGRAM'
        EXPORTING
          object  = fieldtab-fieldvalue
          program = programmname
        IMPORTING
          RESULT  = fieldtab-fieldvalue
          program = new_progname.
  • (3)函数 WB_TREE_GET_OBJECTS
  REFRESH ISCOMPO.
  CALL FUNCTION 'WB_TREE_GET_OBJECTS'
    EXPORTING
      OTYPE   = L_TYPE
      PROGRAM = PROG1
    TABLES
      OLIST   = ISCOMPO.
*    globale Daten selektieren
  DESCRIBE TABLE KEY2 LINES LINE.
  IF NOT LINE IS INITIAL.
    LOOP AT ISCOMPO
            WHERE NOT NAME IN KEY2.
      DELETE ISCOMPO.
    ENDLOOP.
  ENDIF.

  LOOP AT ISCOMPO.                     " Datentabelle füllen
    MOVE PROG1           TO REPOSITORY-PROGRAM.
    MOVE ISCOMPO-INCL    TO REPOSITORY-INCLUDE.
    MOVE ISCOMPO-NAME    TO REPOSITORY-FORM.
    APPEND REPOSITORY.
  ENDLOOP.
  DESCRIBE TABLE REPOSITORY LINES SY-TABIX.
  IF SY-TABIX = 0. EXIT. ENDIF.
  IF SY-TABIX > LOOPC AND LOOPC NE SPACE.
    L_LOOPC  = LOOPC + 1.
    LOOP AT REPOSITORY FROM L_LOOPC.
      DELETE REPOSITORY.
    ENDLOOP.

  ENDIF.
* endif.
  SORT REPOSITORY BY PROGRAM FORM.

其他

我的微信群、QQ群和其他发布平台。

长期提供开发和运维服务。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐