PO接口项目总结与心得

程序

选择屏幕相关

工具栏按钮动态隐藏

  DATA: lt_extab TYPE TABLE OF sy-ucomm.
  REFRESH: lt_extab.
  IF p_1 = 'X'.
    APPEND 'CXGZ' TO lt_extab.
  ENDIF.
  SET PF-STATUS 'ZFZFB01_STATUS' EXCLUDING lt_extab.

选择屏幕声明

*NO INTERVALS 表示只要一侧
SELECT-OPTIONS: s_zywlx FOR zfzfb01_bkpf-zywlx NO INTERVALS MODIF ID s2.     "业务类型
SELECT-OPTIONS: s_zywxl FOR zfzfb01_bkpf-zywxl NO INTERVALS MODIF ID s2.     "业务小类
SELECT-OPTIONS: s_zxlxf FOR zfzfb01_bkpf-zywxlxf NO INTERVALS MODIF ID s2.   "业务小类细分
SELECT-OPTIONS: s_zywid FOR zfzfb01_bkpf-zywid.                              "业务单号
*UC是必须的
PARAMETER p_1 RADIOBUTTON GROUP g1  USER-COMMAND uc ."审核记账
PARAMETER p_2 RADIOBUTTON GROUP g1."审核冲销

选择屏幕动态显示

 AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-group1 EQ 'S2' AND p_4 = 'X'.
      screen-active = 0. " 0 隐藏,1 显示
      ELSE.
        screen-active = 1.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

选择屏幕设置鼠标焦点

SET CURSOR FIELD <字段名>:设置鼠标焦点到该字段
SET CURSOR 设置到鼠标焦点列还是行
SET CURSOR LINE 设置鼠标焦点到行
GET CURSOR field <字段名> :这个相对应的获取鼠标焦点得到的字段

  IF p_mxhit < 1 .
    SET CURSOR FIELD 'P_MXHIT'.
*    MESSAGE e398(00) WITH '必须是大于0的整数!'.
  ENDIF.

权限校验

  AUTHORITY-CHECK OBJECT 'Z_LO_001'
           ID 'BUKRS' FIELD p_bukrs
           ID 'ACTVT' FIELD '03'.
  IF sy-subrc <> 0.
    SET CURSOR FIELD 'P_BUKRS'.
    MESSAGE s398(00) WITH '指定的公司代码,您无权查询!'.
    EXIT.
  ENDIF.

SQL语句相关

判断内表行数

  DATA: l_lines TYPE i.
  DESCRIBE TABLE gt_tab LINES l_lines.
  IF l_lines = 1.
  ENDIF.

动态sql语句

  DATA: cond(72) TYPE c,
        sql_itab1 LIKE TABLE OF cond. "动态语句
        
          CLEAR:itab,itab[].
          APPEND 'LIFNR = L_ELIFN' TO itab.
          APPEND 'AND EKORG = WA_ORG10-EKORG' TO itab.
          APPEND 'AND DEL_FLAG <> ''X''' TO itab.
          APPEND 'AND BEGDA LE SY-DATUM' TO itab.
          APPEND 'AND ENDDA GE SY-DATUM' TO itab.
          CLEAR l_loc_limit.
          SELECT SUM( loc_limit ) FROM ztfxmm22
            INTO l_loc_limit
            WHERE (itab).

多表联立

    SELECT * FROM zlfbk AS a
      INNER JOIN zlfb1 AS b ON a~lifnr = b~lifnr
      "INNER JOIN zlfb2 AS c ON a~lifnr = c~lifnr
      INTO CORRESPONDING FIELDS OF TABLE gt_alv
      FOR ALL ENTRIES IN lt_zrule
      WHERE a~lifnr = lt_zrule-lifnr
       AND  b~bukrs = lt_zrule-bukrs.

检查透明表中数据有多少行

      SELECT COUNT(*) FROM zlfb1
        WHERE lifnr = ls_zrule-lifnr.
      IF sy-dbcnt <> 1.
      ENDIF.

定义内表结构

  TYPES:BEGIN OF ty_zrule.
          INCLUDE STRUCTURE zlfb1.
  TYPES:
        zrule TYPE zlfb1_bukrs-zrule .
  TYPES:END OF  ty_zrule.
  DATA: lt_zrule TYPE TABLE OF ty_zrule,
        ls_zrule TYPE ty_zrule.

删除内表中对应条件的数据

DELETE lt_zrule WHERE lifnr = ls_zrule-lifnr.

ALV设置相关

快速获取fieldcat

   CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'ZFZFB01_BKPF'
    CHANGING
      ct_fieldcat            = gt_fieldcat[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc <> 0.
  ENDIF.

弹出框输入窗口

      DATA: lt_value TYPE TABLE OF sval,
            ls_value TYPE sval.
      CLEAR: lt_value,
             ls_value.
      ls_value-tabname = 'T001W'.
      ls_value-fieldname = 'WERKS'.
      ls_value-field_obl = 'X'.
      APPEND ls_value TO lt_value.
      CLEAR: ls_value.
      "弹出输入框
      CALL FUNCTION 'POPUP_GET_VALUES'
        EXPORTING
          popup_title     = '输入工厂'
        TABLES
          fields          = lt_value
        EXCEPTIONS
          error_in_fields = 1
          OTHERS          = 2.

弹出提示框

       "弹出确认框
    DATA:lv_yn TYPE string.
    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
      EXPORTING
        titel          = '重要提示'
        textline1      = '数据变更是否保存?'
        cancel_display = 'X'  "space 不显示cancel按钮,'X'是显示取消按钮
      IMPORTING
        answer         = lv_yn.  "确定= J  否=N  取消 = A

获取没有保存的dialog屏幕字段数值

CALL FUNCTION ‘DYNP_VALUES_READ’
动态对比两个结构工作区是否相同

DATA is_likp LIKE zfzfb01_tbaer.
DATA cs_likp LIKE zfzfb01_tbaer.
is_likp-bukrs = '1010'.
cs_likp-bukrs = '1020'.
DATA : lt_idetails  TYPE abap_compdescr_tab  WITH HEADER LINE .
DATA : lr_ref_table_des  TYPE REF TO cl_abap_structdescr .
FIELD-SYMBOLS :   <l_field>   TYPE  any,
                  <l_field_c> TYPE  any.

lr_ref_table_des ?= cl_abap_typedescr=>describe_by_name( 'ZFZFB01_TBAER' ).
lt_idetails[] = lr_ref_table_des->components[].
BREAK-POINT.
LOOP AT lt_idetails.
  ASSIGN COMPONENT lt_idetails-name OF STRUCTURE is_likp TO <l_field>.
  IF sy-subrc = 0.
    ASSIGN COMPONENT lt_idetails-name OF STRUCTURE cs_likp TO <l_field_c> .
    IF sy-subrc = 0.
      <l_field_c>  =  <l_field>  .
    ENDIF.
  ENDIF.
ENDLOOP.

动态对比两个内表是否相同

CTVB_COMPARE_TABLES
参考:https://blog.csdn.net/fengxin_/article/details/106289028?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-106289028-blog-38557433.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-106289028-blog-38557433.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=8

取表最大值+1

SELECT * FROM zfzfb01_modify
  INTO CORRESPONDING FIELDS OF TABLE lt_modify
  WHERE zywxt = lw_bkpf_cur-zywxt
  AND zywid = lw_bkpf_cur-zywid
  AND bukrs = lw_bkpf_cur-bukrs
  AND gjahr = lw_bkpf_cur-gjahr.
IF sy-subrc = 0.
  SORT lt_modify DESCENDING BY changenr.
  READ TABLE lt_modify INTO lw_modify INDEX 1.
  lw_modify-changenr = lw_modify-changenr + 1.
ELSE.
  lw_modify-changenr = '1'.
ENDIF.

字符串操作相关

*删出符号 ‘,’
REPLACE ALL OCCURRENCES OF  ','   IN  金额字段  WITH  ``. 
*检测符号
IF a ca '-'.
*字段合并
CONCATENATE ls_alv-bankn ls_alv-bkref INTO ls_alv-bkref.

F4搜索帮助时更新获取最新的前台界面字段

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_zywlx-low."F44 搜索帮助
  PERFORM frm_request_f4 USING 'S_ZYWLX-LOW' 'ZYWLX' 'ZFZFB01_ZYWLX'.

FORM frm_request_f4 USING pv_field  TYPE help_info-dynprofld  "选择屏幕字段
                                pf_name   TYPE cdpos-fname         "字段名
                                ptab_name TYPE cdpos-tabname.      "表名
*--> 动态内表
  DATA : dy_table TYPE REF TO data.
  FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE .
  CREATE DATA dy_table TYPE TABLE OF (ptab_name).
  ASSIGN dy_table->* TO <dyn_table>.
*--> 立即获取当前屏幕的字段值
  DATA: lt_dynpread TYPE STANDARD TABLE OF dynpread .
  DATA: lw_dynpread TYPE dynpread .
  lw_dynpread-fieldname = 'P_ZYWXT'."字段名
  APPEND lw_dynpread TO lt_dynpread .
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname               = sy-repid
      dynumb               = sy-dynnr
    TABLES
      dynpfields           = lt_dynpread
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      invalid_parameter    = 7
      undefind_error       = 8
      double_conversion    = 9
      stepl_not_found      = 10
      OTHERS               = 11.
  READ TABLE lt_dynpread INTO lw_dynpread INDEX 1.

  SELECT * FROM (ptab_name)
    INTO CORRESPONDING FIELDS OF TABLE <dyn_table>
    WHERE zywxt = lw_dynpread-fieldvalue.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = pf_name
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = pv_field
      value_org       = 'S'
    TABLES
      value_tab       = <dyn_table>
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.
ENDFORM.

锁定数据与锁表提示

        "锁定所选中数据
        CALL FUNCTION 'ENQUEUE_EZ_ZFZFB_BKPF'
          EXPORTING
            zywxt          = ls_header-zywxt
            zywid          = ls_header-zywid
            bukrs          = ls_header-bukrs
            gjahr          = ls_header-gjahr
          EXCEPTIONS
            foreign_lock   = 1
            system_failure = 2
            OTHERS         = 3.
        IF sy-subrc <> 0.
          CLEAR l_msgv1.
          l_msgv1 = '该数据被用户:' && sy-msgv1 && '锁定!'."锁表提示
          MESSAGE l_msgv1 TYPE 'E'.
        ENDIF.

时间戳

*ls_log-ztimestamp2的数据元素类型为TIMESTAMP
(DEC,15,简短格式的 UTC 时戳 (YYYYMMDDhhmmss))

      CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP'
        EXPORTING
          i_datlo     = sy-datum
          i_timlo     = sy-uzeit
          i_tzone     = 'UTC'
        IMPORTING
          e_timestamp = ls_log-ztimestamp2.

消息弹窗提示(多文本)

        DATA lt_t_msg TYPE rs_t_msg.
        DATA lt_w_msg TYPE bal_s_msg.
        DATA lf_one_msg_as_sys_msg TYPE flag.
        DATA ls_exit_command TYPE  bal_s_excm .
        LOOP AT gt_messtab WHERE msgtyp = 'E'.
          lt_w_msg-msgty = gt_messtab-msgtyp.
          lt_w_msg-msgid = gt_messtab-msgid .
          lt_w_msg-msgno = gt_messtab-msgnr .
          lt_w_msg-msgv1  = gt_messtab-msgv1 .
          lt_w_msg-msgv2  = gt_messtab-msgv2 .
          lt_w_msg-msgv3  = gt_messtab-msgv3 .
          lt_w_msg-msgv4  = gt_messtab-msgv4 .
          APPEND lt_w_msg TO lt_t_msg.
          CLEAR lt_w_msg.
        ENDLOOP.
        cl_epic_ui_services=>show_messages_with_alog(
            it_messages       = lt_t_msg
            iv_one_msg_direct = lf_one_msg_as_sys_msg ).
        CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP'
          EXPORTING
            i_t_msg           = lt_t_msg
            i_txt             = '自动记账返回消息'
            i_with_s_on_empty = rs_c_true
            i_one_msg_direct  = rs_c_true
            i_one_msg_type_s  = rs_c_true
          IMPORTING
            e_s_exit_command  = ls_exit_command.

实例效果图
获取消息号的提示消息文本:例如:文本文本 &1 &2 文本文本!

DATA: lv_msg TYPE char100.
DATA: zmesstab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE.
CLEAR lv_msg.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = zmesstab-msgid
          msgnr               = zmesstab-msgnr
          msgv1               = zmesstab-msgv1
          msgv2               = zmesstab-msgv2
          msgv3               = zmesstab-msgv3
          msgv4               = zmesstab-msgv4
        IMPORTING
          message_text_output = lv_msg.

异步调用函数

      CALL FUNCTION 'ZGTM_CREATE_ZDJZ'
        STARTING NEW TASK 'ZGTM_ZDJZ'              "异步调用
        PERFORMING return_form ON END OF TASK     "原程序同步等待返回结果-1  配和2一同使用
        TABLES
          pt_mseg               = gt_mseg
          re_messtab            = gt_messtab
        EXCEPTIONS
          communication_failure = 1
          system_failure        = 2.

WAIT UNTIL gt_messtab IS NOT INITIAL UP TO 30 SECONDS.  "原程序同步等待返回结果-2  配和1一同使用,条件和时长共同作用,也可分开使用,UP TP 30 SECONDS为等待三十秒

程序运行进度显示

PERFORM display_process USING 5  '5% 查询库存'.
*PERFORM  XXXX "库存取值逻辑
PERFORM display_process USING 10  '10% 查询批次信息'.
*PERFORM  XXXX "批次取值逻辑
FORM display_process USING process
                           text.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = process
      text       = text.
ENDFORM.

初始化日期-月

DATA: 
      lp_begin LIKE sy-datum,
      lp_end   LIKE sy-datum.
  CLEAR: lp_begin, lp_end.
  "月初
  CONCATENATE p_year '01' INTO lp_begin.
  "月末
  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = lp_begin
    IMPORTING
      last_day_of_month = lp_end.

SAP 程序事件

1. 报表事件: INITIALIZATION:

 程序初始化,类似于C#中的窗体构造函    数    START-OF-SELECTION:选择开始事件(默认事件),在选择屏幕的处理结束后触发    END-OF-SELECTION:选择结束事件,在所有逻辑数据库      处理结束后触发,一般用于输出列表

2. 选择屏幕事件(在INITIALIZATION和START-OF-SELECTION之间触发):

AT SELECTION-SCREEN OUTPUT:选择屏幕的PBO事件 AT SELECTION-SCREEN … :选择屏幕的PAI事件,有多个附加项

3. 逻辑数据库事件(在START-OF-SELECTION事件结束以后触发,用于选择并整理数据):

GET node … 选择逻辑数据库中当前级别数据中的数据 GET node LATE 选择逻辑数据库中上一级别数据源中的数据

4. 列表事件(在所有报表过程事件和选择屏幕事件结束之后,开始触发列表事件)

TOP-OF-PAGE:页眉,每个新页面开始时触发 END-OF-PAGE:页脚,当前页面结束前触发 AT-LINE-COMMAND:行选择控制,当用户选择某列表行时触发 AT-USER-COMMAND:用户交互控制

5. 一般报表的触发过程

 (1) 1型程序开始时,LOAD-OF-PROGRAM触发,运行时环境将为该程序在应用服务器中分配程序上下文以及相关内存区域存储内表数据对象,接下来的程序流程将由ABAP运行时环境控制
    ( ABAP处理器)   
 (2) INITIALIZATION事件触发   
 (3) 如果有选择屏幕,则在每次屏幕输出之前触发AT SELECTION-SCREEN OUTPUT,运行时环境将选择屏幕发送至显示服务器 ;如果用户在选择屏幕中输入某些值后执行某些功能,
     系统将  触发AT SELECTION-SCREEN事件,为用户提示消息信息等。整个过程由屏幕处理器和ABAP处理器交互处理,系统自动在其中进行切换 
 (4) 当用户按下Execute按钮后,系统回收对程序的控制,触发START-OF-SELECTION  
 (5) 如果有逻辑数据库,则触发GET和GET LATE。   
 (6) 最后将触发END-OF-SELECTION事件,此后系统运行时环境将控制交给显示服务器   
 (7) 列表输出过程中将触发TOP-OF-PAGE和END-OF-PAGE。当用户点击Back返回选择屏幕时,LOAD-OF-PROGRAM和INITIALIZATION不会触发   
 (8) 如果列表存在交互事件,则会在满足交互条件的时候触发。

6. 事件块的终止(以下语句除STOP外若存在于循环中,则仅跳出该循环)

 (1) STOP. 终止当前事件块并跳转至END-OF-SELECTION;若在END-OF-SELECTION中有STOP则直接退出。   
 (2) EXIT. 离开所有事件块并转到列表输出页面(即EXIT之前已经被输出的内容) 
 (3) CHECK. 如果CHECK条件为假,则转到下一个事件块

SAP 程序生成SM37后台JOB

定义后台作业

DATA: ls_tbtcjob_n TYPE tbtcjob.
RANGES: p_bukrs FOR zslo007-bukrs.
RANGES: s_ekorg FOR zslo007-ekorg.

CONCATENATE 'ZB007_' ls_04-zgroup  INTO ls_tbtcjob_n-jobname.

  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
      jobname          = ls_tbtcjob_n-jobname
      jobclass         = 'C'
    IMPORTING
      jobcount         = ls_tbtcjob_n-jobcount
    CHANGING
      ret              = lv_ret
    EXCEPTIONS
      cant_create_job  = 1
      invalid_job_data = 2
      jobname_missing  = 3
      OTHERS           = 4.

  REFRESH: p_bukrs.
  CLEAR: p_bukrs.
  p_bukrs-low = ls_04-bukrs.
  p_bukrs-sign = 'I'.
  p_bukrs-option = 'EQ'.
  APPEND p_bukrs.


  REFRESH: s_ekorg.
  CLEAR: s_ekorg.
  IF ls_04-ekorg = '*'.
    s_ekorg-low = ls_04-ekorg.
    s_ekorg-sign = 'I'.
    s_ekorg-option = 'CP'.
    APPEND s_ekorg.
  ELSE.
    s_ekorg-low = ls_04-ekorg.
    s_ekorg-sign = 'I'.
    s_ekorg-option = 'EQ'.
    APPEND s_ekorg.
  ENDIF.
  
  SUBMIT z_lo_rpt_0007_a   WITH p_bukrs IN p_bukrs
                           WITH s_ekorg IN s_ekorg
                           WITH p_year = p_zyear
                           WITH p_r1 = 'X'
                           WITH p_ccxx = 'X'
                           TO SAP-SPOOL SPOOL PARAMETERS ls_print_parameters
                           WITHOUT SPOOL DYNPRO
                           VIA JOB ls_tbtcjob_n-jobname NUMBER ls_tbtcjob_n-jobcount
                           AND RETURN.
  CALL FUNCTION 'JOB_CLOSE'
    EXPORTING
      jobcount             = ls_tbtcjob_n-jobcount
      jobname              = ls_tbtcjob_n-jobname
      sdlstrtdt            = lv_datum2  "开始日期
      sdlstrttm            = lv_uzeit2  "开始时间
       "strtimmed            = 'X'   "立即执行,如果需要立即执行则设置为'X'
    EXCEPTIONS
      cant_start_immediate = 1
      invalid_startdate    = 2
      jobname_missing      = 3
      job_close_failed     = 4
      job_nosteps          = 5
      job_notex            = 6
      lock_failed          = 7
      OTHERS               = 8.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值