SM30检查 新建数据 修改数据自动带出默认值 以及根据SM30表修改记录检查 搜索帮助
表维护创建好后 将相应字段设置为不可输入
设置对应的事件FORM程序
本需求是根据表维护创建修改自动带出 日期事件 用户名
同时对维护内容校验
Total 表会存表维护全部数据 包括更新记录
<action> 可以读到相应状态 再处理
需要注意如果报错需要用以下方法报错
sy-subrc = 4.
vim_abort_saving = 'X'.
*----------------------------------------------------------------------* ***INCLUDE LZTJP33_FGJPF02. *----------------------------------------------------------------------* DEFINE assign_field. ASSIGN COMPONENT &1 OF STRUCTURE <ls_maintview> TO <lv_field>. IF sy-subrc = 0. IF <lv_field> IS ASSIGNED. <lv_field> = &2. ENDIF. ENDIF. END-OF-DEFINITION. FORM create_entry. FIELD-SYMBOLS: <ls_maintview> TYPE any, <lv_field> TYPE any. CHECK x_header-maintview IS NOT INITIAL. ASSIGN (x_header-maintview) TO <ls_maintview>. CHECK sy-subrc = 0. CHECK <ls_maintview> IS ASSIGNED. assign_field 'ZCREATE_DT' sy-datum. assign_field 'ZCREATE_TM' sy-uzeit. assign_field 'ZCREATE_CD' sy-uname. DATA :lt_ztjp33_fgjp TYPE TABLE OF ztjp33_fgjp, ls_ztjp33_fgjp TYPE ztjp33_fgjp. LOOP AT total. IF <action> <> 'D' . MOVE-CORRESPONDING <vim_total_struc> TO ls_ztjp33_fgjp. APPEND ls_ztjp33_fgjp TO lt_ztjp33_fgjp. CLEAR ls_ztjp33_fgjp. ENDIF. ENDLOOP. READ TABLE lt_ztjp33_fgjp INTO ls_ztjp33_fgjp WITH KEY zts_ma_cd = ztjp33_fgjp-zts_ma_cd fisc_year = ztjp33_fgjp-fisc_year del = ''. IF sy-subrc = 0 . MESSAGE 'Existing data exists, please check'&& ztjp33_fgjp-zts_ma_cd && ztjp33_fgjp-fisc_year TYPE 'E' . ENDIF. ENDFORM. FORM change_entry. DATA :lt_ztjp33_fgjp TYPE TABLE OF ztjp33_fgjp, ls_ztjp33_fgjp TYPE ztjp33_fgjp. DATA :lt_out TYPE TABLE OF ztjp33_fgjp, ls_out TYPE ztjp33_fgjp. TYPES:BEGIN OF ty_out, zts_ma_cd TYPE ztjp33_fgjp-zts_ma_cd, fisc_year TYPE ztjp33_fgjp-fisc_year, ztime TYPE i, END OF ty_out. DATA: gt_out TYPE TABLE OF ty_out, gs_out TYPE ty_out. DATA: lo_data TYPE REF TO data, lv_tabix TYPE sy-tabix. FIELD-SYMBOLS: <ls_maintview> TYPE any, <lv_field> TYPE any. IF x_header-maintview IS NOT INITIAL. CREATE DATA lo_data TYPE (x_header-maintview). IF lo_data IS BOUND. ASSIGN lo_data->* TO <ls_maintview>. ENDIF. IF <ls_maintview> IS ASSIGNED. IF <action> = 'U'. LOOP AT total. READ TABLE extract WITH KEY <vim_xtotal_key>. IF sy-subrc = 0. lv_tabix = sy-tabix. ELSE. CONTINUE. ENDIF. IF <action> = 'U'. CLEAR <ls_maintview>. MOVE-CORRESPONDING <vim_total_struc> TO <ls_maintview>. assign_field 'ZUPDATE_DT' sy-datum. assign_field 'ZUPDATE_TM' sy-uzeit. assign_field 'ZUPDATE_CD' sy-uname. MOVE-CORRESPONDING <ls_maintview> TO <vim_total_struc>. MODIFY total. extract = total. MODIFY extract INDEX lv_tabix. ENDIF. ENDLOOP. ENDIF. ENDIF. ENDIF. *CHECK SM30 create change LOOP AT total . IF <action> <> 'D' . MOVE-CORRESPONDING <vim_total_struc> TO ls_ztjp33_fgjp. APPEND ls_ztjp33_fgjp TO lt_ztjp33_fgjp. CLEAR ls_ztjp33_fgjp. ENDIF. ENDLOOP. IF lt_ztjp33_fgjp IS NOT INITIAL. SORT lt_ztjp33_fgjp BY zts_ma_cd fisc_year del. DELETE lt_ztjp33_fgjp WHERE del IS NOT INITIAL. lt_out[] = lt_ztjp33_fgjp[]. DELETE ADJACENT DUPLICATES FROM lt_out COMPARING zts_ma_cd fisc_year. LOOP AT lt_ztjp33_fgjp INTO ls_ztjp33_fgjp. READ TABLE lt_out INTO ls_out WITH KEY zts_ma_cd = ls_ztjp33_fgjp-zts_ma_cd fisc_year = ls_ztjp33_fgjp-fisc_year del = ''. IF sy-subrc = 0. gs_out-zts_ma_cd = ls_ztjp33_fgjp-zts_ma_cd. gs_out-fisc_year = ls_ztjp33_fgjp-fisc_year. gs_out-ztime = gs_out-ztime + 1. COLLECT gs_out INTO gt_out. CLEAR gs_out. ENDIF. ENDLOOP. LOOP AT gt_out INTO gs_out. IF gs_out-ztime > 1. sy-subrc = 4. vim_abort_saving = 'X'. MESSAGE s001(00) WITH 'Existing data exists, please check'&& gs_out-zts_ma_cd && gs_out-fisc_year DISPLAY LIKE 'E' . EXIT. ENDIF. ENDLOOP. ELSE. sy-subrc = 0. ENDIF. ENDFORM.
搜索帮助
"定义搜索帮助表机构 TYPES:BEGIN OF typ_del, del LIKE ztjp33_fgjp-del, END OF typ_del. DATA lt_del TYPE STANDARD TABLE OF typ_del. "搜索帮助表赋值 lt_del = VALUE #( ( del = '') ( del = 'X') ). "调用显示搜帮助函数 CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING * DDIC_STRUCTURE = ' ' retfield = 'DEL' dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = 'DEL' value_org = 'S' "C表示cell,S表示structure TABLES value_tab = lt_del * FIELD_TAB = * RETURN_TAB = * DYNPFLD_MAPPING = EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.
SM30对维护值检查简单理解
添加事件01 将TOTAL表的处理出来判断
DATA:LT_ZSD002 TYPE TABLE OF ZSD002, LS_ZSD002 TYPE ZSD002. LOOP AT total. CASE <ACTION>. * WHEN 'U'. "修改 * APPEND <VIM_TOTAL_STRUC> TO LT_ZSD002. WHEN 'N'. "新增 APPEND <vim_total_struc> TO LT_ZSD002. WHEN 'D'. WHEN OTHERS. ENDCASE. ENDLOOP. LOOP AT LT_ZSD002 INTO LS_ZSD002. IF LS_ZSD002-MAKTX = 'TEST'. MESSAGE S001(00) WITH 'Existing data exists, please check'DISPLAY LIKE 'E' . VIM_ABORT_SAVING = 'X'. SY-SUBRC = 4. EXIT. ENDIF. ENDLOOP. IF LT_ZSD002 IS INITIAL. SY-SUBRC = 0. ENDIF.
检查停留在SM30 方法在消息后增加
RAISE saving_correction_failed.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」