程序
选择屏幕相关
工具栏按钮动态隐藏
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.