*&---------------------------------------------------------------------*
*& Report ZDYNAMIC_UPDATE_TABLE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zdynamic_update_table MESSAGE-ID zmessage.
TYPE-POOLS:slis.
FIELD-SYMBOLS : <dyn_table> TYPE STANDARD TABLE,
<dyn_wa> TYPE ANY,
<dyn_field> TYPE ANY.
DATA: gc_rc TYPE i,
gt_filename TYPE filetable,
gc_filename LIKE LINE OF gt_filename.
DATA: fieldcatalog TYPE lvc_s_fcat,
fieldcatalog_lvc_tab TYPE lvc_t_fcat,
fieldcatalog_tab TYPE slis_t_fieldcat_alv,
gs_layout TYPE slis_layout_alv.
PARAMETERS: p_path(200) TYPE c,
p_inst TYPE char1 RADIOBUTTON GROUP rd1 DEFAULT 'X',
p_del TYPE char1 RADIOBUTTON GROUP rd1,
p_chg TYPE char1 RADIOBUTTON GROUP rd1,
p_tabnam TYPE dd02l-tabname OBLIGATORY DEFAULT 'SFLIGHT'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
file_filter = cl_gui_frontend_services=>filetype_text
CHANGING
file_table = gt_filename
rc = gc_rc.
IF gc_rc = 1.
READ TABLE gt_filename INTO gc_filename INDEX 1.
p_path = gc_filename.
ENDIF.
AT SELECTION-SCREEN.
PERFORM inittable.
START-OF-SELECTION.
PERFORM openfile.
PERFORM process.
*&---------------------------------------------------------------------*
*& Form OPENFILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM openfile .
DATA: lc_file TYPE string, "rlgrap-filename,
lt_data TYPE TABLE OF alsmex_tabline,
lc_data LIKE LINE OF lt_data,
lc_last LIKE LINE OF lt_data.
lc_file = p_path.
lc_last-row = 1.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lc_file
* FILETYPE = 'ASC'
has_field_separator = cl_abap_char_utilities=>horizontal_tab
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = <dyn_table>
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " OPENFILE
*&---------------------------------------------------------------------*
*& Form PROCESS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM process .
CHECK <dyn_table> IS NOT INITIAL.
SORT <dyn_table>.
DELETE ADJACENT DUPLICATES FROM <dyn_table>.
IF p_del = 'X'.
DELETE (p_tabnam) FROM TABLE <dyn_table>.
IF sy-subrc = 0.
MESSAGE s001 WITH p_tabnam.
ELSE.
MESSAGE s003 WITH p_tabnam DISPLAY LIKE 'E'.
ENDIF.
ELSEIF p_chg = 'X'.
PERFORM display.
ELSEIF p_inst = 'X'.
INSERT (p_tabnam) FROM TABLE <dyn_table>.
IF sy-subrc = 0.
MESSAGE s002 WITH p_tabnam.
ELSE.
MESSAGE s004 WITH p_tabnam DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
ENDFORM. " PROCESS
*&---------------------------------------------------------------------*
*& Form INITTABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM inittable .
* DATA: d_ref TYPE REF TO data,
* lt_alv_cat TYPE TABLE OF lvc_s_fcat,
* ls_alv_cat LIKE LINE OF lt_alv_cat.
*
*
* DATA: lt_table LIKE TABLE OF dntab.
* DATA: ls_table TYPE dntab.
*
**取出表结构的字段目录
* CALL FUNCTION 'NAMETAB_GET'
* EXPORTING
* langu = sy-langu
* tabname = p_tabname
* TABLES
* nametab = lt_table
* EXCEPTIONS
* no_texts_found = 1.
*
**根据取出的字段目录生成参考字段目录
* LOOP AT lt_table INTO ls_table.
* ls_alv_cat-fieldname = ls_table-fieldname.
* ls_alv_cat-ref_table = p_tabnam.
* ls_alv_cat-ref_field = ls_table-fieldname.
* APPEND ls_alv_cat TO lt_alv_cat.
* CLEAR ls_alv_cat.
* ENDLOOP.
*
**内表创建
* CALL METHOD cl_alv_table_create=>create_dynamic_table
* EXPORTING
* it_fieldcatalog = lt_alv_cat
* IMPORTING
* ep_table = d_ref.
*
**指定生成的内表到字段符号
* ASSIGN d_ref->* TO <dyn_table>.
DATA: tname TYPE string,
dy_table TYPE REF TO data,
dy_line TYPE REF TO data,
tabname TYPE dd02l-tabname.
DATA : idetails TYPE abap_compdescr_tab,
xdetails TYPE abap_compdescr.
DATA : ref_table_des TYPE REF TO cl_abap_structdescr.
SELECT SINGLE tabname FROM dd02l INTO tabname WHERE tabname = p_tabnam.
IF sy-subrc = 0.
** Get the structure of the table.
* ref_table_des ?=
* cl_abap_typedescr=>describe_by_name( p_tabnam ).
* idetails[] = ref_table_des->components[].
* LOOP AT idetails INTO xdetails.
* CLEAR fieldcatalog.
* fieldcatalog-fieldname = xdetails-name.
* fieldcatalog-scrtext_l = xdetails-name.
* fieldcatalog-datatype = xdetails-type_kind.
* fieldcatalog-inttype = xdetails-type_kind.
* IF fieldcatalog-inttype = 'C'.
* fieldcatalog-intlen = xdetails-length / 2.
* ELSE.
* fieldcatalog-intlen = xdetails-length.
* ENDIF.
* fieldcatalog-decimals = xdetails-decimals.
* APPEND fieldcatalog TO fieldcatalog_lvc_tab.
* ENDLOOP.
*
** Create dynamic internal table and assign to FS
* CALL METHOD cl_alv_table_create=>create_dynamic_table
* EXPORTING
* it_fieldcatalog = fieldcatalog_lvc_tab
* IMPORTING
* ep_table = dy_table.
*
** Convert LVC fcat to slis for display
* CALL FUNCTION 'LVC_TRANSFER_TO_SLIS'
* EXPORTING
* it_fieldcat_lvc = fieldcatalog_lvc_tab
** IT_SORT_LVC =
** IT_FILTER_LVC =
** IS_LAYOUT_LVC =
* IMPORTING
* et_fieldcat_alv = fieldcatalog_tab
** ET_SORT_ALV =
** ET_FILTER_ALV =
** ES_LAYOUT_ALV =
** TABLES
** IT_DATA =
** EXCEPTIONS
** IT_DATA_MISSING = 1
** IT_FIELDCAT_LVC_MISSING = 2
** OTHERS = 3
* .
tname = p_tabnam.
*
CREATE DATA dy_table TYPE STANDARD TABLE OF (tname).
ASSIGN dy_table->* TO <dyn_table>.
* Create dynamic work area and assign to FS
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
ELSE.
MESSAGE e000 WITH p_tabnam.
ENDIF.
ENDFORM. " INITTABLE
*&---------------------------------------------------------------------*
*& Form DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM display .
gs_layout-edit = 'X'.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
* i_internal_tabname = <dyn_table>
i_structure_name = p_tabnam
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_INCLNAME =
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = fieldcatalog_tab
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = sy-repid
* I_CALLBACK_PF_STATUS_SET = ' '
i_callback_user_command = 'USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = gs_layout
it_fieldcat = fieldcatalog_tab[]
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = <dyn_table>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " DISPLAY
*&-------------------------------------------------------------------
*& Form USER_COMMAND
*&-------------------------------------------------------------------
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield. "响应ALV点击自定义按钮之后的事件
CASE r_ucomm.
WHEN '&DATA_SAVE'.
MODIFY (p_tabnam) FROM TABLE <dyn_table>.
IF sy-subrc = 0.
MESSAGE s005 WITH p_tabnam.
ELSE.
MESSAGE s006 WITH p_tabnam DISPLAY LIKE 'E'.
ENDIF.
* WHEN '&IC1'."表示双击
ENDCASE.
*rs_selfield-fieldname "表示双击的字段名
ENDFORM. "ALV_USER_COMMAND
动态更新数据库表
最新推荐文章于 2024-07-18 20:15:00 发布