*&---------------------------------------------------------------------*
*& 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