SAP ABAP 增强点查询程序DEMO

此博客展示了一段ABAP代码,主要实现根据输入的事务代码或程序名进行查询。通过多表查询获取相关信息,处理事务代码对应的程序开发类,查找增强和业务加载项信息,还能对结果进行排序和输出,同时支持行选择调用相应事务。

*&---------------------------------------------------------------------*
*& Report  ZTEST_001
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ztest_001 .

TABLES: tstc,
        tadir,
        modsapt,
        modact,
        trdir,
        tfdir,
        enlfdir,
        sxs_attrt ,
        tstct.

DATA: jtab LIKE tadir OCCURS 0 WITH HEADER LINE.
DATA: field1(30).
DATA: v_devclass LIKE tadir-devclass.

PARAMETERS: p_tcode LIKE tstc-tcode,
            p_pgmna LIKE tstc-pgmna.

DATA: wa_tadir TYPE tadir.




START-OF-SELECTION.

  IF NOT p_tcode IS INITIAL.
    SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode.
  ELSEIF NOT p_pgmna IS INITIAL.
    tstc-pgmna = p_pgmna.
  ENDIF.


  IF sy-subrc EQ 0.
    SELECT SINGLE * FROM tadir
    WHERE pgmid = 'R3TR'
    AND object = 'PROG'
    AND obj_name = tstc-pgmna.

    MOVE : tadir-devclass TO v_devclass.

    IF sy-subrc NE 0.
      SELECT SINGLE * FROM trdir
      WHERE name = tstc-pgmna.

      IF trdir-subc EQ 'F'.
        SELECT SINGLE * FROM tfdir
        WHERE pname = tstc-pgmna.

        SELECT SINGLE * FROM enlfdir
        WHERE funcname = tfdir-funcname.

        SELECT SINGLE * FROM tadir
        WHERE pgmid = 'R3TR'
        AND object = 'FUGR'
        AND obj_name EQ enlfdir-area.

        MOVE : tadir-devclass TO v_devclass.
      ENDIF.
    ENDIF.

    SELECT * FROM tadir INTO TABLE jtab
    WHERE pgmid = 'R3TR'
    AND object IN ('SMOD', 'SXSD')
    AND devclass = v_devclass.

    SELECT SINGLE * FROM tstct
    WHERE sprsl EQ sy-langu
    AND tcode EQ p_tcode.

    FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
    WRITE:/(19) 'Transaction Code - ',
    20(20) p_tcode,
    45(50) tstct-ttext.
    SKIP.
    IF NOT jtab[] IS INITIAL.
      WRITE:/(105) sy-uline.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.

* Sorting the internal Table
      SORT jtab BY object.
      DATA : wf_txt(60)     TYPE c,
             wf_smod        TYPE i,
             wf_badi        TYPE i,
             wf_object2(30) TYPE c.
      CLEAR : wf_smod, wf_badi , wf_object2.
* Get the total SMOD.

      LOOP AT jtab INTO wa_tadir.
        AT FIRST.
          FORMAT COLOR COL_HEADING INTENSIFIED ON.

          WRITE:/1 sy-vline,
          2 'Enhancement/ Business Add-in',
          41 sy-vline ,
          42 'Description',
          105 sy-vline.
          WRITE:/(105) sy-uline.
        ENDAT.
        CLEAR wf_txt.
        AT NEW object.
          IF wa_tadir-object = 'SMOD'.
            wf_object2 = 'Enhancement' .
          ELSEIF wa_tadir-object = 'SXSD'.
            wf_object2 = ' Business Add-in'.

          ENDIF.
          FORMAT COLOR COL_GROUP INTENSIFIED ON.

          WRITE:/1 sy-vline,

          2 wf_object2,
          105 sy-vline.
        ENDAT.

        CASE wa_tadir-object.
          WHEN 'SMOD'.
            wf_smod = wf_smod + 1.
            SELECT SINGLE modtext INTO wf_txt
            FROM modsapt
            WHERE sprsl = sy-langu
            AND name = wa_tadir-obj_name.
            FORMAT COLOR COL_NORMAL INTENSIFIED OFF.

          WHEN 'SXSD'.
* For BADis
            wf_badi = wf_badi + 1 .
            SELECT SINGLE text INTO wf_txt
            FROM sxs_attrt
            WHERE sprsl = sy-langu
            AND exit_name = wa_tadir-obj_name.
            FORMAT COLOR COL_NORMAL INTENSIFIED ON.

        ENDCASE.

        WRITE:/1 sy-vline,
        2 wa_tadir-obj_name HOTSPOT ON,
        41 sy-vline ,
        42 wf_txt,
        105 sy-vline.
        AT END OF object.
          WRITE : /(105) sy-uline.
        ENDAT.

      ENDLOOP.

      WRITE:/(105) sy-uline.

      SKIP.
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      WRITE:/ 'No.of Exits:' , wf_smod.
      WRITE:/ 'No.of BADis:' , wf_badi.

    ELSE.
      FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
      WRITE:/(105) 'No userexits or BADis exist'.
    ENDIF.
  ELSE.
    FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
    WRITE:/(105) 'Transaction does not exist'.
  ENDIF.

AT LINE-SELECTION.

  DATA : wf_object TYPE tadir-object.
  CLEAR wf_object.

  GET CURSOR FIELD field1.
  CHECK field1(8) EQ 'WA_TADIR'.
  READ TABLE jtab WITH KEY obj_name = sy-lisel+1(20).
  MOVE jtab-object TO wf_object.

  CASE wf_object.
    WHEN 'SMOD'.
      SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).

      CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.
    WHEN 'SXSD'.
      SET PARAMETER ID 'EXN' FIELD sy-lisel+1(20).
      CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
  ENDCASE.

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
<think>好的,我现在要解决用户提到的SAP ABAP代码问题,具体是关于SELECT INTO TABLE、RANGE、MESSAGE、PERFORM FORM以及数据处理逻辑错误。首先,我需要回顾用户提供的引用内容,看看是否有相关的信息可以参考。 用户引用了三篇关于SAP ABAP的文章,其中提到了通用批导函数、开发规范以及Excel导入内表的实现。特别是引用[2]中提到了SELECTION-SCREEN的控件注释和ALV Fieldcatalog的注释,这可能与代码结构或数据处理有关。引用[3]则涉及Excel数据导入内表,可能与数据处理逻辑错误相关。 接下来,我需要分析用户提到的代码问题。常见的问题可能包括: 1. **SELECT INTO TABLE语句使用不当**:比如没有正确限定条件,导致数据选择不全或过多。可能需要检查WHERE子句是否正确,尤其是使用RANGE表时是否用IN或EQ等操作符正确。 2. **RANGE表定义或填充错误**:RANGE表需要正确声明为RANGE OF结构,并且在填充时SIGN、OPTION、LOW、HIGH字段是否正确赋值。例如,OPTION是否用了'BT'(BETWEEN)时是否同时提供了LOW和HIGH值。 3. **MESSAGE处理问题**:是否在适当的地方使用了MESSAGE语句,比如错误处理时是否中断了程序执行,或者消息类型(E, W, I)是否正确,导致程序流程不符合预期。 4. **PERFORM FORM参数传递错误**:子程序中的形式参数与实际参数是否匹配,尤其是引用传递(CHANGING)和值传递(USING)是否正确使用。此外,是否在调用PERFORM前正确初始化了变量。 5. **数据处理逻辑错误**:比如内表操作(APPEND, MODIFY, DELETE)是否正确,循环处理时是否有遗漏或错误的条件判断,字段符号或数据引用是否正确解引用。 接下来,我需要针对每个问题给出可能的解决方案和示例代码。例如,对于SELECT INTO TABLE的问题,可以检查是否使用了正确的WHERE条件,并确保RANGE表正确填充。对于RANGE表,可能需要检查定义是否为RANGE OF结构,并正确设置SIGN和OPTION。对于MESSAGE,需要确保在错误发生后使用MESSAGE E类型来终止程序,避免继续执行错误的数据处理。PERFORM FORM的问题可能需要检查参数的类型和传递方式是否正确,以及子程序内部是否有正确的逻辑处理。数据处理逻辑错误可能需要使用调试工具或添加日志来跟踪数据变化。 另外,用户提到的引用[3]中的Excel导入函数可能与数据来源有关,如果数据来自Excel,可能需要检查数据导入是否正确,字段映射是否准确,避免数据处理前的数据本身就有问题。 最后,需要提醒用户使用ABAP调试工具,如设置断、查看变量内容,以及使用WRITE或MESSAGE语句输出中间结果,帮助定位问题所在。</think>以下是针对SAP ABAP代码中$SELECT\ INTO\ TABLE$、$RANGE$、$MESSAGE$、$PERFORM\ FORM$及数据处理逻辑错误的常见问题解析与解决方案: --- ### 一、SELECT INTO TABLE 问题 1. **语法与条件缺失** ```abap SELECT * FROM vbak INTO TABLE lt_vbak WHERE vbeln IN s_vbeln. "正确用法需使用IN ``` - 错误示例:若误用`=`而非`IN`处理范围表,会导致仅取第一个值 - 检查:确保RANGE表变量名称正确且与SELECT语句中条件字段匹配[^2] 2. **性能问题** - 避免全表扫描:通过`UP TO n ROWS`限制数据量或添加索引提示`%_HINTS` - 使用`FOR ALL ENTRIES`时需先排除内表为空的情况 --- ### 二、RANGE表使用错误 1. **定义不规范** ```abap RANGES: lr_erdat FOR vbak-erdat. "正确声明方式 ``` - 错误示例:直接使用`DATA`定义而非`RANGES`或`TYPE RANGE OF` - 填充逻辑:需设置`SIGN`(I/E)、`OPTION`(EQ/BT等)、`LOW/HIGH` ```abap lr_erdat-sign = 'I'. lr_erdat-option = 'BT'. lr_erdat-low = '20230101'. lr_erdat-high = '20231231'. APPEND lr_erdat. ``` --- ### 三、MESSAGE处理不当 1. **未中断程序流** ```abap IF lt_data IS INITIAL. MESSAGE e001(zmsg) DISPLAY LIKE 'E'. "E类型消息终止程序 RETURN. ENDIF. ``` - 错误示例:仅用`MESSAGE 'No data' TYPE 'I'`会导致程序继续执行错误逻辑 2. **消息类配置** - 检查事务代码`SE91`中消息ID(如`zmsg`)是否存在并激活 --- ### 四、PERFORM FORM逻辑错误 1. **参数传递问题** ```abap PERFORM process_data USING lt_data CHANGING lv_result. "需匹配FORM参数类型 FORM process_data USING it_data TYPE ty_tab CHANGING cv_result TYPE string. ``` - 错误示例:`USING`传递内表未用`VALUE()`修饰可能导致原表被修改 2. **子程序内未清空变量** ```abap FORM validate_input CHANGING ct_table TYPE ty_tab. REFRESH ct_table. "显式清空输入输出表 ENDFORM. ``` --- ### 五、数据处理逻辑错误 1. **内表操作遗漏** ```abap LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs>). IF <fs>-value > 100. <fs>-status = 'Approved'. ELSE. DELETE lt_data. "错误!应用DELETE lt_data INDEX sy-tabix ENDIF. ENDLOOP. ``` 2. **字段符号未解引用** - 使用动态分配时需确保字段符号已分配: ```abap ASSIGN COMPONENT 'VBELN' OF STRUCTURE <fs> TO FIELD-SYMBOL(<vbel>). IF <vbel> IS ASSIGNED. WRITE <vbel>. ENDIF. ``` --- ### 调试建议 1. 使用`/h`进入调试模式,检查关键变量值 2. 在关键节插入`WRITE`或`MESSAGE`输出中间结果 3. 使用`CL_DEMO_OUTPUT=>DISPLAY`快速查看内表内容 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值