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.

posted @ 2023-02-15 18:19  YangMercy  阅读(683)  评论(0编辑  收藏  举报