ABAP屏幕设计Dialog

ABAP屏幕设计DialogABAP屏幕设计:概览(屏幕、程序组织、屏幕定义和维护、屏幕属性的动态修改、屏幕序列);Screen编程实例(HelloWorld屏幕编程、工具条和菜单设计、屏幕元素);表控件设计(建立内表、向导制作、手工制作、表格相关技巧)

目录

一、概览

1.屏幕

2.程序组织

3.屏幕定义和维护

       用途:

       组成:

       Dialog的屏幕执行过程:

       属性:

       创建:

4.屏幕属性的动态修改

5.屏幕序列

二、Screen编程实例

1.Hello World屏幕编程

       建立程序:

       设计Screen:     

2.工具条和菜单设计

       菜单栏和应用程序工具栏

       功能键

3.屏幕元素

       单选按钮

       数据字典关联

       逻辑流执行

       消息类: 

      下拉框

       修改属性

       子屏幕

       表票签控件

       控件

       列表和屏幕

三、表控件设计

1、建主程序,建立内表

2、向导制作 Table Control

3、手工制作 Table Control

4、表格相关技巧


一、概览

1.屏幕

       sap的单据、主数据维护等业务功能都使用屏幕,屏幕设计中的Dialog(对话屏幕)是用户和程序之间任意形式的交互,目的:输入数据、选择菜单项、单击按钮、单击或双击列表条目

ABAP屏幕设计Dialog

点击系统中的状态,再双击屏幕编号,可以进入屏幕绘制器,再点击布局

ABAP屏幕设计Dialog                 ABAP屏幕设计Dialog

2.程序组织

abap程序类型:

  (1)完整的程序:可进行屏幕的创建、调用和显示

     Executable program(Type 1,最常用的,可执行程序)可使用标准选择屏幕

     Module pool(Type M,模块池程序,Tcode触发):至少创建一个用于指定初始屏幕的事务代码,在屏幕属性中以静态方式或在代码中以动态方式控制后续屏幕序列

   (2)不完整的程序:可以在其它程序中被调用,但本身无法执行

       Function group(Type F):可以包括函数模块、局部数据声明和屏幕

       Interface pool(Type J) Class pool(Type K):可以包含全局接口和局部数据声明

       Include program(Type I):可以包含全局类和局部数据声明

3.屏幕定义和维护

       SAP屏幕是其他屏幕元素的容器:

              可用于通过输入和输出字段、列表等显示或输入信息;

              是用户和ABAP程序之间的一种对话形式。

       用途:

             将屏幕与ABAP字典结合使用来检查用户输入数据的一致性。

             用于通过按钮、表标签控件、表控件和其它图形元素来创建用户友好的对话。

        组成:

ABAP屏幕设计Dialog

  逻辑流(Flow logic):PBO:输出(屏幕显示)的控制;PAI:用户触发按钮后响应。

        Dialog的屏幕执行过程:

ABAP屏幕设计Dialog

         属性:

               

ABAP屏幕设计Dialog
开发人员主要侧重于类型和序列,其余都采用默认

         创建:

            (1)屏幕属性(Screen attributes):在属性屏幕上设置常规屏幕属性。

            (2)屏幕布局(Screen layout):在布局编辑器中设计屏幕布局。

            (3)元素属性(Element attributes):在字段列表中设置字段属性。

                              屏幕制作器包含一个具有六个视图的元素列表,

                              可使用属性功能在任何列表中显示单个元素的所有属性,

                              也可使用该功能在布局编辑器中维护元素的属性。

            (4)逻辑流(Flow logic):在流逻辑编辑器中编写逻辑流。

                              常做的是PAI,PBO(显示)可有可无,

                              PAI必须在模块(MODULE)中写

4.屏幕属性的动态修改

       屏幕属性

             主要是PBO中的内容,SCREEN(内表)会收集所有的屏幕属性,如果要对某一个属性进行处理,必须要循环。

ABAP屏幕设计Dialog

ABAP屏幕设计Dialog
实例,将仅仅输出,改成可输入可输出

       SCREEN

               ACTIVE=1时,才可用。

ABAP屏幕设计Dialog

       初始化  SCREEN  系统表

                 

ABAP屏幕设计Dialog

       修改组属性

                     

ABAP屏幕设计Dialog

      动态修改属性:程序

                     

ABAP屏幕设计Dialog

5.屏幕序列

       下一屏幕:

                可通过动态和静态两种方式指定下一屏幕

ABAP屏幕设计Dialog

         静态屏幕序列:

               在屏幕属性中指定

ABAP屏幕设计Dialog

          动态设置下一屏幕:

                 在PAI中,当用户触发按钮时到下一屏幕

ABAP屏幕设计Dialog

                  动态调用屏幕:(主要用于弹出式的小屏幕)

ABAP屏幕设计Dialog

                  动态设置光标位置:

ABAP屏幕设计Dialog

二、Screen编程实例

1.Hello World屏幕编程

   实例   ZTEST_F001

        建立一个屏幕:屏幕包含一个“HELLO WORLD”的文本字段和一个“退出”按钮;

                                 单击“退出”按钮时退出整个程序。

        步骤:建立程序——>设计Screen——>调用Screen

        建立程序:

              •
输入
TCODE

SE38
,输入程序名,单击“创建”按钮
              •
输入标题,程序类型等信息后,单击“保存”按钮
              

ABAP屏幕设计Dialog

                  系统进入程序设计界面,直接保存后退回 

ABAP屏幕设计Dialog

        设计Screen:     

                 点击 显示对象列表,程序名上右键创建屏幕

ABAP屏幕设计Dialog
编号不要写1000到1010,那一般是选择屏幕的
ABAP屏幕设计Dialog
每一个屏幕都要设置OK_CODE

ABAP屏幕设计Dialog

                  点击布局后,进入屏幕绘制器

ABAP屏幕设计Dialog
搞好后,必须要激活

                  然后在主程序中用 CALL SCREEN 2001. (2001为屏幕名)调用屏幕

                  逻辑流中的PAI来对不同按钮的动作进行编写

ABAP屏幕设计Dialog
这里不能直接写代码,要写在MODULE中

​​​​​​

ABAP屏幕设计Dialog

ABAP屏幕设计Dialog

2.工具条和菜单设计

       如下步骤,将在“HELLO WORLD!”程序基础上,在屏幕上建立菜单,工具条按钮、系统按钮、添加编辑框:


在程序启动时,将程序中的变量传递到屏幕的编辑框中;

在单击菜单、工具条按钮、系统按钮时,将选中对象的功能码传递到文本框;

离开屏幕时,将两个编辑框内容输出,表示屏幕变量正确传递回主程序。

      创建gui状态

ABAP屏幕设计Dialog

    菜单栏和应用程序工具栏

        菜单

ABAP屏幕设计Dialog

         工具栏

ABAP屏幕设计Dialog

      设置好后,在PAI中的MODULE中写按钮的动作

MODULE user_command_2001 INPUT.
  CASE ok_code.
    WHEN 'EXIT'.
      MESSAGE '退出' TYPE 'I'."弹出消息
      LEAVE SCREEN."退出当前屏幕
    WHEN 'MENU1'.
      MESSAGE 'YOU TRIGGER 子菜单1' TYPE 'I'.
    WHEN 'MENU2'.
      MESSAGE 'YOU TRIGGER 子菜单2' TYPE 'I'.
    WHEN 'MENU3'.
      MESSAGE 'YOU TRIGGER 子菜单3' TYPE 'I'.
    WHEN 'MENU4'.
      MESSAGE 'YOU TRIGGER 子菜单4' TYPE 'I'.
    WHEN 'ZHEAD'.
      MESSAGE 'HEAD' TYPE 'E'.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.

        结果

ABAP屏幕设计Dialog

ABAP屏幕设计Dialog

     功能键

ABAP屏幕设计Dialog
标准按钮,名字要用标准的

       BACK、EXIT、CANCEL的功能类型用E

ABAP屏幕设计Dialog

ABAP屏幕设计Dialog

        结果,点击都退出程序

ABAP屏幕设计Dialog

3.屏幕元素

    单选按钮

          屏幕中点击布局后,可以按住左键,将两个框在一起,按右键,点击单选按钮组,再点击定义,可以将二者化成一组,二者只可选其一。

ABAP屏幕设计Dialog

    数据字典关联

       数据字典关联字段可以根据数据字典中定义的透明表、结构等信息,在屏幕上建立与字典关联的文本、输入输出字段。

       屏幕里点击布局,再点击

ABAP屏幕设计Dialog

      输入表名,点击 从字典获取(若要取自己在程序中建的表,就点击 从程序中获取 ,但只有文本框,可以自己补充文本标签),选定想要的字段,再点击√,选定位置摆好。

ABAP屏幕设计Dialog

ABAP屏幕设计Dialog

        若想在输入框中有初始值,则在PBO中加个MODULE。

        MODULE initail OUTPUT.
           TABLES vbak.
           SELECT SINGLE * FROM vbak.
        ENDMODULE.

ABAP屏幕设计Dialog

   逻辑流执行

        逻辑流的是按照顺序执行的:

               ABAP屏幕设计Dialog

         如果单击退出键,“MODULE USER_COMMAND_0100” 不会执行的。

ABAP屏幕设计Dialog
一般写在PAI里面

实例   ZTEST_F002

         主程序代码:

DATA: ok_code TYPE sy-ucomm, "功能码返回值
      save_ok TYPE sy-ucomm.
DATA: fld1(20)   TYPE c, "定义输入字段变量
      fld2(20)   TYPE c,
      fld3(20)   TYPE c,
      fld4(20)   TYPE c,
      action(50) TYPE c.
CALL SCREEN 2000. "直接调用窗口
*&---------------------------------------------------------------------*
*&      Module  CANCEL  INPUT
*&---------------------------------------------------------------------*
*     与屏幕逻辑流对应,退出程序
*----------------------------------------------------------------------*
MODULE cancel INPUT.
  LEAVE PROGRAM.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
*&定义状态条,包括菜单、工具条按钮、系统按钮等
*&---------------------------------------------------------------------*
MODULE status_2000 OUTPUT.
  SET PF-STATUS 'STATUS1'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  CHECK1  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE check1 INPUT.
  IF fld1 = 'FLD1'."当输入FLD1 = 'FLD1'时提示错误,而且不执行PAI
    MESSAGE e000(ymess). "WITH 'FLD1 ERROR'.
  ENDIF.
  IF fld1 = 'FLD11'."当输入FLD1 = 'FLD11'时弹出窗口提示,执行PAI
    MESSAGE i005(ymess) WITH 'FLD1 WARNING'.
  ENDIF.
  IF fld1 = 'FLD111'."当输入FLD1 = 'FLD111'时输出成功信息,执行PAI
    MESSAGE s005(ymess) WITH 'FLD1 OK'.
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  CHECK2  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE check2 INPUT.
  MESSAGE i005(ymess) WITH 'FLD2 * WARING'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  CHECK3  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE check3 INPUT.
  IF fld3 = 'FLD3'.
    MESSAGE e005(ymess) WITH 'FLD3 ERROR'.
  ENDIF.
  IF fld3 = 'FLD33'.
    MESSAGE i005(ymess) WITH 'FLD3 WARNING'.
  ENDIF.
  IF fld3 = 'FLD333'.
    MESSAGE s005(ymess) WITH 'FLD3 OK'.
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_2000  INPUT
*&---------------------------------------------------------------------*
*  如果能执行PAI。就把FLD1、FLD2、FLD3、FLD4合并到ACTION输入字段
*----------------------------------------------------------------------*
MODULE user_command_2000 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
  action = ''.
  CONCATENATE fld1 fld2 fld3 fld4 INTO action.
ENDMODULE.

  消息类: 

        建立消息类ymess(TCODE:SE91)下消息

        例子:MESSAGE i005(ymess)WITH ‘WARNING’.

                   MESSAGE id ‘YMESS’  TYPE ‘I’ NUMBER 005.

                   (两个语句作用相同)

ABAP屏幕设计Dialog

        ‘ &’表示with后的参数,多个‘&’表示可以传多个参数。

ABAP屏幕设计Dialog

ABAP屏幕设计Dialog

    下拉框

        在屏幕上建立一个输入输出 FIELD

        设定属性下拉:Listbox要在PBO中MODULE中写下拉显示的东西

                                 Listbox with key 则表示有域,下拉显示域中的东西

       例子显示Listbox,将 ZTEST_F002的FLD1改成下拉框,仅需要加入以下字段

TYPE-POOLS VRM."VRM类型定义接口
DATA: FNAME TYPE VRM_ID,
      VVA   TYPE VRM_VALUES,
      LVVA  LIKE LINE OF VVA.
*&---------------------------------------------------------------------*
*& Module STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
*&定义状态条,包括菜单、工具条按钮、系统按钮等
*&直接在PBO中将值填入内表,再设置下拉框
*&---------------------------------------------------------------------*
MODULE status_2000 OUTPUT.
  SET PF-STATUS 'STATUS1'.
*加两条记录
  FNAME = 'FLD1'.
  LVVA-key = '1'.
  LVVA-TEXT = '北京'.
  APPEND LVVA TO VVA.
  CLEAR LVVA.
  FNAME = 'FLD1'.
  LVVA-key = '2'.
  LVVA-TEXT = '上海'.
  APPEND LVVA TO VVA.
CALL FUNCTION 'VRM_SET_VALUES'
  EXPORTING
    id                    = FNAME
    values                = VVA
 EXCEPTIONS
   ID_ILLEGAL_NAME       = 1
   OTHERS                = 2         .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDMODULE.

ABAP屏幕设计Dialog

    修改属性

         可以在程序运行时动态地设置对象的属性:如设置一个字段是否有效

         后续步骤将在屏幕上建立一个 CHECKBOX、若干输入字段,将字段分成两个组,每一个组有一个 BUTTOM,单击组 BUTTON,根据 CHECKBOX 的值更改字段组的属性。

         ABAP屏幕设计Dialog

         主程序:

          ABAP屏幕设计Dialog

    子屏幕

         子屏幕的应用:

                一个程序可以有多个屏幕,通过子屏幕,可以把若干个子屏幕放在一个屏幕上

         •
保持了整体性,又方便对单个屏幕的维护。
         •

SAP
业务程序中,大量地使用了子屏幕设计。
     

       屏幕对象子屏幕范围对象用来定义一个子屏幕在主屏幕上的大小、位置等属性,通过逻辑流和主程序将对象关联到子屏幕。

子屏幕案例:


建立一个主窗口和两个子窗口

在主窗口上再创建一个子窗口范围

增加两个按钮,单击按钮时切换子窗口

 ZTEST_F002的屏幕上加上子屏幕

        子屏幕定义:

ABAP屏幕设计Dialog

        主屏幕逻辑流设计:

             在PBO中加入    CALL SUBSCREEN: sub1 INCLUDING sy-repid sid1.

                                       sub1是定义的子屏幕范围的名称

        主程序设计:

DATA: sid1(4) TYPE n VALUE '2001'."子窗口默认为2001
MODULE user_command_2000 INPUT.
  save_ok = ok_code.
  clear ok_code.
  CASE sy-ucomm.
    WHEN 'BUTTON1'.
      sid1 ='2001'.
    WHEN 'BUTTON2'.
      sid1 ='2002'.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
  action = ''.
  CONCATENATE fld1 fld2 fld3 fld4 INTO action.
ENDMODULE.

 case save_ok.时点击按钮无效果,改成sy-ucomm.

    表票签控件

         表条目控制是实现将多个子屏幕以页面形式切换的控件:

         实现方式:

         手工制作ABAP屏幕设计Dialog

      逐页设置名称、文本、功能码属性

      选中“子屏幕范围”按钮,在第一页创建该对象,设定好子屏幕的属性

      设定另外一页的属性和子屏

     向导生成ABAP屏幕设计Dialog

           点击图标启动向导,命名标签条名称、标签文本。          

           默认调用主屏幕的主程序名称

ABAP屏幕设计Dialog

           进入屏幕设计界面,系统自动建立完成全部页面、逻辑流和主程序代码。        

    控件

           通过“定制”对象在屏幕上显示各种控件:如图片、Tree ControlALV、编辑器

           后续步骤通过控件进行图片的显示和文本编辑器的应用                           

ABAP屏幕设计Dialog

             通过 TCODESMW0 上载图片 

ABAP屏幕设计Dialog

             新建对象,输入名称,执行输入:         

ABAP屏幕设计Dialog

             输入后,屏幕显示新产生的对象行:                

ABAP屏幕设计Dialog

               图片:

DATA:OK_CODE TYPE SY-UCOMM,
     SAVE_OK TYPE SY-UCOMM.
*定义控制和图像对象定义
DATA CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA PICTURE TYPE REF TO CL_GUI_PICTURE.
*初始标志字段定义
DATA INIT.

CALL SCREEN 100.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
*用户交互
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
* 定义状态条、包括菜单、工具条按钮、系统按钮等
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STATUS1'.
*如果还未创建定制对象
  IF INIT IS INITIAL.
*图片地址字段定义
    DATA URL(255).
    CLEAR URL.
*创建对象
    CREATE OBJECT CONTAINER
      EXPORTING CONTAINER_NAME = 'CUSCON'.

    CREATE OBJECT PICTURE
      EXPORTING PARENT = CONTAINER
      EXCEPTIONS ERROR = 1.
    IF SY-SUBRC NE 0.
    ENDIF.
*定义通用函数取得图片地址
    PERFORM LOAD_PIC_DB CHANGING URL.
*显示图片
    CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL
      EXPORTING
        URL = URL.
    IF SY-SUBRC NE 0.
    ENDIF.
*置标志位已初始
    INIT = 'X'.
  ENDIF.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  LOAD_PIC_DB
*&---------------------------------------------------------------------*
* 获取图片地址通用函数
*----------------------------------------------------------------------*
*      <--P_URL  text
*----------------------------------------------------------------------*
FORM LOAD_PIC_DB  CHANGING P_URL.
  DATA QUERY_TABLE LIKE W3QUERY OCCURS 1 WITH HEADER LINE.
  DATA HTML_TABLE LIKE W3HTML OCCURS 1.
  DATA RETURN_CODE LIKE W3PARAM-RET_CODE.
  DATA CONTENT_TYPE LIKE W3PARAM-CONT_TYPE.
  DATA CONTENT_LENGTH LIKE W3PARAM-CONT_LEN.
  DATA PIC_DATA LIKE W3MIME OCCURS 0.
  DATA PIC_SIZE TYPE I.

  REFRESH QUERY_TABLE.
*查询对象数据
  QUERY_TABLE-NAME = '_OBJECT_ID'.
*图片对象名称
  QUERY_TABLE-VALUE = 'TESTPIC'.
  APPEND QUERY_TABLE.
*读取WWWDATA表,取得图片对象信息
  CALL FUNCTION 'WWW_GET_MIME_OBJECT'
    TABLES
      QUERY_STRING        = QUERY_TABLE
      HTML                = HTML_TABLE
      MIME                = PIC_DATA
    CHANGING
      RETURN_CODE         = RETURN_CODE
      CONTENT_TYPE        = CONTENT_TYPE
      CONTENT_LENGTH      = CONTENT_LENGTH
    EXCEPTIONS
      OBJECT_NOT_FOUND    = 1
      PARAMETER_NOT_FOUND = 2
      OTHERS              = 3.
  IF SY-SUBRC EQ 0.
    PIC_SIZE = CONTENT_LENGTH.
  ENDIF.
*创建图片URL地址
  CALL FUNCTION 'DP_CREATE_URL'
    EXPORTING
      TYPE                       =  'image'
      SUBTYPE                    =  CNDP_SAP_TAB_UNKNOWN
     SIZE                        =  PIC_SIZE
*   DATE                       =
*   TIME                       =
*   DESCRIPTION                =
      LIFETIME                   =  CNDP_LIFETIME_TRANSACTION
*   CACHEABLE                  =
    TABLES
      DATA                       =  PIC_DATA
*   FIELDS                     =
*   PROPERTIES                 =
    CHANGING
      URL                        =  URL
   EXCEPTIONS
     DP_INVALID_PARAMETER       = 1
     DP_ERROR_PUT_TABLE         = 2
     DP_ERROR_GENERAL           = 3
     OTHERS                     = 4
            .
  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.                    " LOAD_PIC_DB

               文本框:

DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.
*初始标志字段定义
*定制控制和编辑对象定义
DATA: init,
      container TYPE REF TO cl_gui_custom_container, "容器
      editor    TYPE REF TO cl_gui_textedit.

DATA: m1(256)   TYPE c OCCURS 0,
      line(256) TYPE c.
*输入初始值
line = '请输入'.
APPEND line TO m1.

CALL SCREEN 100.

REFRESH m1.

CALL METHOD editor->get_text_as_r3table
  IMPORTING
    table = m1.
*逐行输出
LOOP AT m1 INTO line.
  WRITE / line.
ENDLOOP.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS1'.
*如果还未创建定制对象
  IF init IS INITIAL.
    CREATE OBJECT container
      EXPORTING
        container_name = 'CUSCON'."‘定制化控制’控件的名称,要大写
    IF CONTAINER IS BOUND.
    CREATE OBJECT editor
      EXPORTING
        parent                     = container
        wordwrap_mode              = cl_gui_textedit=>wordwrap_at_fixed_position
        wordwrap_position          = 256
        wordwrap_to_linebreak_mode = cl_gui_textedit=>true.
    ENDIF.
    init = 'X'.
  ENDIF.
*读入初始数据
  CALL METHOD editor->set_text_as_r3table
    EXPORTING
      table = m1.

ENDMODULE.

               程序执行:          

ABAP屏幕设计Dialog
文本编辑器

            实例: ZTEST_F003 

ABAP屏幕设计Dialog
图片的显示

             实例: ZTEST_F004 

    列表和屏幕

         根据 SPFLI 表(航空表),建立一个输入字段和一个查询按钮的屏幕:               

         当单查询按钮时,根据该输入字段检索,将数据通过列表输出

ABAP屏幕设计Dialog

         设计屏幕:

                •
添加一个文本字段
                •
建立一个输入框(输入输出)
                •
添加“确认”按钮和取消”按钮

ABAP屏幕设计Dialog

         设计逻辑流程序:

ABAP屏幕设计Dialog

         主程序:  

DATA: OK_CODE TYPE SY-UCOMM, 
      SAVE_OK TYPE SY-UCOMM, 
      SCARRID(20) TYPE C. 
TABLES SPFLI. 
 
CALL SCREEN 100. 
*&---------------------------------------------------------------------* 
*&      Module  CANCEL  INPUT 
*&---------------------------------------------------------------------* 
MODULE CANCEL INPUT. 
  LEAVE PROGRAM. 
ENDMODULE.                 " CANCEL  INPUT 
*&---------------------------------------------------------------------* 
*&      Module  USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
MODULE USER_COMMAND_0100 INPUT. 
  SAVE_OK = OK_CODE. 
  CLEAR OK_CODE. 
  IF SAVE_OK EQ 'BTN1'. 
    LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0. 
    SUPPRESS DIALOG. 
    SELECT * 
      FROM SPFLI WHERE CARRID = SCARRID. 
      WRITE: / SPFLI-CARRID,SPFLI-CONNID, 
               SPFLI-CITYFROM,SPFLI-CITYTO. 
    ENDSELECT. 
  ENDIF. 
  WRITE: / 'DONE'. 
ENDMODULE.                 " USER_COMMAND_0100  INPUT

         执行效果: 

ABAP屏幕设计Dialog

          根据 SPFLI 表(航空表),在屏幕上输出列表,当双击某一行时,调用屏幕显示数据明细

ABAP屏幕设计Dialog

          系统自动创建输入文本和输入字段,添加退出按钮:

ABAP屏幕设计Dialog

          定义逻辑流程序和加入OK_CODE

ABAP屏幕设计Dialog

         主程序:

TABLES SPFLI. 
 
START-OF-SELECTION. 
  SELECT * FROM SPFLI. 
    WRITE: / SPFLI-CARRID, (15) SPFLI-CONNID, 
          (15) SPFLI-COUNTRYTO, (15) SPFLI-CITYFROM, 
          (15) SPFLI-AIRPFROM. 
 
    HIDE: SPFLI-CARRID,SPFLI-CONNID,SPFLI-COUNTRYFR, 
          SPFLI-CITYFROM,SPFLI-AIRPFROM,SPFLI-COUNTRYTO, 
          SPFLI-CITYTO,SPFLI-AIRPTO. 
  ENDSELECT. 
 
AT LINE-SELECTION. 
  CHECK NOT SPFLI-CARRID IS INITIAL. 
  CALL SCREEN 100. 
 
*&---------------------------------------------------------------------* 
*&      Module  CANCEL  INPUT 
*&---------------------------------------------------------------------* 
MODULE CANCEL INPUT. 
  LEAVE PROGRAM. 
ENDMODULE.                 " CANCEL  INPUT 
*&---------------------------------------------------------------------* 
*&      Module  USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
MODULE USER_COMMAND_0100 INPUT. 
 
ENDMODULE.                 " USER_COMMAND_0100  INPUT

          执行效果:

ABAP屏幕设计Dialog

三、表控件设计

1、建主程序,建立内表

表控件(Table Control)是 SAP 应用中最重要的对象之一:

业务单据的输入、基础数据的表格输入等都是使用 Table Control 控件。

后续步骤包含如下:

  • 首先建立程序,创建屏幕(屏幕有退出按钮),定义内表
  • 通过向导产生表控件
  • 通过手工方式设计表控件

案例:ZTEST_F009 

逻辑流程序:

*PBO 显示屏幕前的处理 
PROCESS BEFORE OUTPUT. 
    MODULE STATUS_0100. 
 
*PAI 用户输入后的处理 
PROCESS AFTER INPUT. 
    MODULE USER_COMMAND_0100. 

主程序:

*功能码返回值 
DATA:OK_CODE TYPE SY-UCOMM, 
            SAVE_OK LIKE OK_CODE. 
 
*定义内表,注意,两种写法一样 
*DATA SP1 LIKE SPFLI OCCURS 0 WITH HEADER LINE. 
DATA SP1 LIKE TABLE OF SPFLI WITH HEADER LINE. 
*增加内表数据 
SELECT * INTO CORRESPONDING FIELDS OF TABLE SP1 FROM SPFLI. 
 
*测试输出数据 
*LOOP AT SP1. 
*      WRITE: / SP1-CARRID,SP1-CITYFROM. 
*ENDLOOP. 
 
*直接调用窗口 
CALL SCREEN 100. 
 
*用户交互 
MODULE USER_COMMAND_0100 INPUT. 
        SAVE_OK = OK_CODE. 
CLEAR OK_CODE. 
*退出按钮时退出程序 
CASE SAVE_OK. 
        WHEN ‘EXIT’. 
                LEAVE PROGRAM. 
ENDCASE. 
ENDMODULE. 

*定义状态条、包括菜单、工具条按钮、系统按钮等 
MODULE STATUS_0100 OUTPUT. 
        SET PF-STATUS ‘STATUS1’. 
ENDMODULE. 

2、向导制作 Table Control

  • 启动向导:在屏幕编辑器中点击表控件按钮启动表控件向导
  • 设置表控件名称
  • 定义表数据:选择从内表中获得数据,该内表在主程序中已建立(如果建立的内表自带工作区,就无需填写表工作区)
  • 定义表显示字段
  • 设置表控件属性:表控件能输入,有表头,单选记录,无滚动条
  • 维护生成程序的名称:一般使用默认的名称(如果主程序较为复杂,则可写在子程序中,如图所示)

ABAP屏幕设计Dialog

  • 完成设计
  • 结果:可分析其自动生成的逻辑流程序和主程序代码

3、手工制作 Table Control

  • 添加表控件:建立程序,添加屏幕,添加退出按钮;添加表控件名称
  • 添加表控件的列字段:选择输入输出字段;在表控件中建立;设置字段属性(与内表对应名称一致);添加表头(选择文本字段,在输入输出字段上方建立)
  • 添加其他列字段:添加转机、国家、起飞城市等;设置垂直、水平分隔符
  • 逻辑流程序设计:
*PBO显示屏幕前的处理 
PROCESS BEFORE OUTPUT. 
  MODULE STATUS_0100. 
*处理LOOP从内表读到表控制 
  LOOP WITH CONTROL TBL1. 
    MODULE FILLTBL1. 
  ENDLOOP. 
 
PROCESS AFTER INPUT. 
*处理LOOP从表控制更新内表 
  LOOP WITH CONTROL TBL1. 
    MODULE READTBL1. 
  ENDLOOP. 
  MODULE USER_COMMAND_0100. 
  •  主程序设计:
DATA: OK_CODE TYPE SY-UCOMM, 
      SAVE_OK TYPE SY-UCOMM. 
*定义内表,注意,两种写法一样 
*DATA SP2 LIKE SPFLI OCCURS 0 WITH HEADER LINE. 
DATA SP2 LIKE TABLE OF SPFLI WITH HEADER LINE. 
*定义单结构记录 
DATA SP1 TYPE SPFLI. 
*增加内表数据 
SELECT * INTO CORRESPONDING FIELDS OF TABLE SP2 FROM SPFLI. 
*直接调用窗口 
CALL SCREEN 100. 
*定义表控制对象 
CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100. 
*输出数据,看内表有无改变 
LOOP AT SP2. 
  WRITE: / SP2-CARRID,SP2-CONNID,SP2-COUNTRYFR,SP2-CITYFROM. 
ENDLOOP. 
*&---------------------------------------------------------------------* 
*&      Module  STATUS_0100  OUTPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE STATUS_0100 OUTPUT. 
  SET PF-STATUS 'STATUS1'. 
 
ENDMODULE.                 " STATUS_0100  OUTPUT 
 
 
*&---------------------------------------------------------------------* 
*&      Module  USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
MODULE USER_COMMAND_0100 INPUT. 
  SAVE_OK = OK_CODE. 
  CLEAR OK_CODE. 
  CASE SAVE_OK. 
    WHEN 'EXIT'. 
      LEAVE TO SCREEN 0. 
  ENDCASE. 
ENDMODULE.                 " USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
*&      Module  FILL  OUTPUT 
*&---------------------------------------------------------------------* 
*       逐行从内表填写表控制 
*----------------------------------------------------------------------* 
MODULE FILLTBL1 OUTPUT. 
  READ TABLE SP2 INTO SP1 INDEX TBL1-CURRENT_LINE. 
ENDMODULE.                 " FILL  OUTPUT 
*&---------------------------------------------------------------------* 
*&      Module  READ  INPUT 
*&---------------------------------------------------------------------* 
*      逐行从内表控制更新内表 
*----------------------------------------------------------------------* 
MODULE READTBL1 INPUT. 
  MODIFY SP2 FROM SP1 INDEX TBL1-CURRENT_LINE. 
ENDMODULE.                 " READ  INPUT 

4、表格相关技巧

  •  双击启动事件:定义状态条中的F2功能键,在程序中处理返回功能码

ABAP屏幕设计Dialog

  • 取得行号
*取得当前屏幕和行号 
GET CURSOR LINE LINEA. 
CHECK SY-SUBRC = 0. 
*当前行号 = 当前屏首行序号 + 当前屏行号 
LINEA = TBLA-TOP_LINE - 1. 
*用取得当前行号读取内表 
READ TABLE WA_FPFLI INDEX LINEA. 
*在状态条显示 
MESSAGE S005(YMESS) WITH LINEA.
  • 定义表格的读写属性
WHEN 'READWR'. 
*当单击按钮时,第一列只读,其他列读写切换 
    LOOP AT TBL1-COLS INTO ACOL WHERE INDEX GT 0. 
      IF SY-TABIX = 1. 
        ACOL-SCREEN-INPUT = '0'. 
      ELSE. 
        IF ACOL-SCREEN-INPUT = '0'. 
          ACOL-SCREEN-INPUT = '1'. 
        ELSEIF ACOL-SCREEN-INPUT = '1'. 
          ACOL-SCREEN-INPUT = '0'. 
          ENIF. 
        ENDIF. 
      ENDLOOP. 
      MODIFY TBL1-COLS FROM ACOL INDEX SY-TABIX.
  • 通过表格维护变更内表数据后提交数据库:(1)用向导建立表格;(2)建立按钮“取当前行”(在事件中取表格控件当前行,并在状态条显示当前行数据);(3)建立按钮“删除行”(在事件中删除表格上当前选择的行);(4)增加系统按钮“保存”(将内表数据提交数据库)

 逻辑流代码:

PROCESS BEFORE OUTPUT. 
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL1' 
  MODULE TBL1_CHANGE_TC_ATTR. 
*&SPWIZARD: MODULE TBL1_CHANGE_COL_ATTR. 
  LOOP AT   SP1 
       WITH CONTROL TBL1 
       CURSOR TBL1-CURRENT_LINE. 
*&SPWIZARD:   MODULE TBL1_CHANGE_FIELD_ATTR 
  ENDLOOP. 
* MODULE STATUS_0100. 

PROCESS AFTER INPUT. 
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL1' 
  LOOP AT SP1. 
    CHAIN. 
      FIELD SP1-CARRID. 
      FIELD SP1-CONNID. 
      FIELD SP1-COUNTRYFR. 
      FIELD SP1-CITYFROM. 
      FIELD SP1-AIRPFROM. 
      FIELD SP1-COUNTRYTO. 
      FIELD SP1-CITYTO. 
      FIELD SP1-AIRPTO. 
      MODULE TBL1_MODIFY ON CHAIN-REQUEST. 
    ENDCHAIN. 
  ENDLOOP. 
*&SPWIZARD: MODULE TBL1_CHANGE_TC_ATTR. 
*&SPWIZARD: MODULE TBL1_CHANGE_COL_ATTR. 
  MODULE CANCEL AT EXIT-COMMAND. 
  MODULE USER_COMMAND_0100. 

 主程序代码:

DATA: OK_CODE TYPE SY-UCOMM, 
      SAVE_OK TYPE SY-UCOMM. 
DATA: SP1 LIKE TABLE OF SPFLI WITH HEADER LINE, 
      DELA_SPFLI LIKE TABLE OF SPFLI WITH HEADER LINE. 
DATA LINEA TYPE I. 
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL1' ITSELF 
CONTROLS: TBL1 TYPE TABLEVIEW USING SCREEN 0100. 
DATA WA1 LIKE SPFLI. 
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE SP1. 
CALL SCREEN 100. 
*&SPWIZARD: OUTPUT MODULE FOR TC 'TBL1'. DO NOT CHANGE THIS LINE! 
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR 
MODULE TBL1_CHANGE_TC_ATTR OUTPUT. 
  DESCRIBE TABLE SP1 LINES TBL1-LINES. 
ENDMODULE.                    "TBL1_CHANGE_TC_ATTR OUTPUT 
 
*&SPWIZARD: INPUT MODULE FOR TC 'TBL1'. DO NOT CHANGE THIS LINE! 
*&SPWIZARD: MODIFY TABLE 
MODULE TBL1_MODIFY INPUT. 
  MODIFY SP1 
    INDEX TBL1-CURRENT_LINE. 
ENDMODULE.                    "TBL1_MODIFY INPUT 
*&---------------------------------------------------------------------* 
*&      Module  STATUS_0100  OUTPUT 
*&---------------------------------------------------------------------* 
*       text  
*----------------------------------------------------------------------* 
MODULE STATUS_0100 OUTPUT. 
  SET PF-STATUS 'STATUS1'. 
 
ENDMODULE.                 " STATUS_0100  OUTPUT 
*&---------------------------------------------------------------------* 
*&      Module  CANCEL  INPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE CANCEL INPUT. 
 
ENDMODULE.                 " CANCEL  INPUT 
*&---------------------------------------------------------------------* 
*&      Module  USER_COMMAND_0100  INPUT 
*&---------------------------------------------------------------------* 
*       text 
*----------------------------------------------------------------------* 
MODULE USER_COMMAND_0100 INPUT. 
  SAVE_OK = OK_CODE. 
  CLEAR OK_CODE. 
  CASE SAVE_OK. 
    WHEN 'EXIT'. 
      LEAVE TO SCREEN 0. 
    WHEN 'SAVE'. 
      MODIFY SPFLI FROM TABLE SP1. 
      IF SY-SUBRC NE 0. 
        MESSAGE I005(YMESS) WITH '更新数据错误!'. 
        EXIT. 
      ELSE. 
        MESSAGE I005(YESS) WITH '更新数据OK!'. 
      ENDIF. 
      DELETE SPFLI FROM TABLE DELA_SPFLI. 
      IF SY-SUBRC NE 0. 
        MESSAGE I005(YMESS) WITH '更新数据错误!'. 
      ELSE. 
        MESSAGE I005(YESS) WITH '更新数据OK!'. 
      ENDIF. 
    WHEN 'DELA'. 
      GET CURSOR LINE LINEA. 
      CHECK SY-SUBRC = 0. 
      LINEA = TBL1-TOP_LINE + LINEA - 1. 
      READ TABLE SP1 INDEX LINEA. 
      APPEND SP1 TO DELA_SPFLI. 
      DELETE SP1 INDEX : LINEA. 
    WHEN 'GETDATA'. 
      GET CURSOR LINE LINEA. 
      CHECK SY-SUBRC = 0. 
      LINEA = TBL1-TOP_LINE - 1. 
      READ TABLE SP1 INDEX LINEA. 
      MESSAGE S006(YMESS) WITH SP1-CARRID SP1-CITYFROM. 
  ENDCASE. 
ENDMODULE.                 " USER_COMMAND_0100  INPUT

今天的文章ABAP屏幕设计Dialog分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/63272.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注