zoukankan      html  css  js  c++  java
  • ABAP选择屏幕设计

    选择屏幕

    下面是一个典型的选择屏幕的典型例子.
    1.设置选择屏幕参数.
    ***begin(end) of block使用屏幕元素逻辑块.
    SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TITLE1.
    ***定义选择标准,比如那些屏幕子段使用范围,设置为必选或使用内存ID等.
    SELECT-OPTIONS <seltab> FOR <f> DEFAULT│NO INTERVALS│OBLIGATORY│NO-DISPLAY│MEMORY
    ID...
    ***要在选择屏幕上书写文本使用屏幕注释并在屏幕初始化时赋值.
     SELECTION-SCREEN COMMENT ...
    ***在屏幕上画线.
     SELECTION-SCREEN ULINE ...
    ***Begind(end)of line包含的屏幕参数将在同一条直线上.
     SELECTION-SCREEN BEGIN OF LINE...
     SELECTION-SCREEN END OF LINE...
    ***设置屏幕位置.
     SELECTION-SCREEN POSITION...
    ***在应用工具条上创建按钮响应事件
     SELECTION-SCREEN FUNCTION KEY...
    ***在屏幕上创建按钮.
     SELECTION SCREEN PUSHBUTTON ...
    SELECTION-SCREEN END   OF BLOCK BK1.

    INITIALIZATION.
    ***初始化屏幕参数,类似VB的Form_load事件***

    AT SELECTION-SCREEN <on help(value)-request for field│>.
    ***系统选择屏幕时的过程处理,比如需要判断一些屏幕字段的条件限制如为某些值则***显示
    error message,程序没有必要浪费时间继续执行下去.
    ***on help-request 可为屏幕字段显示自定义帮助
    ***on value-request可显示建议列表值
    ***可这样理解AT selection-screen相当于 PBO.
    ***PERFORM sub_validate_FieldXXX .
    ***选屏后按Enter或F8运行时都会执行.
    START-OF-SELECTION .
    ***设置内表值,处理没有附加关键字的所有语句.
    ***通常包含在此的Form是在按F8后才开始执行.
    END-OF_SELECTION .

    AT USER-COMMAND.
    ***处理用户请求事件,如报表使用ALV格式,通常在call function exporting
    *** I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
    ***再建立一个子程序form USER_COMMAND USING UCOMM LIKE SY-UCOMM

    AT LINE-SELECTION.
    ***通常此事件在报表显示后用户在列表中在选择行时触发.如报表使用的是write
    ***就可使用此事件.
    *** SET PARAMETER ID 'XXX' FIELD XXX.
    *** call transACtion 'XXX' AND SKIP FIRST SCREEN.

    TOP-OF-PAGE.
    *** 显示数据,使用TOP-OF-PAGE是在分页时可将定义的页头页尾在每页显示.
    *** PERFORM write_page_header(page header在每页都显示).
    *** PERFORM DISPLAY_ALV_DATA.
    END-OF-PAGE.
    下面一个简单的会计凭证显示的实例说明选择屏幕的使用.
    ***这程序只是做演示用,但是包含了常用的选择屏幕技术.
    将下面的程序copy就可跑.



    REPORT  ZSELECTION  NO STANDARD PAGE HEADING
                                   MESSAGE-ID zFIMSG "MEssage Class
                                   LINE-SIZE 255
                                   LINE-COUNT 32(3).

    tables :BKPF,BSEG,S070.
    DATA:ZBKPF like bkpf occurs 0 ,
        zwa_bkpf like bkpf.
    CONSTANTS:P_variant(2)      TYPE c     VALUE 'WL'.
    ***下面这些屏幕参数和事件没有关系,只是参数集而已.
    SELECTION-SCREEN BEGIN OF BLOCK  bk1 WITH FRAME TITLE Cond1.
    SELECT-OPTIONS S_bukrs FOR bkpf-bukrs MEMORY ID BUK.
    SELECT-OPTIONS S_blart FOR bkpf-blart NO INTERVALS .
    SELECT-OPTIONS S_belnr FOR bkpf-belnr .
    SELECT-OPTIONS S_budat FOR bkpf-budat DEFAULT sy-datum.
    SELECT-OPTIONS S_bldat FOR bkpf-bldat NO INTERVALS NO-EXTENSION.
    SELECT-OPTIONS S_gjahr FOR bkpf-gjahr MEMORY ID GJR DEFAULT sy-datum(4).
    SELECT-OPTIONS weekran for s070-SPBUP NO-EXTENSION .
    SELECTION-SCREEN END OF BLOCK bk1.

    SELECTION-SCREEN BEGIN OF BLOCK bk2 WITH FRAME TITLE Cond2.
    SELECTION-SCREEN COMMENT /1(30) COMM1 .       "使用屏幕注释
    SELECTION-SCREEN BEGIN OF LINE ."两单选框将在同一条线上.
    PARAMETERS pnor  RADIOBUTTON GROUP grp1 DEFAULT 'X'."Print normal doc
    PARAMETERS ppark   RADIOBUTTON GROUP grp1.          "Print parked doc
    SELECTION-SCREEN END OF LINE .
    SELECTION-SCREEN END OF BLOCK bk2.

    ***1 初始化参数.
    INITIALIZATION.
     Cond1  = '【Condition】'.
     Cond2 = '【Normal Doc│Parked Doc】'.
     COMM1 = 'Choose Doc. Type:'. "注释赋初值.
    ***初始公司值,这在有些需要后台跑的程序非常有用,除了使用variant外,在此也可赋初
    ***下面的例子在初始化后公司代码选择了1000和3000排除了2000
     S_bukrs-low = '1000'.
     S_bukrs-sign = 'I'. "I->包含,E->排除
     S_bukrs-option = 'EQ'. "NE
     APPEND S_bukrs.
     S_bukrs-low = '2000'.
     S_bukrs-sign = 'E'.
     S_bukrs-option = 'EQ'.
     APPEND S_bukrs.
     S_bukrs-low = '3000'.
     S_bukrs-sign = 'E'.
     S_bukrs-option = 'EQ'.
     APPEND S_bukrs.
    ***初始化doc range 从0100000000到1000000000
     s_belnr-low = '0100000000'.
     s_belnr-high = '1000000000'.
     s_belnr-sign = 'I' .
     s_belnr-option = 'BT'.
     append s_belnr.

    ***2 使用sug_get_week后得到所选日期的当前周数,在选择weekrag字段时才触发.
    ***当你选择weekran字段时.
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR weekran-low.
     PERFORM sub_get_week CHANGING weekran-low.


    AT SELECTION-SCREEN.
    ***判断所选择的公司代码是否有效,通常并不是必须的.
    ***当然你也可将此步省略,直接在START-OF-SELECTION判断.
    ***根据需要可做很多vaid字段的判断.
     PERFORM SUB_VALIDATE_COMP.

    ***3开始选屏
    START-OF-SELECTION.
     Perform SUB_GET_DOC.
     PERFORM SUB_WRT_DOC.
    END-OF-SELECTION.

    ***4.分页时显示page header或page footer.
    TOP-OF-PAGE.
     perform sub_WRT_HEADER.
    end-of-page.

    ***5.当点击行并且是点到Document NO.CAll FB03.
    AT line-selection.
     Perform sub_line_response.
    form sub_line_response.
     Data: ZFLDNAME  like DD01L-DOMNAME,
           ZFLDVALUE like TTREET-TEXT,
           zwa_bkpf like bkpf.
     GET CURSOR FIELD ZFLDNAME VALUE ZFLDVALUE .
     if ZFLDNAME = 'ZWA_BKPF-BELNR' .
    *  READ TABLE Zbkpf into zwa_bkpf WITH KEY BELNR = ZFLDVALUE.
    *   SET PARAMETER ID 'BUK' FIELD zwa_bkpf-BUKRS.
    *   SET PARAMETER ID 'GJR' FIELD zwa_bkpf-GJAHR.
    *   SET PARAMETER ID 'BLN' FIELD zwa_bkpf-BELNR.
      SET PARAMETER ID 'BLN' FIELD ZFLDVALUE .
      CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
     endif.
    endform .



    FORM SUB_GET_DOC.
      refresh zbkpf .
      SELECT * FROM bkpf into table Zbkpf
        WHERE bukrs IN s_bukrs
          AND belnr IN s_belnr
          AND gjahr IN s_gjahr
          AND budat IN s_budat.
    endform.

    form sub_wrt_header.
     FORMAT INTENSIFIED COLOR = 6.
     WRITE AT: /01    'Finaincial Document List:'(h07).
     FORMAT COLOR COL_NORMAL ON.
     FORMAT COLOR COL_HEADING ON.
     WRITE AT:/01(48)  sy-uline.
     FORMAT COLOR COL_HEADING OFF.
     FORMAT COLOR OFF.
    endform.

    form sub_wrt_doc.
     uline /1(41).
     loop at zbkpf into zwa_bkpf.
        write:/ '│',zwa_bkpf-bukrs,'│',zwa_bkpf-belnr,'│',zwa_bkpf-gjahr,'│',zwa_bkpf-
    budat,'│'.
        uline /1(41).
     endloop.
    endform.

    FORM SUB_VALIDATE_COMP.
     data itab_bukrs like bkpf-bukrs occurs 0 .
     select  bukrs into table itab_bukrs
       from T001
       where BUKRS in S_bukrs .
     if itab_bukrs IS INITIAL.
        Message e002(00) .
     endif.
    endform.



    FORM sub_get_week CHANGING wkran LIKE s070-SPBUP.
     DATA: l_date      LIKE workflds-gkday,
           l_period    LIKE t009b-poper,
           l_year      LIKE t009b-bdatj.
    ***根据选择日期得到当前周数
     CALL FUNCTION 'F4_DATE'
       EXPORTING
         date_for_first_month         = sy-datum
         display                      = ''
       IMPORTING
         select_date                  = l_date
       EXCEPTIONS
         calendar_buffer_not_loadable = 1
         date_after_range             = 2
         date_before_range            = 3
         date_invalid                 = 4
         factory_calendar_not_found   = 5
         holiday_calendar_not_found   = 6
         parameter_conflict           = 7
         OTHERS                       = 8.
     CALL FUNCTION 'G_PERIOD_GET'
       EXPORTING
         date                           = l_date
    ***使用WL variant得到的period是周/年,空则是期间/年.
    ***在CO-PA或做计划时,通常是以周做period的.
         variant                        = P_variant  "'WL'
       IMPORTING
         period                         = l_period
         year                           = l_year
       EXCEPTIONS
         ledger_not_assigned_to_company = 1
         period_not_defined             = 2
         variant_not_defined            = 3
         OTHERS                         = 4.
     weekran-sign   = 'I'.
     weekran-option = 'EQ'.
     CONCATENATE l_year l_period+1(2) INTO wkran.
    endform.
  • 相关阅读:
    php stdClass转数组
    PHP 获取1970年前的时间戳,且为负
    springboot响应格式Resullt封装
    php使用elasticsearch
    day0620211207
    day0820211209
    day022021121
    day0520211206
    day0720211208
    day0320211202
  • 原文地址:https://www.cnblogs.com/byfhd/p/850679.html
Copyright © 2011-2022 走看看