史上接近最完整的选择屏幕开发知识(针对初学者)(还有下拉菜单的实现)

选择屏幕的开发知识无非就是围绕这3个点:PARAMETERS        SELECT-OPTIONS               SELECTION-SCREEN

(一)PARAMETERS:为变量定义输入字段

         1、PARAMETERS的全部用法:
                                             P_BUDAT     LIKE      BKPF-BUDAT      OBLIGATORY,
                                             P_CX     AS    CHECKBOX    DEFAULT     'X',

                                             P_BUDAT     LIKE      BKPF-BUDAT      NO DISPLAY,
                                             P_CX     AS    CHECKBOX,

                                             R1     RADIOBUTTON GROUP  RAD1

                                             R2     RADIOBUTTON GROUP  RAD1     DEFAULT 'X'

                                             R3     RADIOBUTTON GROUP  RAD2

                                             R4     RADIOBUTTON GROUP  RAD2

                                             P1     MODIF ID SC1

                                             P2     MODIF ID SC1

                                             P3     MODIF ID SC2

                                             P4     MODIF ID SC2

                  每种用法的解释:

                   OBLIGATORY  设定该项伟必输项

                   CHECKBOX     设为打钩的(复选框),如果没有设定default的值,那么当这个被勾上的时候才为X,有default的话,即默认为勾上的。

                   NO DISPLAY    设定该项为不显示状态。

                   RADIOBUTTON   设定单选,有default的,默认这个是选上的,同一个RAD1和RAD2,每个RAD只能选一个值,选中则变量变为X,如果没有设定default,每个组的第一个参数将被激活并分配‘X’。

                   MODIF ID         将参数分配给修改组,通过在SELECTION-SCREEN   OUTPUT事件中进行处理:

                   AT SELECTION-SCREEN OUTPUT.            结合上面的定义,P1和P2放在一组,P3和P4放在一组,然后P1和P2的INTENSIFIED字段被设为1,效果是高亮度,

                   LOOP AT SCREEN.                                         这个可以这样使用。

                    IF  SCREEN-GROUP1 = 'SC1'

                    SCREEN-INTENSIFIED = '1'.

                    MODIFY SCREEN.

                    ENDIF.

                  ENDLOOP.

                   还有一些不常用的例如: LOWER CASE,有这个lower case,系统就不会把输入值更改为大写。(还没有使用过)

                                                                MEMORY-ID        允许你从全局SAP内存使用缺省值。

                                                                MATCHCODE OBJECT      匹配代码对象,obj的名称必须是4字符的变量名



  (二)SELECT-OPTIONS:选择表

              1、SELECT-OPTIONS的全部用法:

                                                     S_EBLEN            FOR              VBRK-EBLEN   DEFAULT

                                                     S_EBLEN            FOR              VBRK-EBLEN   DEFAULT  A    TO    B

                                                     S_EBLEN            FOR              VBRK-EBLEN   OBLIGATORY

                                                     S_EBLEN            FOR              VBRK-EBLEN    NO DISPLAY

                                                     S_EBLEN            FOR              VBRK-EBLEN   NO-EXTENSION

                                                     S_EBLEN            FOR              VBRK-EBLEN   NO-INTERVALS

                       DEFAULT    OBLIGATORY  NO-DISPLAY的功能和之前的PARAMETERS的一样。

                       DEFAULT   A   TO  B    设置里面的LOW 和HIGH字段,例如我要设置默认公司代码从0001到0020。

                       选择表的里面的字段有:SIGN       OPTION     LOW      HIGH

                                                                   SIGN        可以是I  和   E     I是包括,   E是排除的意思

                                                                   OPTION   可以是:EQ  NE  GT  LE  LT  CP  NP     这个可以查看我的帖子(select-option作为select的条件使用)

                      NO-EXTENSION,把选择表限制在一行

                      NO INTERVALS ,把选择表限制伟单值选择


    (三)SELECTION-SCREEN:     格式化选择屏幕

                 1、SELECTION-SCREEN 的全部使用方法:

                                       SELECTION-SCREEN  SKIP   <N>               该语句产生N个空行,如果只产生一个,可以省略<N>。

                                       SELECTION-SCREEN  ULINE  <POS(LEN)>        该语句创建下划线,入过没有POS(LEN),则在当前下面创建新行。如果有POS(LEN),则从POS处开始,连续<LEN>个字符。

                                       SELECTION-SCREEN COMMENT                用该选项是必须定义格式(例如选择屏幕上的文字说明可以用这个语句

                                       SELECTION-SCREEN BEGIN OF LINE       把选择屏幕的几个元素放在一行上。

                                       SELECTION-SCREEN END OF LINE

                                       SELECTION-SCREEN  POSITION  <POS>         定位元素

                                       SELECTION-SCREEN BEGIN OF BLOCK   <block>    创建元素块,里面放选择屏幕语句,block的名字可以在initialization里面维护。

                                       SELECTION-SCREEN END OF BLOCK    <blokc>

                                       SELECTION-SCREEN FUNCTION KEY <I>                   在选择屏幕的应用工具栏创建按钮,I为1-5,最多只有5个按钮。具体要怎么实现,可以参考另一篇文章(给选择屏幕添加按钮)

                                      SELECTION-SCREEN PUSHBUTTON <pos(len)>  <name>    USER-COMAND   <ucom>   [MODIF ID <keyt>]                         在选择屏幕上创建按钮,其中<name >是按钮的文本, <ucom>为输入词典字段SSCRFIELDS-UCOMM,必须使用TABLES语句声明表SSCRFIELDS。(后续有用到把具体例子贴上来)

                                      


         (四) INITIALIZATION :         用于屏幕初始化,例如屏幕的block的名字,屏幕默认字段的一些初始值的填充,工具栏按钮的一些字段的值的填充等等。


         (五) AT   SELECTION-SCREEN   OUTPUT                                     这个就相当于PBO的功能,可以对选择屏幕字段进行修改(前面也有说到一些功能要放到这里使用的),在选择运行程序的时候,选择屏幕出来之前就先运行这段,还有就是选择屏幕输入条件之后按下回车或者是执行后,也会进入这个event

             例如可以判断用户名,然后选择性的输入一些选择屏幕字段:

                      at selection-screen output.
                             if sy-uname ne 'LIUJC_CN'.
                             loop at screen.
                                 if screen-name+0(7eq 'S_AUFNR' or
                                       screen-name+2(7eq 'S_AUFNR'.
                                       screen-invisible '1'.
                                       screen-active '0'.
                            modify screen.
                           endif.
                           endloop.
                           endif.

 

                例如可以判断输入的某个字段是某个值的时候添加屏幕字段(注意要按回车):

                例如,当我输入company code为某个值的时候,我需要添加一个选择字段以及部分check box。首先,这些要添加的选择屏幕内容都是一样要预先设定好,然后通过at selection-screen output 设定好逻辑即可:

                定义:      s_bukrs1 FOR t001-bukrs NO INTERVALS MODIF ID m4.

                逻辑:     LOOP AT SCREEN.                         (这里可以用group,也可以用name。关于SCREEN的值如何去定义,参考本博客的另一篇文章:SCREEN的理解
                                         CASE screen-group1.

                                         WITH 'M4'.

                                                  IF 'SG01' IN s_bukrs.
                                                        MOVE '1' TO screen-active.

                                           


         (六) AT  SELECTION-SCREEN  ON  VALUE-REQUEST   FOR    <NAME>       这个最常见的就是对upload文件的文件名进行检查的使用:

                          AT SELECTION-SCREEN ON VALUE-REQUEST FOR filename.
                                 CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
                                         EXPORTING
                                                      field_name    'C:\'
                                                          mask          ',Excel Files,*.xls,*.XLS,'
                                                 *      STATIC        = 'X'
                                        CHANGING
                                                       file_name     filename
                                        EXCEPTIONS
                                                 mask_too_long 1
                                                      OTHERS        2.


         (七) AT  SELECTION-SCREEN                              这个比较常用的是在工具栏里面添加了按钮,然后对这个按钮进行操作。

                           AT SELECTION-SCREEN.
                                        CASE SSCRFIELDS-UCOMM.
                                                WHEN 'FC01'.
                                                      PERFORM FRM_DOWNLOAD_DATA.
                                         ENDCASE.



           (八)选择屏幕下拉菜单的实现:

                       

                        网上有一段简单的代码可以实现:

SELECTION-SCREEN  BEGIN OF BLOCK 1.
PARAMETERS:     zlist(4)       type DEFAULT 'CN03' AS
                LISTBOX VISIBLE LENGTH 30.
SELECTION-SCREEN  END OF BLOCK 1.


INITIALIZATION.

at selection-screen on value-request for zlist.
  perform selectlist changing zlist.
form selectlist changing zlist.
  data itab_list type vrm_values.
  data wa_list like line of itab_list.
  wa_list-key '01'.
  wa_list-text '入库单'.
  append wa_list to itab_list.
  wa_list-key '02'.
  wa_list-text '移库单'.
  append wa_list to itab_list.
  wa_list-key '03'.
  wa_list-text '出库单'.
  append wa_list to itab_list.
  wa_list-key '04'.
  wa_list-text '销售出库单'.
  append wa_list to itab_list.
  wa_list-key '05'.
  wa_list-text '销售退货单'.
  append wa_list to itab_list.

  call function 'VRM_SET_VALUES'
    exporting
      id     'ZLIST'  "屏幕中的下拉菜单的NAME,下拉菜单选择LISTBOX
      values itab_list.
  refresh itab_list.
endform.


标准程序里面是这样的一段代码:这里不用像上面那样的操作,然后就可以直接实现下拉菜单的功能了。

SELECTION-SCREEN  BEGIN OF BLOCK WITH FRAME TITLE text-165.
PARAMETERS:
                format       LIKE rfpdo1-febformat DEFAULT 'M' AS
                LISTBOX VISIBLE LENGTH 30 USER-COMMAND bai,
SELECTION-SCREEN  END OF BLOCK 1.

 

              (九)实现屏幕的勾选:

       

          代码如下:

           Post invoice的代码如下:

                        PARAMETERSP_CHK1   AS CHECKBOX USER-COMMAND SELECT.
                        SELECTION-SCREENCOMMENT 3(12TEXT-073 MODIF ID B4 .


           confirmed for的代码如下:

                         SELECTION-SCREEN:  COMMENT 1(13TEXT-053 FOR FIELD P_INFO MODIF ID B4.
                         SELECTION-SCREEN:  POSITION 14.
                         PARAMETERS:        P_INFO(2)   TYPE default '0' MODIF ID B4..
                         SELECTION-SCREEN:  COMMENT 19(4TEXT-054 MODIF ID B4.           


 

            (十)实现屏幕可以影藏部分选择屏幕字段:

               


1、定义展开按钮

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 1(4but1 USER-COMMAND button1 VISIBLE
LENGTH 2.
SELECTION-SCREEN COMMENT 6(20com1.
SELECTION-SCREEN END OF LINE.

2、定义展开的selection-screen
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_lvorm FOR marc-lvorm MODIF ID bl1,
               s_mstae FOR mara-mstae MODIF ID bl1,
               s_mmsta FOR marc-mmsta MODIF ID bl1,
               s_beskz FOR marc-beskz MODIF ID bl1,
               s_sobsl FOR marc-sobsl MODIF ID bl1,
               s_mtart FOR mara-mtart MODIF ID bl1.
SELECTION-SCREEN END OF BLOCK b2 .


3、点击那个展开button的时候赋值

AT SELECTION-SCREEN.

CASE sy-ucomm.
    WHEN 'BUTTON1'.
      IF but1 '@K1@'.
        WRITE icon_data_area_collapse AS ICON TO but1.
        com1 ''.
      ELSE.
        WRITE icon_data_area_expand AS ICON TO but1.
        com1 'Material Fields'.
      ENDIF.
  ENDCASE.

4、展开屏幕
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF but1 '@K1@' AND screen-group1 'BL1'.
      screen-active 0.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.



                   (十一)调用选择屏幕

我们另外定义一个选择屏幕500
   SELECTION-SCREEN BEGIN OF SCREEN 500.
  SELECTION-SCREEN BEGIN OF LINE.
  SELECT-OPTIONS:S_BUKRS6 FOR BKPF-BUKRS NO INTERVALS .
  SELECTION-SCREEN END OF LINE.
  SELECTION-SCREEN END OF SCREEN 500.
修改START-OF-SELECTION事件为:
  CALL SELECTION-SCREEN 500.

调用了这个选择屏幕之后,点击按钮,这里不是用user_command或者是在屏幕500里面再去设一个module,直接在call selection-screen 500后面添加执行代码,当输入选择屏幕只会,点击执行就会执行后面的代码



                   (十二)调用子屏幕call subscreen




                   (十三)选择屏幕放多个tab:


本例实现如上图效果,示例代码如下:
REPORT  Z_LPF_SCREEN_TAB.


TABLES: MARA,SSCRFIELDS.


selection-screen function key 1.


SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.


SELECTION-SCREEN BEGIN OF BLOCK A1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
  MAT1 FOR MARA-MATNR NO INTERVALS.
  SELECTION-SCREEN SKIP 1.


  PARAMETERS:
  CHK1 AS CHECKBOX DEFAULT 'X'.
  SELECTION-SCREEN END OF BLOCK A1.


  SELECTION-SCREEN END OF SCREEN 100.


SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
  PARAMETERS: MAT2 LIKE MARA-MATNR.
  SELECTION-SCREEN END OF SCREEN 200.


SELECTION-SCREEN:
BEGIN OF TABBED BLOCK MYTAB FOR 5 LINES,
  TAB (20) BUTTON1 USER-COMMAND PUSH1,
  TAB (20) BUTTON2 USER-COMMAND PUSH2,
  END OF BLOCK MYTAB.


  INITIALIZATION.
  MOVE 'BUTTON' TO SSCRFIELDS-FUNCTXT_01.
  BUTTON1 = 'TAB1'.
  BUTTON2 = 'TAB2'.


  MYTAB-PROG = SY-REPID.
  MYTAB-DYNNR = 100.




AT SELECTION-SCREEN.
  CASE SY-UCOMM.
    WHEN 'PUSH1'.
      MYTAB-DYNNR = 100.
      MYTAB-ACTIVETAB = 'BUTTON1'.
    WHEN 'PUSH2'.
      MYTAB-DYNNR = 200.
      MYTAB-ACTIVETAB = 'BUTTON2'.
    WHEN OTHERS.
  ENDCASE.



          (十四)实现下面这个功能:



在AT SELECTION-SCREEN OUTPUT.加入这段代码:

CASE 'X'.
    WHEN R_RFC.
      SET_SCREEN 'MD1'.                      
    WHEN R_PROG.
      SET_SCREEN 'MD2'.
    WHEN R_JOB.
      SET_SCREEN 'MD3'.
    WHEN R_HTTP.
      SET_SCREEN 'MD4'.
    WHEN OTHERS.
  ENDCASE.

其中MD1是这样定义的:

SELECT-OPTIONS :S_FUNC  FOR ZRFCSRVR-FUNC_NAME NO INTERVALS MODIF ID MD1.


          (十五)跟上面这个类似的实现:


            代码:

屏幕设计:

SELECTION-SCREEN BEGIN OF BLOCK BLK_1 WITH FRAME TITLE TEXT-001.
PARAMETERS:      B_DIS RADIOBUTTON GROUP OPT DEFAULT 'X' user-command uc_udp,
                 B_UDP RADIOBUTTON GROUP OPT .
SELECTION-SCREEN END OF BLOCK BLK_1.

SELECTION-SCREEN BEGIN OF BLOCK BLK_2 WITH FRAME TITLE TEXT-002.
PARAMETERS:
                  P_U01  AS CHECKBOX MODIF ID UDP,
                  P_U02  AS CHECKBOX MODIF ID UDP,
                  P_U03  AS CHECKBOX MODIF ID UDP,
                  P_U04  AS CHECKBOX MODIF ID UDP,

SELECTION-SCREEN END OF BLOCK BLK_2.


具体在AT-SELECTION-SCREEN 里面的实现:

AT SELECTION-SCREEN OUTPUT.
   PERFORM AT_SELECTION.


FORM AT_SELECTION .
     LOOP AT SCREEN.
          CASE  screen-group1.
            WHEN 'UDP'.
                IF B_UDP EQ 'X'.
                   screen-active 1.
                   screen-invisible 0.
                ELSE.
                   screen-active 0.
                   screen-invisible 1.
                ENDIF.
          ENDCASE.
          modify screen.
     ENDLOOP.
ENDFORM.                    " AT_SELECTION



            (十六)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值