更新表的程序

 *&---------------------------------------------------------------------*
*& Report   表更新
*&
*&---------------------------------------------------------------------*
*& データ更新PG(ALV)
*&
*&---------------------------------------------------------------------*
REPORT  更新_data  NO STANDARD PAGE HEADING.

TYPE-POOLS:
  rsds, slis.
* Table fields information type
TYPES:
  t_tabinfo         TYPE  STANDARD TABLE OF rpy_fiel.

DATA:
  itab_data         TYPE  stringtab,    "Input File data
  itab_table        TYPE  REF TO data,  "Table data pointer
  itab_tabinfo      TYPE  t_tabinfo,
  v_sep             TYPE  c  LENGTH  1, "separator
  v_where           TYPE  string,
  v_canc            TYPE  c  LENGTH  1,
  v_writemode       TYPE  c  LENGTH  1.

* ALV用
DATA:
  l_str_layout    TYPE slis_layout_alv,          "ALV用レイアウト
  l_str_t_fcat    TYPE slis_t_fieldcat_alv,      "ALV用出力構造
  l_str_fcat      TYPE slis_fieldcat_alv,        "ALV用出力構造
  itab_events      TYPE slis_t_event_exit,
  l_str_events     TYPE slis_event_exit,
  itab_top_of_page TYPE slis_t_listheader.       "ALV用ヘッダ

FIELD-SYMBOLS:
  <fs_itab>         TYPE  STANDARD TABLE,
  <ls_itab>         TYPE  ANY,
  <fs_itab_upd>     TYPE  STANDARD TABLE.

* Parameters Definition
PARAMETERS:
  p_table      TYPE  rsrd1-tbma_val.        "Table Name

*&---------------------------------------------------------------------*
INITIALIZATION.

  DATA:
    itab_seltext             TYPE  TABLE OF rsseltexts,
    str_seltext              TYPE  rsseltexts.

  str_seltext-name = 'P_TABLE'.
  str_seltext-text = 'テーブル名'.
  str_seltext-kind = 'P'.
  APPEND str_seltext TO itab_seltext.

  str_seltext-name = 'P_DFILE'.
  str_seltext-text = 'ダウンロードファイル名'.
  str_seltext-kind = 'P'.
  APPEND str_seltext TO itab_seltext.

  CALL FUNCTION 'SELECTION_TEXTS_MODIFY'
    EXPORTING
      program                     = sy-repid
    TABLES
      seltexts                    = itab_seltext
    EXCEPTIONS
      program_not_found           = 1
      program_cannot_be_generated = 2
      OTHERS                      = 3.

AT SELECTION-SCREEN.

  PERFORM  check_tablename
           USING
             p_table.

*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM  where_edit
             USING
               p_table
             CHANGING
               v_where
               v_canc.

  IF  v_canc  IS NOT INITIAL.
    RETURN.
  ENDIF.

  CREATE DATA  itab_table  TYPE STANDARD TABLE OF (p_table).
  ASSIGN  itab_table->*  TO  <fs_itab>.
  ASSIGN  itab_table->*  TO  <fs_itab_upd>.
* Select data
  PERFORM  select_data
             USING
               p_table
               v_where
             CHANGING
               <fs_itab>.

  IF  <fs_itab>  IS INITIAL
  AND sy-batch  <>  'X'.
    MESSAGE  s429(mo).
    RETURN.
  ENDIF.

* Get table fields information
  PERFORM  get_tableinfo
             USING
               p_table
             CHANGING
               itab_tabinfo.

  PERFORM  sort_itab
             USING
               itab_tabinfo
             CHANGING
               <fs_itab>.

* ALV出力処理
  PERFORM fm_out_data.

 

  FREE: <fs_itab>,
        itab_tabinfo.
*&---------------------------------------------------------------------*
*&      Form  select_data
*&---------------------------------------------------------------------*
*       select from DB
*----------------------------------------------------------------------*
*      -->U_TABLENAME     DB table name
*      <--C_TABLEDATA     DB data
*----------------------------------------------------------------------*
FORM  select_data
        USING
          u_tablename             TYPE  c
          u_where                 TYPE  string
        CHANGING
          c_itab                  TYPE  STANDARD TABLE.

  IF u_where IS INITIAL.
    SELECT *
      FROM  (u_tablename)
      INTO TABLE  c_itab.
  ELSE.
    SELECT *
      FROM  (u_tablename)
      INTO TABLE  c_itab
      WHERE  (u_where).
  ENDIF.

ENDFORM.                    " select_data

*&---------------------------------------------------------------------*
*&      Form  get_tableinfo
*&---------------------------------------------------------------------*
*       Get table fields information
*----------------------------------------------------------------------*
*  -->  U_TABLENAME    DB Table name
*  <--  C_TABLEINFO    DB fields information
*----------------------------------------------------------------------*
FORM  get_tableinfo
        USING
          u_tablename             TYPE  c
        CHANGING
          c_tableinfo             TYPE  t_tabinfo.

  DATA:
    l_name          TYPE  rpy_tabl-tablname.
*----------------------------------------------------------------------*
  l_name = u_tablename.

  CALL FUNCTION 'RPY_TABLE_READ'
    EXPORTING
*     ACTIVATION_TYPE_I       = 'M'
*     LANGUAGE                = SY-LANGU
      table_name              = l_name
*     WITH_DOCU               = ' '
*     DOCUTYPE                = 'U'
*   IMPORTING
*     TABL_INF                =
*     TABL_TECHNICS           =
*     ACTIVATION_TYPE_O       =
    TABLES
      tabl_fields             = c_tableinfo
*     DOCU_TABLE_USER         =
*     DOCU_TABLE_TECH         =
    EXCEPTIONS
     cancelled               = 1
     not_found               = 2
     permission_error        = 3
     illegal_type            = 4
      OTHERS                  = 5
            .

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  DELETE  c_tableinfo
    WHERE  datatype  IS INITIAL.

ENDFORM.                    " get_tableinfo
*&---------------------------------------------------------------------*
*&      Form  where_edit
*&---------------------------------------------------------------------*
*       抽出條件指定畫面表示(動的選択畫面)
*----------------------------------------------------------------------*
*      <--prf_where   WHERE句
*----------------------------------------------------------------------*
FORM  where_edit
        USING
          u_table                 TYPE  c
        CHANGING
          prf_where               TYPE  string
          c_canc                  TYPE  c.

  DATA :
    ldt_tablestab                    TYPE TABLE OF rsdstabs,
    lds_tablestab                    TYPE rsdstabs,
    ldt_fieldstab                    TYPE TABLE OF rsdsfields,
    lds_fieldstab                    TYPE rsdsfields,
    ldt_dd03l                        TYPE TABLE OF dd03l,
    lds_dd03l                        TYPE dd03l,
    ldf_selid                        TYPE rsdynsel-selid,
    ldt_clauses                      TYPE rsds_twhere,
    lds_clauses                      TYPE rsds_where,
    ldf_line                         TYPE rsdswhere-line,
    l_title                          TYPE sy-title.
*----------------------------------------------------------------------*

  CLEAR: c_canc,
         prf_where.

* tables_tab
  lds_tablestab-prim_tab = u_table.
  APPEND lds_tablestab TO ldt_tablestab.

* fields_tab
  SELECT *
    FROM dd03l
    INTO TABLE ldt_dd03l
   WHERE tabname = u_table.

* 主キーの項目のみ表示する
  IF sy-subrc = 0.
    SORT ldt_dd03l BY position.
    LOOP AT ldt_dd03l INTO lds_dd03l.
*      CHECK lds_dd03l-keyflag = 'X'.
      CHECK lds_dd03l-fieldname <> 'MANDT'.    "クライアントを含まない
      CHECK lds_dd03l-rollname  <> 'MANDT'.
      CHECK lds_dd03l-fieldname+0(1) <> '.'.   "INCLUDEを含まない
      CHECK lds_dd03l-leng > 0.
      lds_fieldstab-tablename = lds_dd03l-tabname.
      lds_fieldstab-fieldname = lds_dd03l-fieldname.
      APPEND lds_fieldstab TO ldt_fieldstab.
      IF sy-tabix >= 20.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.

  CALL FUNCTION 'FREE_SELECTIONS_INIT'
*     EXPORTING
*       KIND                           = 'T'
*       EXPRESSIONS                    =
*       FIELD_RANGES_INT               =
*       FIELD_GROUPS_KEY               =
*       RESTRICTION                    =
*       ALV                            =
*       CURR_QUAN_PROG                 = SY-CPROG
*       CURR_QUAN_RELATION             =
     IMPORTING
       selection_id                   = ldf_selid
*       WHERE_CLAUSES                  =
*       EXPRESSIONS                    =
*       FIELD_RANGES                   =
*       NUMBER_OF_ACTIVE_FIELDS        =
     TABLES
       tables_tab   = ldt_tablestab
       fields_tab   = ldt_fieldstab
     EXCEPTIONS
       fields_incomplete              = 1
       fields_no_join                 = 2
       field_not_found                = 3
       no_tables                      = 4
       table_not_found                = 5
       expression_not_supported       = 6
       incorrect_expression           = 7
       illegal_kind                   = 8
       area_not_found                 = 9
       inconsistent_area              = 10
       kind_f_no_fields_left          = 11
       kind_f_no_fields               = 12
       too_many_fields                = 13
       dup_field                      = 14
       field_no_type                  = 15
       field_ill_type                 = 16
       dup_event_field                = 17
       node_not_in_ldb                = 18
       area_no_field                  = 19
       OTHERS                         = 20
              .

  IF sy-subrc <> 0.
    MESSAGE  e001(00)  WITH  '選択畫面を表示できません'.                "text-m06.
  ENDIF.

  CONCATENATE
      text-m02
      u_table
    INTO  l_title
    SEPARATED BY  space.

* 動的選択畫面 - 表示
  CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
    EXPORTING
      selection_id  = ldf_selid
      title         = l_title
      frame_text    = '選択基準'
      status        = 1
      tree_visible  = ' '
    IMPORTING
      where_clauses = ldt_clauses
    TABLES
      fields_tab    = ldt_fieldstab
    EXCEPTIONS
      no_action     = 2
      OTHERS        = 5.
  CASE sy-subrc.
    WHEN 0.
    WHEN 2.
      c_canc  =  'X'.
      RETURN.
    WHEN OTHERS.
      MESSAGE  e001(00)  WITH '選択畫面を表示できません'.               "text-m06.
  ENDCASE.

* 対象テーブルの入力値だけを取得
  lds_clauses-tablename = u_table.
  READ TABLE ldt_clauses
    WITH KEY tablename  =  lds_clauses-tablename
        INTO lds_clauses.                                   "#EC *

* SQLのWhere句用に加工
  LOOP AT lds_clauses-where_tab INTO ldf_line.
    CONCATENATE prf_where
                ldf_line
           INTO prf_where  SEPARATED BY space.
  ENDLOOP.

ENDFORM.                    " where_edit
*&---------------------------------------------------------------------*
*&      Form  check_tablename
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_TABLE  text
*----------------------------------------------------------------------*
FORM  check_tablename
        USING
          u_tablename             TYPE  c.

  DATA:
    l_tabname       TYPE  tabname.
*----------------------------------------------------------------------*
  IF  u_tablename  IS INITIAL.
    SET CURSOR FIELD  'P_TABLE'.
*    MESSAGE  text-m10  TYPE  'E'.
    MESSAGE  'テーブル名を指定してください'  TYPE  'E'.
  ENDIF.

*check table existence
  SELECT  SINGLE tabname
     FROM dd02l
     INTO l_tabname
    WHERE tabname  = u_tablename
      AND as4local = 'A'
      AND as4vers  = 0
      AND tabclass = 'TRANSP'.

  IF sy-subrc <> 0.
    SET CURSOR FIELD  'P_TABLE'.
    MESSAGE e000(0k)
*     WITH  text-m02  u_tablename text-m03.
      WITH  'テーブル'  u_tablename 'は存在しません'.
  ENDIF.

*Add-on table check
  IF NOT (  u_tablename(1) = 'Z'
         OR u_tablename(1) = 'Y' ).
    SET CURSOR FIELD  'P_TABLE'.
    MESSAGE e000(0k)
*     WITH  text-m02  u_tablename text-m04.
      WITH  'テーブル' u_tablename 'はアドオンテーブルではありません'.
  ENDIF.

ENDFORM.                    " check_tablename
*&---------------------------------------------------------------------*
*&      Form  sort_itab
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ITAB_TABINFO  text
*      <--P_<FS_ITAB>  text
*----------------------------------------------------------------------*
FORM  sort_itab
        USING
          u_itab_tabinfo          TYPE  t_tabinfo
        CHANGING
          c_itab_table            TYPE  STANDARD TABLE.

  DATA:
    l_sort_tab      TYPE  abap_sortorder_tab,
    l_sort_str      TYPE  abap_sortorder,
    l_str_tabinfo   TYPE  rpy_fiel.
*----------------------------------------------------------------------*
  CLEAR: l_sort_str,
         l_sort_tab.

  LOOP AT  u_itab_tabinfo  INTO  l_str_tabinfo
    WHERE  keyflag  =  'X'.

    CLEAR: l_sort_str.
    l_sort_str-name  =  l_str_tabinfo-fieldname.
    APPEND  l_sort_str  TO  l_sort_tab.

  ENDLOOP.

  SORT  c_itab_table  BY  (l_sort_tab).

ENDFORM.                    " sort_itab
*&---------------------------------------------------------------------*
*&      Form  FM_OUT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fm_out_data .
*-項目屬性セット(チェックボックス項目、入力項目の決定)
  PERFORM fm_catlg_set.

*-レイアウトセット
  PERFORM edit_layout.

*-ヘッダセット
  PERFORM fm_alv_header.

*-Event_exit
  PERFORM edit_event_exit.

* ALV一覧畫面の表示
  PERFORM fm_show_grid.
ENDFORM.                    " FM_OUT_DATA

*&---------------------------------------------------------------------*
*&      Form  FM_CATLG_SET
*&---------------------------------------------------------------------*
*       ALVのカタログ項目編集
*----------------------------------------------------------------------*
FORM fm_catlg_set .
  DATA: l_strc_tabinfo TYPE  rpy_fiel.

  LOOP AT itab_tabinfo INTO l_strc_tabinfo.
    CLEAR l_str_fcat.
    l_str_fcat-fieldname = l_strc_tabinfo-fieldname.
    l_str_fcat-inttype   = l_strc_tabinfo-inttype.
    l_str_fcat-seltext_l = l_strc_tabinfo-ddtext.
    l_str_fcat-outputlen = l_strc_tabinfo-length.
    l_str_fcat-key_sel = l_strc_tabinfo-keyflag.
    IF l_strc_tabinfo-keyflag = 'X'.
      l_str_fcat-fix_column = 'X'.
    ELSE.
      l_str_fcat-edit = 'X'.
    ENDIF.
    APPEND l_str_fcat TO l_str_t_fcat.
  ENDLOOP.

ENDFORM.                    " fm_catlg_set
*&---------------------------------------------------------------------*
*&      Form  FM_SHOW_GRID
*&---------------------------------------------------------------------*
*       ALV一覧畫面の表示
*----------------------------------------------------------------------*
FORM fm_show_grid.
* ALV関數を呼び出し、一覧表示を行う。
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'PF_STATUS_SET'
      i_callback_user_command  = 'USER_COMMAND'
      i_callback_top_of_page   = 'TOP_OF_PAGE_ALV'
      is_layout                = l_str_layout
      it_fieldcat              = l_str_t_fcat
      it_event_exit            = itab_events
    TABLES
      t_outtab                 = <fs_itab>
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
* エラーハンドリング
  IF sy-subrc <> 0.
    MESSAGE ID 'ZBUSA_3001' TYPE 'e' NUMBER 006.
  ENDIF.

ENDFORM.                    " fm_show_grid
*&---------------------------------------------------------------------*
*&      Form  top_of_page_alv
*&---------------------------------------------------------------------*
*       ALVヘッダ定義処理
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM top_of_page_alv.

*-ALV_Header作成
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary       = itab_top_of_page
*      I_LOGO                   =
*      I_END_OF_LIST_GRID       =
*      I_ALV_FORM               =
            .

ENDFORM.                    " top_of_page_alv
*&---------------------------------------------------------------------*
*&      Form  FM_ALV_HEADER
*&---------------------------------------------------------------------*
*       ALVヘッダデータの作成
*&---------------------------------------------------------------------*
FORM fm_alv_header .

*-ローカルデータ
  DATA:
    lds_line    TYPE slis_listheader,   "AVLヘッダ
    l_cnt       TYPE i,
    l_total     TYPE i.
  REFRESH itab_top_of_page.

  DESCRIBE TABLE <fs_itab> LINES l_total.

*-ヘッダ
  CLEAR lds_line.
  lds_line-typ  = 'H'.
  lds_line-info = p_table.
  APPEND lds_line TO itab_top_of_page.

**-明細
  CLEAR lds_line.
  lds_line-typ  = 'S'.
  CONCATENATE 'データ件數' ':' ''
         INTO lds_line-key
         SEPARATED BY space.
  lds_line-info = l_total.
  APPEND lds_line TO itab_top_of_page.

ENDFORM.                    " FM_ALV_HEADER
*&---------------------------------------------------------------------*
*&      Form  EDIT_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM edit_layout .

* ALV・レイアウトの設定
  l_str_layout-zebra   = 'X'.
  l_str_layout-colwidth_optimize = 'X'.  "列最適化
*  l_str_layout-box_fieldname = 'CHK'.    "選択項目名
*  l_str_layout-info_fieldname = 'COLOR'. "色屬性項目名
*  l_str_layout-f2code = '&ETA'.          "W_Click

ENDFORM.                    " EDIT_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  pf_status_set
*&---------------------------------------------------------------------*
*       ALVステータスセット処理
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM pf_status_set
     USING prt_extab.

  SET PF-STATUS 'STANDARD_FULLSCREEN'.

ENDFORM.                    " pf_status_set
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       ALVユーザコマンド処理
*----------------------------------------------------------------------*
FORM user_command
     USING    prf_ucomm TYPE sy-ucomm
     CHANGING prs_selfield TYPE slis_selfield.
  DATA i_cnt TYPE i.
  CLEAR i_cnt.
*-UCOMM
  CASE: prf_ucomm.
*  【更新】
    WHEN '&UPD'.
*      LOOP AT <fs_itab> ASSIGNING <ls_itab>.
*        MODIFY (p_table) FROM <ls_itab>.
*        IF sy-subrc = 0.
*          i_cnt = i_cnt + 1.
*        ENDIF.
*      ENDLOOP.
      UPDATE (p_table) FROM TABLE <fs_itab>.
      IF sy-subrc <> 0.
        MESSAGE s398(00) WITH '更新失敗'.
      ENDIF.
      MESSAGE s398(00) WITH sy-dbcnt '件' '更新成功'.

*  【リフレッシュ】
    WHEN '&REF'.
*      PERFORM  where_edit
*                 USING
*                   p_table
*                 CHANGING
*                   v_where
*                   v_canc.
*
*      IF  v_canc  IS NOT INITIAL.
*        RETURN.
*      ENDIF.

      CREATE DATA  itab_table  TYPE STANDARD TABLE OF (p_table).
      ASSIGN  itab_table->*  TO  <fs_itab>.

*     Select data
      PERFORM  select_data
                 USING
                   p_table
                   v_where
                 CHANGING
                   <fs_itab>.

      IF  <fs_itab>  IS INITIAL
      AND sy-batch  <>  'X'.
        MESSAGE  s429(mo).
        RETURN.
      ENDIF.

*     Get table fields information
      PERFORM  get_tableinfo
                 USING
                   p_table
                 CHANGING
                   itab_tabinfo.

      PERFORM  sort_itab
                 USING
                   itab_tabinfo
                 CHANGING
                   <fs_itab>.

*     ALV出力処理
      PERFORM fm_out_data.

 

      FREE: <fs_itab>,
            itab_tabinfo.

*  【その他】
    WHEN OTHERS.
  ENDCASE.

ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  EDIT_EVENT_EXIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM edit_event_exit .

  REFRESH: itab_events.

  l_str_events-ucomm = '&REFRESH'.
  l_str_events-after = 'X'.
*
  APPEND l_str_events TO itab_events.

ENDFORM.                    " EDIT_EVENT_EXIT

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章