动态更新数据库表

12 篇文章 1 订阅
*&---------------------------------------------------------------------*
*& 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值