自建屏幕字段双击功能1

---恢复内容开始---

业务背景:

       有时候我们可能对自建屏幕上的字段要进行双击操作,要触发自建屏幕的双击需要设置一些东西,本文将介绍一种触发自建屏幕字段双击的例子。

解决步骤

  1. 新建一个程序,然后再新建一个屏幕,注意勾选回应双击 
     
  2. 处理屏幕的PBO和PAI,设置STATUS和USER_COMMOND.
  3.  1 PROCESS BEFORE OUTPUT.
     2 *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'ZTAB_CTRL'
     3   MODULE ZTAB_CTRL_INIT.
     4 *&SPWIZARD: MODULE ZTAB_CTRL_CHANGE_TC_ATTR.
     5 *&SPWIZARD: MODULE ZTAB_CTRL_CHANGE_COL_ATTR.
     6   LOOP AT   G_ZTAB_CTRL_ITAB
     7        INTO G_ZTAB_CTRL_WA
     8        WITH CONTROL ZTAB_CTRL
     9        CURSOR ZTAB_CTRL-CURRENT_LINE.
    10 *&SPWIZARD:   MODULE ZTAB_CTRL_CHANGE_FIELD_ATTR
    11     MODULE ZTAB_CTRL_MOVE.
    12     MODULE ZTAB_CTRL_GET_LINES.
    13   ENDLOOP.
    14 
    15  MODULE STATUS_0100.
    16 
    17 PROCESS AFTER INPUT.
    18 *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'ZTAB_CTRL'
    19   LOOP AT G_ZTAB_CTRL_ITAB.
    20     CHAIN.
    21       FIELD ZTIF_LOG-ZIFID.
    22       FIELD ZTIF_LOG-ZIFNO.
    23       FIELD ZTIF_LOG-TYPE.
    24       FIELD ZTIF_LOG-CRDAT.
    25       FIELD ZTIF_LOG-CRTIM.
    26       FIELD ZTIF_LOG-ZBZNO.
    27       MODULE ZTAB_CTRL_MODIFY ON CHAIN-REQUEST.
    28     ENDCHAIN.
    29   ENDLOOP.
    30   MODULE ZTAB_CTRL_USER_COMMAND.
    31 *&SPWIZARD: MODULE ZTAB_CTRL_CHANGE_TC_ATTR.
    32 *&SPWIZARD: MODULE ZTAB_CTRL_CHANGE_COL_ATTR.
    33 
    34  MODULE USER_COMMAND_0100.

    其中模块STATUS_0100和USER_COMMAND_0100是需要我们完成的,其他字段皆是TAB_CTRL向导模式生成的。

  4. 设置STATUS,注意设置F2(鼠标双击,这是一个SAP预设的功能)的功能码(其实我们注意观察的话,可以看到标准的SAP STATUS都是设置了F2的功能码的)
  5. 编写逻辑代码
      1 *&---------------------------------------------------------------------*
      2 *& Report ZTEST016
      3 *&---------------------------------------------------------------------*
      4 *&
      5 *&---------------------------------------------------------------------*
      6 REPORT ztest016.
      7 
      8 ***&SPWIZARD: DATA DECLARATION FOR TABLECONTROL 'ZTAB_CTRL'
      9 *&SPWIZARD: DEFINITION OF DDIC-TABLE
     10 TABLES:   ztif_log.
     11 
     12 *&SPWIZARD: TYPE FOR THE DATA OF TABLECONTROL 'ZTAB_CTRL'
     13 TYPES: BEGIN OF t_ztab_ctrl,
     14          zifid LIKE ztif_log-zifid,
     15          zifno LIKE ztif_log-zifno,
     16          type  LIKE ztif_log-type,
     17          crdat LIKE ztif_log-crdat,
     18          crtim LIKE ztif_log-crtim,
     19          zbzno LIKE ztif_log-zbzno,
     20        END OF t_ztab_ctrl.
     21 
     22 *&SPWIZARD: INTERNAL TABLE FOR TABLECONTROL 'ZTAB_CTRL'
     23 DATA: g_ztab_ctrl_itab TYPE t_ztab_ctrl OCCURS 0,
     24       g_ztab_ctrl_wa   TYPE t_ztab_ctrl. "work area
     25 DATA:     g_ztab_ctrl_copied.           "copy flag
     26 
     27 *&SPWIZARD: DECLARATION OF TABLECONTROL 'ZTAB_CTRL' ITSELF
     28 CONTROLS: ztab_ctrl TYPE TABLEVIEW USING SCREEN 0100.
     29 
     30 *&SPWIZARD: LINES OF TABLECONTROL 'ZTAB_CTRL'
     31 DATA:     g_ztab_ctrl_lines  LIKE sy-loopc.
     32 
     33 DATA:     ok_code LIKE sy-ucomm.
     34 
     35 *&---调用屏幕
     36 CALL SCREEN 100.
     37 *&---------------------------------------------------------------------*
     38 *& Module STATUS_0100 OUTPUT
     39 *&---------------------------------------------------------------------*
     40 *&
     41 *&---------------------------------------------------------------------*
     42 MODULE status_0100 OUTPUT.
     43   SET PF-STATUS 'STATUS'.
     44 * SET TITLEBAR 'xxx'.
     45 ENDMODULE.
     46 
     47 *&---------------------------------------------------------------------*
     48 *&      Module  USER_COMMAND_0100  INPUT
     49 *&---------------------------------------------------------------------*
     50 *       text
     51 *----------------------------------------------------------------------*
     52 MODULE user_command_0100 INPUT.
     53   DATA: lv_okcode  TYPE sy-ucomm,
     54         lv_sfield  TYPE screen-name,     "屏幕字段
     55         lv_vfield1 TYPE char30,          "值字段
     56         lv_vfield2 TYPE char30,
     57         lv_line    TYPE i,
     58         lv_msg     TYPE string.
     59 
     60   FIELD-SYMBOLS: <fs> TYPE any.
     61 
     62   lv_okcode = sy-ucomm.
     63 
     64   CASE lv_okcode.
     65     WHEN '&IC1'.
     66       GET CURSOR FIELD lv_sfield LINE lv_line.
     67       SPLIT lv_sfield AT '-' INTO lv_vfield1 lv_vfield2.
     68 
     69       READ TABLE g_ztab_ctrl_itab INTO g_ztab_ctrl_wa INDEX lv_line.
     70       IF sy-subrc = 0.
     71         ASSIGN COMPONENT lv_vfield2 OF STRUCTURE g_ztab_ctrl_wa TO <fs>.
     72         IF <fs> IS ASSIGNED.
     73           lv_msg = '我被双击了! Give Me Five!我的值是:' && <fs>.
     74           MESSAGE lv_msg TYPE 'I'.
     75         ENDIF.
     76       ENDIF.
     77     WHEN '&F03'.
     78       LEAVE TO SCREEN 0.
     79     WHEN '&F04' OR '&F05'.
     80       LEAVE PROGRAM.
     81     WHEN OTHERS.
     82   ENDCASE.
     83 ENDMODULE.
     84 
     85 *&SPWIZARD: OUTPUT MODULE FOR TC 'ZTAB_CTRL'. DO NOT CHANGE THIS LINE!
     86 *&SPWIZARD: COPY DDIC-TABLE TO ITAB
     87 MODULE ztab_ctrl_init OUTPUT.
     88   IF g_ztab_ctrl_copied IS INITIAL.
     89 *&SPWIZARD: COPY DDIC-TABLE 'ZTIF_LOG'
     90 *&SPWIZARD: INTO INTERNAL TABLE 'g_ZTAB_CTRL_itab'
     91     SELECT * FROM ztif_log
     92        INTO CORRESPONDING FIELDS
     93        OF TABLE g_ztab_ctrl_itab.
     94     g_ztab_ctrl_copied = 'X'.
     95     REFRESH CONTROL 'ZTAB_CTRL' FROM SCREEN '0100'.
     96   ENDIF.
     97 ENDMODULE.
     98 
     99 *&SPWIZARD: OUTPUT MODULE FOR TC 'ZTAB_CTRL'. DO NOT CHANGE THIS LINE!
    100 *&SPWIZARD: MOVE ITAB TO DYNPRO
    101 MODULE ztab_ctrl_move OUTPUT.
    102   MOVE-CORRESPONDING g_ztab_ctrl_wa TO ztif_log.
    103 ENDMODULE.
    104 
    105 *&SPWIZARD: OUTPUT MODULE FOR TC 'ZTAB_CTRL'. DO NOT CHANGE THIS LINE!
    106 *&SPWIZARD: GET LINES OF TABLECONTROL
    107 MODULE ztab_ctrl_get_lines OUTPUT.
    108   g_ztab_ctrl_lines = sy-loopc.
    109 ENDMODULE.
    110 
    111 *&SPWIZARD: INPUT MODULE FOR TC 'ZTAB_CTRL'. DO NOT CHANGE THIS LINE!
    112 *&SPWIZARD: MODIFY TABLE
    113 MODULE ztab_ctrl_modify INPUT.
    114   MOVE-CORRESPONDING ztif_log TO g_ztab_ctrl_wa.
    115   MODIFY g_ztab_ctrl_itab
    116     FROM g_ztab_ctrl_wa
    117     INDEX ztab_ctrl-current_line.
    118 ENDMODULE.
    119 
    120 *&SPWIZARD: INPUT MODULE FOR TC 'ZTAB_CTRL'. DO NOT CHANGE THIS LINE!
    121 *&SPWIZARD: PROCESS USER COMMAND
    122 MODULE ztab_ctrl_user_command INPUT.
    123   ok_code = sy-ucomm.
    124   PERFORM user_ok_tc USING    'ZTAB_CTRL'
    125                               'G_ZTAB_CTRL_ITAB'
    126                               'FLAG'
    127                      CHANGING ok_code.
    128   sy-ucomm = ok_code.
    129 ENDMODULE.
    130 
    131 *----------------------------------------------------------------------*
    132 *   INCLUDE TABLECONTROL_FORMS                                         *
    133 *----------------------------------------------------------------------*
    134 
    135 *&---------------------------------------------------------------------*
    136 *&      Form  USER_OK_TC                                               *
    137 *&---------------------------------------------------------------------*
    138 FORM user_ok_tc USING    p_tc_name TYPE dynfnam
    139                          p_table_name
    140                          p_mark_name
    141                 CHANGING p_ok      LIKE sy-ucomm.
    142 
    143 *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
    144   DATA: l_ok     TYPE sy-ucomm,
    145         l_offset TYPE i.
    146 *&SPWIZARD: END OF LOCAL DATA------------------------------------------*
    147 
    148 *&SPWIZARD: Table control specific operations                          *
    149 *&SPWIZARD: evaluate TC name and operations                            *
    150   SEARCH p_ok FOR p_tc_name.
    151   IF sy-subrc <> 0.
    152     EXIT.
    153   ENDIF.
    154   l_offset = strlen( p_tc_name ) + 1.
    155   l_ok = p_ok+l_offset.
    156 *&SPWIZARD: execute general and TC specific operations                 *
    157   CASE l_ok.
    158     WHEN 'INSR'.                      "insert row
    159       PERFORM fcode_insert_row USING    p_tc_name
    160                                         p_table_name.
    161       CLEAR p_ok.
    162 
    163     WHEN 'DELE'.                      "delete row
    164       PERFORM fcode_delete_row USING    p_tc_name
    165                                         p_table_name
    166                                         p_mark_name.
    167       CLEAR p_ok.
    168 
    169     WHEN 'P--' OR                     "top of list
    170          'P-'  OR                     "previous page
    171          'P+'  OR                     "next page
    172          'P++'.                       "bottom of list
    173       PERFORM compute_scrolling_in_tc USING p_tc_name
    174                                             l_ok.
    175       CLEAR p_ok.
    176 *     WHEN 'L--'.                       "total left
    177 *       PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
    178 *
    179 *     WHEN 'L-'.                        "column left
    180 *       PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
    181 *
    182 *     WHEN 'R+'.                        "column right
    183 *       PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
    184 *
    185 *     WHEN 'R++'.                       "total right
    186 *       PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
    187 *
    188     WHEN 'MARK'.                      "mark all filled lines
    189       PERFORM fcode_tc_mark_lines USING p_tc_name
    190                                         p_table_name
    191                                         p_mark_name   .
    192       CLEAR p_ok.
    193 
    194     WHEN 'DMRK'.                      "demark all filled lines
    195       PERFORM fcode_tc_demark_lines USING p_tc_name
    196                                           p_table_name
    197                                           p_mark_name .
    198       CLEAR p_ok.
    199 
    200 *     WHEN 'SASCEND'   OR
    201 *          'SDESCEND'.                  "sort column
    202 *       PERFORM FCODE_SORT_TC USING P_TC_NAME
    203 *                                   l_ok.
    204 
    205   ENDCASE.
    206 
    207 ENDFORM.                              " USER_OK_TC
    208 
    209 *&---------------------------------------------------------------------*
    210 *&      Form  FCODE_INSERT_ROW                                         *
    211 *&---------------------------------------------------------------------*
    212 FORM fcode_insert_row
    213               USING    p_tc_name           TYPE dynfnam
    214                        p_table_name             .
    215 
    216 *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
    217   DATA l_lines_name       LIKE feld-name.
    218   DATA l_selline          LIKE sy-stepl.
    219   DATA l_lastline         TYPE i.
    220   DATA l_line             TYPE i.
    221   DATA l_table_name       LIKE feld-name.
    222   FIELD-SYMBOLS <tc>                 TYPE cxtab_control.
    223   FIELD-SYMBOLS <table>              TYPE STANDARD TABLE.
    224   FIELD-SYMBOLS <lines>              TYPE i.
    225 *&SPWIZARD: END OF LOCAL DATA------------------------------------------*
    226 
    227   ASSIGN (p_tc_name) TO <tc>.
    228 
    229 *&SPWIZARD: get the table, which belongs to the tc                     *
    230   CONCATENATE p_table_name '[]' INTO l_table_name. "table body
    231   ASSIGN (l_table_name) TO <table>.                "not headerline
    232 
    233 *&SPWIZARD: get looplines of TableControl                              *
    234   CONCATENATE 'G_' p_tc_name '_LINES' INTO l_lines_name.
    235   ASSIGN (l_lines_name) TO <lines>.
    236 
    237 *&SPWIZARD: get current line                                           *
    238   GET CURSOR LINE l_selline.
    239   IF sy-subrc <> 0.                   " append line to table
    240     l_selline = <tc>-lines + 1.
    241 *&SPWIZARD: set top line                                               *
    242     IF l_selline > <lines>.
    243       <tc>-top_line = l_selline - <lines> + 1 .
    244     ELSE.
    245       <tc>-top_line = 1.
    246     ENDIF.
    247   ELSE.                               " insert line into table
    248     l_selline = <tc>-top_line + l_selline - 1.
    249     l_lastline = <tc>-top_line + <lines> - 1.
    250   ENDIF.
    251 *&SPWIZARD: set new cursor line                                        *
    252   l_line = l_selline - <tc>-top_line + 1.
    253 
    254 *&SPWIZARD: insert initial line                                        *
    255   INSERT INITIAL LINE INTO <table> INDEX l_selline.
    256   <tc>-lines = <tc>-lines + 1.
    257 *&SPWIZARD: set cursor                                                 *
    258   SET CURSOR LINE l_line.
    259 
    260 ENDFORM.                              " FCODE_INSERT_ROW
    261 
    262 *&---------------------------------------------------------------------*
    263 *&      Form  FCODE_DELETE_ROW                                         *
    264 *&---------------------------------------------------------------------*
    265 FORM fcode_delete_row
    266               USING    p_tc_name           TYPE dynfnam
    267                        p_table_name
    268                        p_mark_name   .
    269 
    270 *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
    271   DATA l_table_name       LIKE feld-name.
    272 
    273   FIELD-SYMBOLS <tc>         TYPE cxtab_control.
    274   FIELD-SYMBOLS <table>      TYPE STANDARD TABLE.
    275   FIELD-SYMBOLS <wa>.
    276   FIELD-SYMBOLS <mark_field>.
    277 *&SPWIZARD: END OF LOCAL DATA------------------------------------------*
    278 
    279   ASSIGN (p_tc_name) TO <tc>.
    280 
    281 *&SPWIZARD: get the table, which belongs to the tc                     *
    282   CONCATENATE p_table_name '[]' INTO l_table_name. "table body
    283   ASSIGN (l_table_name) TO <table>.                "not headerline
    284 
    285 *&SPWIZARD: delete marked lines                                        *
    286   DESCRIBE TABLE <table> LINES <tc>-lines.
    287 
    288   LOOP AT <table> ASSIGNING <wa>.
    289 
    290 *&SPWIZARD: access to the component 'FLAG' of the table header         *
    291     ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
    292 
    293     IF <mark_field> = 'X'.
    294       DELETE <table> INDEX syst-tabix.
    295       IF sy-subrc = 0.
    296         <tc>-lines = <tc>-lines - 1.
    297       ENDIF.
    298     ENDIF.
    299   ENDLOOP.
    300 
    301 ENDFORM.                              " FCODE_DELETE_ROW
    302 
    303 *&---------------------------------------------------------------------*
    304 *&      Form  COMPUTE_SCROLLING_IN_TC
    305 *&---------------------------------------------------------------------*
    306 *       text
    307 *----------------------------------------------------------------------*
    308 *      -->P_TC_NAME  name of tablecontrol
    309 *      -->P_OK       ok code
    310 *----------------------------------------------------------------------*
    311 FORM compute_scrolling_in_tc USING    p_tc_name
    312                                       p_ok.
    313 *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
    314   DATA l_tc_new_top_line     TYPE i.
    315   DATA l_tc_name             LIKE feld-name.
    316   DATA l_tc_lines_name       LIKE feld-name.
    317   DATA l_tc_field_name       LIKE feld-name.
    318 
    319   FIELD-SYMBOLS <tc>         TYPE cxtab_control.
    320   FIELD-SYMBOLS <lines>      TYPE i.
    321 *&SPWIZARD: END OF LOCAL DATA------------------------------------------*
    322 
    323   ASSIGN (p_tc_name) TO <tc>.
    324 *&SPWIZARD: get looplines of TableControl                              *
    325   CONCATENATE 'G_' p_tc_name '_LINES' INTO l_tc_lines_name.
    326   ASSIGN (l_tc_lines_name) TO <lines>.
    327 
    328 
    329 *&SPWIZARD: is no line filled?                                         *
    330   IF <tc>-lines = 0.
    331 *&SPWIZARD: yes, ...                                                   *
    332     l_tc_new_top_line = 1.
    333   ELSE.
    334 *&SPWIZARD: no, ...                                                    *
    335     CALL FUNCTION 'SCROLLING_IN_TABLE'
    336       EXPORTING
    337         entry_act      = <tc>-top_line
    338         entry_from     = 1
    339         entry_to       = <tc>-lines
    340         last_page_full = 'X'
    341         loops          = <lines>
    342         ok_code        = p_ok
    343         overlapping    = 'X'
    344       IMPORTING
    345         entry_new      = l_tc_new_top_line
    346       EXCEPTIONS
    347 *       NO_ENTRY_OR_PAGE_ACT  = 01
    348 *       NO_ENTRY_TO    = 02
    349 *       NO_OK_CODE_OR_PAGE_GO = 03
    350         OTHERS         = 0.
    351   ENDIF.
    352 
    353 *&SPWIZARD: get actual tc and column                                   *
    354   GET CURSOR FIELD l_tc_field_name
    355              AREA  l_tc_name.
    356 
    357   IF syst-subrc = 0.
    358     IF l_tc_name = p_tc_name.
    359 *&SPWIZARD: et actual column                                           *
    360       SET CURSOR FIELD l_tc_field_name LINE 1.
    361     ENDIF.
    362   ENDIF.
    363 
    364 *&SPWIZARD: set the new top line                                       *
    365   <tc>-top_line = l_tc_new_top_line.
    366 
    367 
    368 ENDFORM.                              " COMPUTE_SCROLLING_IN_TC
    369 
    370 *&---------------------------------------------------------------------*
    371 *&      Form  FCODE_TC_MARK_LINES
    372 *&---------------------------------------------------------------------*
    373 *       marks all TableControl lines
    374 *----------------------------------------------------------------------*
    375 *      -->P_TC_NAME  name of tablecontrol
    376 *----------------------------------------------------------------------*
    377 FORM fcode_tc_mark_lines USING p_tc_name
    378                                p_table_name
    379                                p_mark_name.
    380 *&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------*
    381   DATA l_table_name       LIKE feld-name.
    382 
    383   FIELD-SYMBOLS <tc>         TYPE cxtab_control.
    384   FIELD-SYMBOLS <table>      TYPE STANDARD TABLE.
    385   FIELD-SYMBOLS <wa>.
    386   FIELD-SYMBOLS <mark_field>.
    387 *&SPWIZARD: END OF LOCAL DATA------------------------------------------*
    388 
    389   ASSIGN (p_tc_name) TO <tc>.
    390 
    391 *&SPWIZARD: get the table, which belongs to the tc                     *
    392   CONCATENATE p_table_name '[]' INTO l_table_name. "table body
    393   ASSIGN (l_table_name) TO <table>.                "not headerline
    394 
    395 *&SPWIZARD: mark all filled lines                                      *
    396   LOOP AT <table> ASSIGNING <wa>.
    397 
    398 *&SPWIZARD: access to the component 'FLAG' of the table header         *
    399     ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
    400 
    401     <mark_field> = 'X'.
    402   ENDLOOP.
    403 ENDFORM.                                          "fcode_tc_mark_lines
    404 
    405 *&---------------------------------------------------------------------*
    406 *&      Form  FCODE_TC_DEMARK_LINES
    407 *&---------------------------------------------------------------------*
    408 *       demarks all TableControl lines
    409 *----------------------------------------------------------------------*
    410 *      -->P_TC_NAME  name of tablecontrol
    411 *----------------------------------------------------------------------*
    412 FORM fcode_tc_demark_lines USING p_tc_name
    413                                  p_table_name
    414                                  p_mark_name .
    415 *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
    416   DATA l_table_name       LIKE feld-name.
    417 
    418   FIELD-SYMBOLS <tc>         TYPE cxtab_control.
    419   FIELD-SYMBOLS <table>      TYPE STANDARD TABLE.
    420   FIELD-SYMBOLS <wa>.
    421   FIELD-SYMBOLS <mark_field>.
    422 *&SPWIZARD: END OF LOCAL DATA------------------------------------------*
    423 
    424   ASSIGN (p_tc_name) TO <tc>.
    425 
    426 *&SPWIZARD: get the table, which belongs to the tc                     *
    427   CONCATENATE p_table_name '[]' INTO l_table_name. "table body
    428   ASSIGN (l_table_name) TO <table>.                "not headerline
    429 
    430 *&SPWIZARD: demark all filled lines                                    *
    431   LOOP AT <table> ASSIGNING <wa>.
    432 
    433 *&SPWIZARD: access to the component 'FLAG' of the table header         *
    434     ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
    435 
    436     <mark_field> = space.
    437   ENDLOOP.
    438 ENDFORM.                                          "fcode_tc_mark_lines
  6. 效果展示

---恢复内容结束---

原文地址:https://www.cnblogs.com/datie/p/11427798.html