用dialog创建一个可修改表

用dialog制作一个表,可删除添加修改行项目,并可支持从本地批量上传数据。
 

DATABEGIN OF gt_tab OCCURS 0,
           flag .
        INCLUDE STRUCTURE ztext1.
DATAEND OF gt_tab.

DATA: t_tab LIKE TABLE OF ztext1 WITH HEADER LINE,
          wa_itab LIKE gt_tab.

DATA: g_edit TYPE c VALUE '0'.

DATA: ok_code LIKE sy-ucomm,
          save_ok LIKE sy-ucomm.

*&SPWIZARD: DECLARATION OF TABLECONTROL 'DDTEST' ITSELF
CONTROLS: ddtest TYPE TABLEVIEW USING SCREEN 0101.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM call_screen.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_tab
                FROM ztext1.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  CALL_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM call_screen .
  CALL SCREEN 0101.
ENDFORM.                    " CALL_SCREEN


*&SPWIZARD: OUTPUT MODULE FOR TC 'DDTEST'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE ddtest_change_tc_attr OUTPUT.
  DESCRIBE TABLE gt_tab LINES ddtest-lines.
ENDMODULE.                    "DDTEST_CHANGE_TC_ATTR OUTPUT

*&SPWIZARD: INPUT MODUL FOR TC 'DDTEST'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MARK TABLE
MODULE ddtest_mark INPUT.
  DATA: g_ddtest_wa2 LIKE LINE OF gt_tab.
  IF ddtest-line_sel_mode = 1
  AND gt_tab-flag = 'X'.
    LOOP AT gt_tab INTO g_ddtest_wa2
      WHERE flag = 'X'.
      g_ddtest_wa2-flag = ''.
      MODIFY gt_tab
        FROM g_ddtest_wa2
        TRANSPORTING flag.
    ENDLOOP.
  ENDIF.
  MODIFY gt_tab
    INDEX ddtest-current_line
    TRANSPORTING flag.
ENDMODULE.                    "DDTEST_MARK INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0101  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0101 OUTPUT.
  SET PF-STATUS 'TEST01'.
  SET TITLEBAR 'TEST01'.

ENDMODULE.                 " STATUS_0101  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  ADD_FIELD  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE add_field INPUT.
  DATA: lv_line TYPE i.
  DESCRIBE TABLE gt_tab LINES lv_line.
  IF lv_line < ddtest-current_line.
    APPEND gt_tab TO gt_tab.
  ELSE.
    MODIFY gt_tab FROM gt_tab INDEX ddtest-current_line.
  ENDIF.
ENDMODULE.                 " ADD_FIELD  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0101  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0101 INPUT.
  save_ok = ok_code.
  CASE save_ok.
    WHEN 'BACK'.  SET SCREEN 0LEAVE TO SCREEN 0.
    WHEN 'EXIT' OR 'CANCEL'.   LEAVE PROGRAM.
    WHEN 'EDIT'.    PERFORM form_edit.
    WHEN 'ADD'.
      IF g_edit = '1'.
        PERFORM form_add USING 'DDTEST'  'GT_TAB'.
      ENDIF.
    WHEN 'DEL'.
      IF g_edit = '1'.
        PERFORM form_del USING 'DDTEST'  'GT_TAB' 'FLAG'.
      ENDIF.
    WHEN 'SAL'PERFORM form_sal.
    WHEN 'CAL'.PERFORM form_cal.
    WHEN 'PC'.  PERFORM form_pc.
    WHEN 'SAVE'.PERFORM form_save.
    WHEN OTHERS.
  ENDCASE.
  clear: save_ok,ok_code.
ENDMODULE.                 " USER_COMMAND_0101  INPUT
*&---------------------------------------------------------------------*
*&      Form  FORM_EDIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_edit .
  IF g_edit = '0'.
    g_edit = '1'.
  ELSE.
    g_edit = '0'.
  ENDIF.
ENDFORM.                    " FORM_EDIT
*&---------------------------------------------------------------------*
*&      Module  CHANGE_EDIT  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE change_edit OUTPUT.
  IF g_edit = '0'.
    LOOP AT SCREEN.
      screen-input = '0'.
      MODIFY SCREEN.
    ENDLOOP.
  ELSE.
    LOOP AT SCREEN.
      screen-input = '1'.
      MODIFY SCREEN.
    ENDLOOP.
  ENDIF.
ENDMODULE.                 " CHANGE_EDIT  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  FORM_ADD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_add USING p_tc_name
                                    p_table_name.
  DATA l_lines_name       LIKE feld-name.
  DATA l_selline          LIKE sy-stepl.
  DATA l_lastline         TYPE i.
  DATA l_line             TYPE i.
  DATA l_table_name       LIKE feld-name.
  FIELD-SYMBOLS <tc>                 TYPE cxtab_control.
  FIELD-SYMBOLS <table>              TYPE STANDARD TABLE.
  FIELD-SYMBOLS <lines>              TYPE i.

* 检查空行存在
*  PERFORM frm_check_blank_row.

  ASSIGN (p_tc_name) TO <tc>.
* Get the table, which belongs to the tc
  CONCATENATE p_table_name '[]' INTO l_table_name. "table body
  ASSIGN (l_table_name) TO <table>.                "not headerline

* Get looplines of TableControl
  CONCATENATE p_tc_name '-LINES' INTO l_lines_name.
  ASSIGN (l_lines_name) TO <lines>.

* Get current line
  GET CURSOR LINE l_selline.
  IF sy-subrc <> 0.                   " append line to table
    l_selline = <tc>-lines + 1.
    <tc>-top_line = 1.
* SPWIZARD: set top line
*    IF l_selline > <lines>.
*      <tc>-top_line = l_selline - <lines> + 1 .
*    ELSE.
*      <tc>-top_line = 1.
*    ENDIF.
  ELSE.                               " insert line into table
    l_selline = <tc>-top_line + l_selline .
    l_lastline = <tc>-top_line + <lines> - 1.
  ENDIF.
* SPWIZARD: set new cursor line                                        *
  l_line = l_selline - <tc>-top_line  + 1.

* SPWIZARD: insert initial line                                        *
  INSERT INITIAL LINE INTO <table> INDEX l_selline.
  <tc>-lines = <tc>-lines + 1.
* 添加到导入数据库的内表

* SPWIZARD: set cursor                                                 *
  SET CURSOR LINE l_line.

ENDFORM.                    " FORM_ADD
*&---------------------------------------------------------------------*
*&      Form  FORM_DEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0193   text
*      -->P_0194   text
*      -->P_0195   text
*----------------------------------------------------------------------*
FORM form_del  USING      p_tc_name
                                       p_table_name
                                       p_mark_name.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
  DATA l_table_name       LIKE feld-name.
  FIELD-SYMBOLS <tc>         TYPE cxtab_control.
  FIELD-SYMBOLS <table>      TYPE STANDARD TABLE.
  FIELD-SYMBOLS <wa>.
  FIELD-SYMBOLS <mark_field>.
* SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (p_tc_name) TO <tc>.

* SPWIZARD: get the table, which belongs to the tc                     *
  CONCATENATE p_table_name '[]' INTO l_table_name. "table body
  ASSIGN (l_table_name) TO <table>.                "not headerline

* SPWIZARD: delete marked lines                                        *
  DESCRIBE TABLE <table> LINES <tc>-lines.

  LOOP AT <table> ASSIGNING <wa>.

* SPWIZARD: access to the component 'FLAG' of the table header         *
    ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.

    IF <mark_field> = 'X'.
      DELETE <table> INDEX syst-tabix.
      IF sy-subrc = 0.
        <tc>-lines = <tc>-lines - 1.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " FORM_DEL
*&---------------------------------------------------------------------*
*&      Form  FORM_SAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_sal .
  LOOP AT gt_tab.
    gt_tab-flag = 'X'.
    MODIFY gt_tab FROM gt_tab INDEX sy-tabix.
  ENDLOOP.
ENDFORM.                    " FORM_SAL
*&---------------------------------------------------------------------*
*&      Form  FORM_CAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_cal .
  LOOP AT gt_tab.
    gt_tab-flag = ''.
    MODIFY gt_tab FROM gt_tab INDEX sy-tabix.
  ENDLOOP.
ENDFORM.                    " FORM_CAL
*&---------------------------------------------------------------------*
*&      Form  FORM_PC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_pc .
  DATA: filename      TYPE string,
        path          TYPE string,
        fullpath      TYPE string,
        rs            TYPE c,
        openpath(128TYPE c.
  FIELD-SYMBOLS: <f1>.
  DATA: l_col TYPE i.
  DATA: up_excle LIKE TABLE OF zalsmex_tabline WITH HEADER LINE.
* 选择打开文件的路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title      = 'Please Check File Path'
      default_extension = '.XLS'
    CHANGING
      filename          = filename
      path              = path
      fullpath          = fullpath
    EXCEPTIONS
      cntl_error        = 1
      error_no_gui      = 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 METHOD cl_gui_frontend_services=>file_exist
    EXPORTING
      file            = fullpath
    RECEIVING
      result          = rs
    EXCEPTIONS
      cntl_error      = 1
      error_no_gui    = 2
      wrong_parameter = 3
      OTHERS          = 4.
  IF sy-subrc <> 0.
    MESSAGE 'The file is not existing.' TYPE 'E'.
  ENDIF.

  IF rs <> 'X'.
    MESSAGE 'The file is not existing.' TYPE 'E'.
  ENDIF.
  openpath = fullpath.
* 取EXCEL 数据
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = openpath
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 6
      i_end_row               = 65000
    TABLES
      intern                  = up_excle
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 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.

  CLEAR: t_tab[], t_tab.
  LOOP AT up_excle.
    CASE up_excle-col.
      WHEN '001'.
        WRITE up_excle-value TO t_tab-text01.
      WHEN '002'.
        WRITE up_excle-value TO t_tab-text02.
    ENDCASE.
    AT END OF row.
      APPEND t_tab.
      CLEAR t_tab.
    ENDAT.
  ENDLOOP.

* 添加到数据库
  SORT t_tab BY text01 text02.
  LOOP AT t_tab.
    CLEAR wa_itab.
    MOVE-CORRESPONDING t_tab TO wa_itab.
    READ TABLE gt_tab WITH KEY text01 = t_tab-text01
                                                text02 = t_tab-text02.
    IF sy-subrc <> 0.
      APPEND wa_itab TO gt_tab.
    ELSE.
      MODIFY TABLE gt_tab FROM wa_itab TRANSPORTING text01 text02.
    ENDIF.
  ENDLOOP.

  PERFORM form_save.

ENDFORM.                    " FORM_PC
*&---------------------------------------------------------------------*
*&      Form  FORM_SAVE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM form_save .
* 检查空行存在
  PERFORM check_line.

  CALL FUNCTION 'ENQUEUE_EZTEXT1'
    EXPORTING
      mode_ztext1    = 'E'
      mandt          = sy-mandt
      _scope         = '2'
      _wait          = ' '
      _collect       = ' '
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 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.



  FREE t_tab.
  LOOP AT gt_tab.
    MOVE-CORRESPONDING gt_tab TO t_tab.
    t_tab-mandt = sy-mandt.
    APPEND t_tab.
    CLEAR t_tab.
  ENDLOOP.

  DELETE FROM ztext1 WHERE text01 NE space.
  IF sy-subrc EQ 0.
    COMMIT WORK .
  ELSE.
    ROLLBACK WORK.
  ENDIF.

  INSERT ztext1 FROM TABLE t_tab.
  IF sy-subrc EQ 0.
    MESSAGE 'changed ok' TYPE 'S'.
    COMMIT WORK.
  ELSE.
    ROLLBACK WORK.
  ENDIF.

  FREE t_tab.

* UNLOCK
  CALL FUNCTION 'DEQUEUE_EZTEXT1'
    EXPORTING
      mode_ztext1 = 'E'
      mandt       = sy-mandt
      _scope      = '3'
      _synchron   = ' '
      _collect    = ' '.

ENDFORM.                    " FORM_SAVE
*&---------------------------------------------------------------------*
*&      Form  CHECK_LINE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM check_line .
  DATA:lv_message(255).
  LOOP AT gt_tab.
    IF gt_tab-text01 = space OR gt_tab-text02 = space.
      MESSAGE 'Please Fullfill Primary Key Fields.' TYPE 'E'.
      EXIT.
    ENDIF.
    CLEAR gt_tab.
  ENDLOOP.

* 检查有无重复Key 字段
  SORT gt_tab BY text01 text02.
  DELETE ADJACENT DUPLICATES FROM gt_tab.
  CLEAR: gt_tab, t_tab.
  LOOP AT gt_tab.
    IF t_tab-text01 = gt_tab-text01 AND t_tab-text02 = gt_tab-text02.
      CLEAR lv_message.
      CONCATENATE  'TEXT01' t_tab-text01 '有重复记录!' INTO lv_message.
      MESSAGE lv_message TYPE 'E'.
    ENDIF.
    CLEAR t_tab.
    t_tab = gt_tab.
  ENDLOOP.

ENDFORM.                    " CHECK_LINE
*&---------------------------------------------------------------------*
*&      Module  CHECK_TEXT01  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE check_text01 INPUT.
  IF gt_tab-text01 IS INITIAL.
    MESSAGE 'TEXT01 should not be initial' TYPE 'E'.
  ENDIF.
ENDMODULE.                 " CHECK_TEXT01  INPUT
*&---------------------------------------------------------------------*
*&      Module  CHECK_TEXT02  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE check_text02 INPUT.
  DATAi TYPE i VALUE '0'.
  IF gt_tab-text02 IS INITIAL.
    MESSAGE 'TEXT02 should not be initial' TYPE 'E'.
  ENDIF.

  LOOP AT gt_tab TO wa_itab WHERE text01 = gt_tab-text01
                                          AND      text02 = gt_tab-text02.
    i = i + 1.
  ENDLOOP.

  IF  i >= 2.
    MESSAGE ' EXISTING THE DATA' TYPE 'E'.
  ENDIF.
ENDMODULE.                 " CHECK_TEXT02  INPUT

你可能感兴趣的:(command,table,input,dialog,Parameters,extension)