ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SAP选择屏幕

2021-09-25 16:03:52  阅读:215  来源: 互联网

标签:SELECTION &-----------------------------------------------------------------


注意:PBO->PAI->PBO 
PBO对控件进行设置,PAI对数据进行校验
FUNC CODE会触发PAI 就不需要在屏幕上回车触发了
1.单选
PARAMETERS P_ZCODE TYPE ZWXSTUDENT_01-ZCODE.
 
2.复选
SELECT-OPTIONS S_SEX FOR GS_STUDENT-SEX NO INTERVALS NO-EXTENSION.
SELECT-OPTIONS S_ZNAME FOR GS_STUDENT-ZNAME.
 
3.常用语法
    默认值 DEFAULT aaa
    必输   OBLIGATORY
    隐藏   NO-DISPLAY
    显示长度 VISIBLE LENGTH aaa
    编辑组控制 MODIF ID modId
    按钮功能   USER-COMMAND fcode
    允许小写字母    LOWER CASE
    搜索棒读    MATCHCODE OBJECT search_help
    定义内存参数    MEMORY ID pid
SELECT-OPTIONS后缀
    默认值 DEFAULT aaa to bbb OPTION opt SIGN sgn
    多行输入控制 NO-EXTENSION
    输入范围控制 NO-INTERVALS
 
4.动态SQL语句
先新建一个内表和字符串
DATA WHERE_CONDS(100) OCCURS 0 WITH HEADER LINE.
DATA WHERE_COND(100) TYPE C.
动态拼接在WHERE_COND上在APPEND在WHERE_CONDS上
最后在SQL语句上where (WHERE_CONDS) 注意()是必需的
 
如果动态拼接SELECT-OPTIONS建议使用IN
注意BETWEEN A AND B  A和B需要用单引号引起来
 
NUMC前导零太多先转成字符串
使用SHIFT STR LEFT DELETING LEADING '0'. 即可去掉前导零
 
5.判断在表头的内表是否为空
  IF GT_TABLE[] IS NOT INITIAL 注意[]
 
6.多表查询
使用LEFT JOIN 连接表的时候条件写法是
表名1~字段1 = 表名2~字段2
 
还有就是查询出来的数据名字必须和内表完全统一
使用AS关键字给查出的字段重命名
 
7.PERFORM
PERFORM XXX USING a b c 进行传值
注意这里不加value就穿的是a的地址,加value是传值
FORM XXX USING aa bb value(cc).
ENDFORM.
 
CHANGING会返回值
 
 
 
 
2.T2
*&---------------------------------------------------------------------*
*& Report ZWXT_04
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZWXT_04.
 
TABLES ZWXSTUDENT_01.
 
DATA GENDER TYPE C.
 
TYPES: BEGIN OF GTY_TOTAL,
        ZCODE   TYPE ZWXSTUDENT_01-ZCODE,
        ZNAME   TYPE ZWXSTUDENT_01-ZNAME,
        ZSEX    TYPE ZWXSTUDENT_01-SEX,
        ZSCHOOL TYPE ZWXSCHOOL_01-ZSCHOOL,
        ZSNAME  TYPE ZWXSCHOOL_01-ZSNAME,
       END OF GTY_TOTAL.
 
DATA GT_TOTAL TYPE STANDARD TABLE OF GTY_TOTAL.
DATA GS_TOTAL TYPE GTY_TOTAL.
 
* 学校表
DATA GT_SCHOOL TYPE STANDARD TABLE OF ZSCHOOL_WX_STR_01.
DATA GS_SCHOOL TYPE ZSCHOOL_WX_STR_01.
 
* 学生表
DATA GT_STUDENT TYPE STANDARD TABLE OF ZWXSTUDENT_01.
DATA GS_STUDENT TYPE ZWXSTUDENT_01.
 
*&---------------------------------------------------------------------*
*&  选择屏幕 OBLIGATORY 必输项
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-T01.
PARAMETERS P_ZCODE TYPE ZWXSTUDENT_01-ZCODE OBLIGATORY VISIBLE LENGTH 10 DEFAULT '1001'.
SELECT-OPTIONS S_SCHOOL FOR GS_STUDENT-ZSCHOOL NO INTERVALS NO-EXTENSION.
SELECT-OPTIONS S_ZNAME FOR GS_STUDENT-ZNAME ."DEFAULT '张三' TO '李四' SIGN I OPTION NB.
SELECTION-SCREEN END OF BLOCK BK1.
 
 
SELECTION-SCREEN BEGIN OF BLOCK BK2 WITH FRAME TITLE TEXT-T02.
*&---------------------------------------------------------------------*
*&  RadioButton SELECTION-SCREEN BEGIN OF LINE指明放在一行
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF LINE.
   "放在一行的无法显示文本,需要使用SELECTION-SCREEN COMMENT (10) TEXT-T03来显示文本
   PARAMETERS R_MALE   RADIOBUTTON GROUP GP_1.
   SELECTION-SCREEN COMMENT (10) TEXT-T03 FOR FIELD R_MALE.
   "两边间隔
   SELECTION-SCREEN POSITION 30.
   PARAMETERS R_FEMALE RADIOBUTTON GROUP GP_1 DEFAULT 'X'.
   SELECTION-SCREEN COMMENT (10) TEXT-T04 FOR FIELD R_FEMALE.
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BK2.
*&---------------------------------------------------------------------*
*&  CheckBox
*&---------------------------------------------------------------------*
 
SELECTION-SCREEN BEGIN OF BLOCK BK3 WITH FRAME TITLE TEXT-T09.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS C_FOOD01  AS CHECKBOX.
    SELECTION-SCREEN COMMENT (10) TEXT-T05 FOR FIELD C_FOOD01.
    PARAMETERS C_FOOD02  AS CHECKBOX.
    SELECTION-SCREEN COMMENT (10) TEXT-T06 FOR FIELD C_FOOD02.
    PARAMETERS C_FOOD03  AS CHECKBOX.
    SELECTION-SCREEN COMMENT (10) TEXT-T07 FOR FIELD C_FOOD03.
    PARAMETERS C_FOOD04  AS CHECKBOX.
    SELECTION-SCREEN COMMENT (10) TEXT-T08 FOR FIELD C_FOOD04.
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BK3.
 
*&---------------------------------------------------------------------*
*&  取数及输出
*&---------------------------------------------------------------------*
* SELECT语句 多条取数 -> INTO TABLE
* SIGN OPTION LOW HIGH
* 如果INTO TABLE则SELECT查出的字段需要和INTO的内表结构一致
* 如果只需要个别字段使用INTO CORRESPONDING FIELDS OF TABLE即可
* 判断选的男还是女
IF R_MALE = 'X'.
  GENDER = 'F'.
ELSE.
  GENDER = 'M'.
ENDIF.
SELECT ZCODE ZNAME SEX ZSCHOOL FROM ZWXSTUDENT_01
         INTO CORRESPONDING FIELDS OF TABLE GT_STUDENT
         WHERE ZCODE EQ P_ZCODE
         AND  SEX EQ GENDER
         AND  ZSCHOOL IN S_SCHOOL
         AND  ZNAME IN S_ZNAME.
 
LOOP AT GT_STUDENT INTO GS_STUDENT.
  WRITE: / GS_STUDENT-ZCODE NO-ZERO,GS_STUDENT-ZNAME,GS_STUDENT-SEX,GS_STUDENT-ZSCHOOL.
ENDLOOP.
WRITE: / '输出成功'.
3.T3
*&---------------------------------------------------------------------*
*& Report ZWXT_05
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZWXT_05 MESSAGE-ID WX NO STANDARD PAGE HEADING.
 
*&---------------------------------------------------------------------*
*&  TOP
*&---------------------------------------------------------------------*
INCLUDE ZWXT_05_TOP.
INCLUDE ZWXT_05_FORM.
 
* 初始化
INITIALIZATION.
  PERFORM INIT_SCREEN.
 
* PAI
AT SELECTION-SCREEN.
  PERFORM PAI_SCREEN.
 
* PBO
AT SELECTION-SCREEN OUTPUT.
  PERFORM PBO_SCREEN.
 
* START-OF-SELECTION
START-OF-SELECTION.
  PERFORM START_SCREEN.
 
* END-OF-SELECTION
END-OF-SELECTION.
  PERFORM END_SCREEN.
 
****************TOP**********************
****************TOP**********************
****************TOP**********************
****************TOP**********************
****************TOP**********************
*&---------------------------------------------------------------------*
*& 包含               ZWXT_05_TOP
*&---------------------------------------------------------------------*
 
*&---------------------------------------------------------------------*
*& 数据定义
*&---------------------------------------------------------------------*
TABLES: ZWXSTUDENT_01,
        ZWXSCHOOL_01,
        ZWX_COURSE,
        ZWX_SCORE.
* 动态拼接SQL
DATA WHERE_CONDS(100) OCCURS 0 WITH HEADER LINE.
DATA WHERE_COND(100) TYPE C.
* 定义数据转换中间变量
DATA DEC_TO_C_LOW(6) TYPE C.
DATA DEC_TO_C_HIGH(6) TYPE C.
DATA NUMC_TO_C(15) TYPE C.
* 学生内表和结构
DATA GT_STUDENT TYPE STANDARD TABLE OF ZWXSTUDENT_01.
DATA GS_STUDENT TYPE ZWXSTUDENT_01.
* 学校内表和结构
DATA GT_SCHOOL TYPE STANDARD TABLE OF ZWXSCHOOL_01.
DATA GS_SCHOOL TYPE ZWXSCHOOL_01.
* 课程内表和结构
DATA GT_COURSE TYPE STANDARD TABLE OF ZWX_COURSE.
DATA GS_COURSE TYPE ZWX_COURSE.
* 分数内表和结构
DATA GT_SCORE TYPE STANDARD TABLE OF ZWX_SCORE.
DATA GS_SCORE TYPE ZWX_SCORE.
 
* 显示页面的总和
TYPES: BEGIN OF GTY_TOTAL,
        ZCODE   TYPE ZWXSTUDENT_01-ZCODE, "学生编号
        ZNAME   TYPE ZWXSTUDENT_01-ZNAME, "学生姓名
        ZSEX    TYPE ZWXSTUDENT_01-SEX,   "学生性别
        ZSNAME  TYPE ZWXSCHOOL_01-ZSNAME, "学校名称
        ZCNAME  TYPE ZWX_COURSE-ZCNAME,   "课程名字
        ZSCORE  TYPE ZWX_SCORE-ZSCORE,    "课程分数
       END OF GTY_TOTAL.
* 显示数据内表和结构
DATA GT_TOTAL TYPE STANDARD TABLE OF GTY_TOTAL.
DATA GS_TOTAL TYPE GTY_TOTAL.
 
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-T03.
  SELECTION-SCREEN BEGIN OF LINE.
      SELECTION-SCREEN COMMENT (10) TEXT-T06 FOR FIELD P_ZCODE.
      SELECTION-SCREEN POSITION 33.
      PARAMETERS P_ZCODE(10) TYPE C.  " 学生编号选择
      SELECTION-SCREEN POSITION 45.
      SELECTION-SCREEN COMMENT (10) GV_MSG.
  SELECTION-SCREEN END OF LINE.
  SELECT-OPTIONS S_ZNAME FOR GS_TOTAL-ZNAME. "学生姓名选择
 
SELECTION-SCREEN END OF BLOCK BK1.
 
* 课程名
SELECTION-SCREEN BEGIN OF BLOCK BK3 WITH FRAME TITLE TEXT-T05.
  SELECT-OPTIONS S_ZCNAME FOR GS_COURSE-ZCNAME NO INTERVALS NO-EXTENSION.
  SELECT-OPTIONS S_ZSCORE FOR GS_SCORE-ZSCORE.
SELECTION-SCREEN END OF BLOCK BK3.
 
* 是否根据性别选择
PARAMETERS P_ISSEX AS CHECKBOX USER-COMMAND HIDE.
SELECTION-SCREEN BEGIN OF BLOCK BK2 WITH FRAME TITLE TEXT-T04.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS P_MALE   RADIOBUTTON GROUP GP1 MODIF ID MD1.
    SELECTION-SCREEN COMMENT (2) TEXT-T01 FOR FIELD P_MALE.
    SELECTION-SCREEN POSITION 10.
    PARAMETERS P_FEMALE RADIOBUTTON GROUP GP1 MODIF ID MD1.
    SELECTION-SCREEN COMMENT (2) TEXT-T02 FOR FIELD P_FEMALE.
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BK2.
 
 
************FORM*****************
************FORM*****************
************FORM*****************
************FORM*****************
************FORM*****************
*&---------------------------------------------------------------------*
*& 包含               ZWXT_05_FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& FORM INIT-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM INIT_SCREEN .
  GV_MSG = '学号待验证'.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM PAI-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM PAI_SCREEN .
  IF P_ZCODE IS NOT INITIAL.
    SELECT SINGLE ZCODE
           FROM   ZWXSTUDENT_01
           INTO   GS_STUDENT
           WHERE  ZCODE = P_ZCODE.
    IF SY-SUBRC = 0.
      GV_MSG = '学生存在!'.
    ELSE.
      GV_MSG = '学生不存在'.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM PBO-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM PBO_SCREEN .
  IF P_ISSEX <> 'X'.
    LOOP AT SCREEN.
      IF SCREEN-GROUP1 = 'MD1'.
        SCREEN-INVISIBLE = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM START-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM START_SCREEN .
" 判断是否选择了男或女
IF P_ISSEX = 'X'.
  IF P_MALE = 'X'.
    CONCATENATE WHERE_COND ' ZWXSTUDENT_01~SEX = ''M'' ' INTO WHERE_COND .
  ELSE.
    CONCATENATE WHERE_COND ' ZWXSTUDENT_01~SEX = ''F'' ' INTO WHERE_COND.
  ENDIF.
  APPEND WHERE_COND TO WHERE_CONDS.
  CLEAR WHERE_COND.
ENDIF.
 
" 判断是否输入学生编号
IF P_ZCODE IS NOT INITIAL.
  IF WHERE_CONDS[] IS NOT INITIAL.
    CONCATENATE WHERE_COND ' AND ZWXSTUDENT_01~ZCODE = ''' P_ZCODE '''' INTO WHERE_COND.
  ELSE.
    CONCATENATE WHERE_COND ' ZWXSTUDENT_01~ZCODE = '' ' P_ZCODE ' '' ' INTO WHERE_COND.
  ENDIF.
  APPEND WHERE_COND TO WHERE_CONDS.
  CLEAR WHERE_COND.
ENDIF.
 
" 判断是否输入学生姓名 取low 和 high 其余不暂时不加
" LOW
IF S_ZNAME-LOW IS NOT INITIAL.
  IF WHERE_CONDS[] IS NOT INITIAL.
    CONCATENATE WHERE_COND ' AND ZWXSTUDENT_01~ZNAME IN (''' S_ZNAME-LOW INTO WHERE_COND.
  ELSE.
    CONCATENATE WHERE_COND ' ZWXSTUDENT_01~ZNAME IN (''' S_ZNAME-LOW INTO WHERE_COND.
  ENDIF.
  " 判断HIGH是不是也输入了
  IF S_ZNAME-HIGH IS NOT INITIAL.
    CONCATENATE WHERE_COND ''',''' S_ZNAME-HIGH ''')' INTO WHERE_COND.
  ELSE.
    CONCATENATE WHERE_COND ''')' INTO WHERE_COND.
  ENDIF.
  " 追加
  APPEND WHERE_COND TO WHERE_CONDS.
  CLEAR WHERE_CONDS.
" 如果low没输 输了high
ELSEIF S_ZNAME-HIGH IS NOT INITIAL.
  IF WHERE_CONDS[] IS NOT INITIAL.
    CONCATENATE WHERE_COND ' AND ZWXSTUDENT_01~ZNAME = ''' S_ZNAME-HIGH '''' INTO WHERE_COND.
  ELSE.
    CONCATENATE WHERE_COND ' ZWXSTUDENT_01~ZNAME = ''' S_ZNAME-HIGH '''' INTO WHERE_COND.
  ENDIF.
  " 追加
  APPEND WHERE_COND TO WHERE_CONDS.
  CLEAR WHERE_CONDS.
ENDIF.
 
 
" 判断是否输入了课程编号
IF S_ZCNAME-LOW IS NOT INITIAL.
  IF WHERE_CONDS[] IS NOT INITIAL.
    CONCATENATE WHERE_COND 'AND ZWX_COURSE~ZCNAME = ''' S_ZCNAME-LOW '''' INTO WHERE_COND.
  ELSE.
    CONCATENATE WHERE_COND 'ZWX_COURSE~ZCNAME = ''' S_ZCNAME-LOW '''' INTO WHERE_COND.
  ENDIF.
  APPEND WHERE_COND TO WHERE_CONDS.
  CLEAR WHERE_COND.
ENDIF.
 
" 判断在某个成绩范围内
IF S_ZSCORE-LOW IS NOT INITIAL.
  DEC_TO_C_LOW = S_ZSCORE-LOW.
  " 成绩顶峰不为空
  IF S_ZSCORE-HIGH IS NOT INITIAL.
    DEC_TO_C_HIGH = S_ZSCORE-HIGH.
    " 条件内表是否为空
    IF WHERE_CONDS[] IS NOT INITIAL.
      CONCATENATE WHERE_COND 'AND ZWX_SCORE~ZSCORE BETWEEN  '''  DEC_TO_C_LOW ''' AND  '''  DEC_TO_C_HIGH '''' INTO WHERE_COND.
    " 为空
    ELSE.
      CONCATENATE WHERE_COND 'ZWX_SCORE~ZSCORE BETWEEN  ''' DEC_TO_C_LOW ''' AND  ''' DEC_TO_C_HIGH '''' INTO WHERE_COND.
    ENDIF.
  " 否则只有最低值
  ELSE.
    IF WHERE_CONDS[] IS NOT INITIAL.
      CONCATENATE WHERE_COND 'AND ZWX_SCORE~ZSCORE GE  ''' DEC_TO_C_LOW '''' INTO WHERE_COND.
    " 为空
    ELSE.
      CONCATENATE WHERE_COND 'ZWX_SCORE~ZSCORE GE  ''' DEC_TO_C_LOW '''' INTO WHERE_COND.
    ENDIF.
  ENDIF.
  APPEND WHERE_COND TO WHERE_CONDS.
  CLEAR WHERE_COND.
" 没有最低值,判断是否要小于峰值
ELSE.
  IF S_ZSCORE-HIGH IS NOT INITIAL.
    DEC_TO_C_HIGH = S_ZSCORE-HIGH.
    IF WHERE_CONDS[] IS NOT INITIAL.
      CONCATENATE WHERE_COND 'AND ZWX_SCORE~ZSCORE LE ''' DEC_TO_C_HIGH '''' INTO WHERE_COND.
    " 为空
    ELSE.
      CONCATENATE WHERE_COND 'ZWX_SCORE~ZSCORE LE ''' DEC_TO_C_HIGH '''' INTO WHERE_COND.
    ENDIF.
    APPEND WHERE_COND TO WHERE_CONDS.
    CLEAR WHERE_COND.
  ENDIF.
ENDIF.
 
SELECT  Z1~ZCODE AS ZCODE,
        Z1~ZNAME AS ZNAME,
        Z1~SEX   AS ZSEX,
        Z2~ZSNAME AS ZSNAME,
        Z4~ZCNAME   AS ZCNAME,
        Z3~ZSCORE   AS ZSCORE
        INTO TABLE @GT_TOTAL
        FROM ZWXSTUDENT_01     AS Z1
        LEFT JOIN ZWXSCHOOL_01 AS Z2  ON Z1~ZSCHOOL = Z2~ZSCHOOL
        LEFT JOIN ZWX_SCORE    AS Z3  ON Z1~ZCODE   = Z3~ZCODE
        LEFT JOIN ZWX_COURSE   AS Z4  ON Z3~ZCID    = Z4~ZCID
        WHERE (WHERE_CONDS).
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM END_SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM END_SCREEN .
  IF GT_TOTAL[] IS INITIAL.
    MESSAGE S890 WITH '没有查到符合的数据' DISPLAY LIKE 'E'.
  ELSE.
    WRITE:/ SY-ULINE(81) .
    WRITE:/   SY-VLINE NO-GAP,(15) '学号' CENTERED NO-GAP,
              SY-VLINE NO-GAP,(12) '姓名' CENTERED NO-GAP,
              SY-VLINE NO-GAP,(5)  '性别' CENTERED NO-GAP,
              SY-VLINE NO-GAP,(12) '学校' CENTERED NO-GAP,
              SY-VLINE NO-GAP,(20) '课程' CENTERED NO-GAP,
              SY-VLINE NO-GAP,(10) '成绩' CENTERED NO-GAP,
              SY-VLINE.
    WRITE:/ SY-ULINE(81) .
    LOOP AT GT_TOTAL INTO GS_TOTAL.
      NUMC_TO_C = GS_TOTAL-ZCODE.
      SHIFT NUMC_TO_C LEFT DELETING LEADING '0'.
      IF GS_TOTAL-ZSEX = 'M'.
        GS_TOTAL-ZSEX = '男'.
      ELSE.
        GS_TOTAL-ZSEX = '女'.
      ENDIF.
      WRITE:/ SY-VLINE NO-GAP,(15) NUMC_TO_C       CENTERED NO-GAP,
              SY-VLINE NO-GAP,(12) GS_TOTAL-ZNAME  CENTERED NO-GAP,
              SY-VLINE NO-GAP,(5)  GS_TOTAL-ZSEX   CENTERED NO-GAP,
              SY-VLINE NO-GAP,(12) GS_TOTAL-ZSNAME CENTERED NO-GAP,
              SY-VLINE NO-GAP,(20) GS_TOTAL-ZCNAME CENTERED NO-GAP,
              SY-VLINE NO-GAP,(10) GS_TOTAL-ZSCORE CENTERED NO-GAP,
              SY-VLINE.
      WRITE:/ SY-ULINE(81) .
    ENDLOOP.
  ENDIF.
ENDFORM.
4.T4(操作内表来连接四个表)
*&---------------------------------------------------------------------*
*& Report ZWXT_06
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZWXT_06
              MESSAGE-ID WX
              "隐藏默认表头
              NO STANDARD PAGE HEADING
              LINE-COUNT 10.
 
*&---------------------------------------------------------------------*
*&  TOP
*&---------------------------------------------------------------------*
INCLUDE ZWXT_06_TOP.
INCLUDE ZWXT_06_FORM.
 
* 初始化
INITIALIZATION.
  PERFORM INIT_SCREEN.
 
* PAI
AT SELECTION-SCREEN.
  PERFORM PAI_SCREEN.
 
* PBO
AT SELECTION-SCREEN OUTPUT.
  PERFORM PBO_SCREEN.
 
* START-OF-SELECTION
START-OF-SELECTION.
  PERFORM START_SCREEN.
 
* END-OF-SELECTION
END-OF-SELECTION.
  PERFORM END_SCREEN.
 
* TOP-OF-PAGE
TOP-OF-PAGE.
  PERFORM TOP_PAGE.
 
TOP-OF-PAGE DURING LINE-SELECTION.
  CASE SY-UCOMM.
    WHEN 'SORTUP' OR 'SORTDOWN'.
      PERFORM TOP_PAGE.
    WHEN OTHERS.
      WRITE:/ '学校信息'.
  ENDCASE.
 
* LINE-SELECTION
AT LINE-SELECTION.
  PERFORM LINE_SELECTION.
 
* USER-COMMAND
AT USER-COMMAND.
  PERFORM USER_COMMAND.
 
* LOAD PROGRAM
*&---------------------------------------------------------------------*
*& 包含               ZWXT_06_TOP
*&---------------------------------------------------------------------*
 
*&---------------------------------------------------------------------*
*& 数据定义
*&---------------------------------------------------------------------*
TABLES: ZWXSTUDENT_01,
        ZWXSCHOOL_01,
        ZWX_COURSE,
        ZWX_SCORE.
* 定义学生ID内表
DATA: LT_ZCODE TYPE RANGE OF ZWXSTUDENT_01-ZCODE,
      LS_ZCODE LIKE LINE OF LT_ZCODE,
      LT_ZSEX  TYPE RANGE OF ZWXSTUDENT_01-SEX,
      LS_ZSEX  LIKE LINE OF LT_ZSEX.
* 定义数据转换中间变量
DATA DEC_TO_C_LOW(6) TYPE C.
DATA DEC_TO_C_HIGH(6) TYPE C.
DATA NUMC_TO_C(15) TYPE C.
* 学生内表和结构
DATA GT_STUDENT TYPE STANDARD TABLE OF ZWXSTUDENT_01.
DATA GS_STUDENT TYPE ZWXSTUDENT_01.
* 学校内表和结构
DATA GT_SCHOOL TYPE STANDARD TABLE OF ZWXSCHOOL_01.
DATA GS_SCHOOL TYPE ZWXSCHOOL_01.
* 课程内表和结构
DATA GT_COURSE TYPE STANDARD TABLE OF ZWX_COURSE.
DATA GS_COURSE TYPE ZWX_COURSE.
* 分数内表和结构
DATA GT_SCORE TYPE STANDARD TABLE OF ZWX_SCORE.
DATA GS_SCORE TYPE ZWX_SCORE.
 
* 显示页面的总和
TYPES: BEGIN OF GTY_TOTAL,
        ZCODE   TYPE ZWXSTUDENT_01-ZCODE, "学生编号
        ZNAME   TYPE ZWXSTUDENT_01-ZNAME, "学生姓名
        SEX    TYPE ZWXSTUDENT_01-SEX,   "学生性别
        ZSNAME  TYPE ZWXSCHOOL_01-ZSNAME, "学校名称
        ZCNAME  TYPE ZWX_COURSE-ZCNAME,   "课程名字
        ZSCORE  TYPE ZWX_SCORE-ZSCORE,    "课程分数
       END OF GTY_TOTAL.
* 显示数据内表和结构
DATA GT_TOTAL TYPE STANDARD TABLE OF GTY_TOTAL.
DATA GS_TOTAL TYPE GTY_TOTAL.
 
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-T03.
 
  SELECTION-SCREEN BEGIN OF LINE.
      SELECTION-SCREEN COMMENT (10) TEXT-T06 FOR FIELD P_ZCODE.
      SELECTION-SCREEN POSITION 33.
      PARAMETERS P_ZCODE TYPE ZWXSTUDENT_01-ZCODE.
      "SELECT-OPTIONS S_ZCODE FOR ZWXSTUDENT_01-ZCODE NO INTERVALS NO-EXTENSION.
      SELECTION-SCREEN COMMENT (10) GV_MSG.
  SELECTION-SCREEN END OF LINE.
  SELECT-OPTIONS S_ZNAME FOR GS_TOTAL-ZNAME. "学生姓名选择
SELECTION-SCREEN END OF BLOCK BK1.
 
* 课程名
SELECTION-SCREEN BEGIN OF BLOCK BK3 WITH FRAME TITLE TEXT-T05.
  SELECT-OPTIONS S_ZCNAME FOR GS_COURSE-ZCNAME NO INTERVALS NO-EXTENSION.
  SELECT-OPTIONS S_ZSCORE FOR GS_SCORE-ZSCORE.
SELECTION-SCREEN END OF BLOCK BK3.
 
* 是否根据性别选择
PARAMETERS P_ISSEX AS CHECKBOX USER-COMMAND HIDE.
SELECTION-SCREEN BEGIN OF BLOCK BK2 WITH FRAME TITLE TEXT-T04.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS P_MALE   RADIOBUTTON GROUP GP1 MODIF ID MD1.
    SELECTION-SCREEN COMMENT (2) TEXT-T01 FOR FIELD P_MALE.
    SELECTION-SCREEN POSITION 10.
    PARAMETERS P_FEMALE RADIOBUTTON GROUP GP1 MODIF ID MD1.
    SELECTION-SCREEN COMMENT (2) TEXT-T02 FOR FIELD P_FEMALE.
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BK2.
*&---------------------------------------------------------------------*
*& 包含               ZWXT_06_FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& FORM INIT-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM init_screen .
  gv_msg = '学号待验证'.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM PAI-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM pai_screen .
  IF p_zcode IS NOT INITIAL.
    SELECT SINGLE zcode
           FROM   zwxstudent_01
           INTO   gs_student
           WHERE  zcode = p_zcode.
    IF sy-subrc = 0.
      gv_msg = '学生存在!'.
    ELSE.
      gv_msg = '学生不存在'.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM PBO-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM pbo_screen .
  IF p_issex <> 'X'.
    LOOP AT SCREEN.
      IF screen-group1 = 'MD1'.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM START-SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM start_screen .
  IF p_zcode IS NOT INITIAL.
    ls_zcode-sign = 'I'.
    ls_zcode-low  = p_zcode.
    ls_zcode-option = 'EQ'.
    ls_zcode-high = ''.
    APPEND ls_zcode TO lt_zcode.
  ENDIF.
 
  IF p_issex IS NOT INITIAL.
    IF p_male = 'X'.
      ls_zsex-sign = 'I'.
      ls_zsex-option = 'EQ'.
      ls_zsex-low  = 'M'.
      ls_zsex-high = ''.
    ELSE.
      ls_zsex-sign = 'I'.
      ls_zsex-option = 'EQ'.
      ls_zsex-low  = 'F'.
      ls_zsex-high = ''.
    ENDIF.
    APPEND ls_zsex TO lt_zsex.
  ENDIF.
 
  "查询符合的学生
  SELECT
    zcode
    zname
    sex
    zschool
    FROM zwxstudent_01
    INTO CORRESPONDING FIELDS OF TABLE gt_student
    WHERE zcode IN lt_zcode
    AND   zname IN s_zname
    AND   sex   IN lt_zsex.
 
  "查询对应的学校
  IF gt_student IS NOT INITIAL.
    SELECT
    zschool
    zsname
    FROM  zwxschool_01
    INTO CORRESPONDING FIELDS OF TABLE gt_school
    FOR ALL ENTRIES IN gt_student
    WHERE zschool = gt_student-zschool.
  ENDIF.
 
  "查询对应的成绩
  IF gt_student IS NOT INITIAL.
    SELECT
      zcode
      zcid
      zscore
      FROM zwx_score
      INTO CORRESPONDING FIELDS OF TABLE gt_score
      FOR ALL ENTRIES IN gt_student
      WHERE zcode = gt_student-zcode
      AND   zscore IN s_zscore.
  ENDIF.
 
  "查询对应课程名
  IF gt_score IS NOT INITIAL.
    SELECT
      zcid
      zcname
      FROM zwx_course
      INTO CORRESPONDING FIELDS OF TABLE gt_course
      FOR ALL ENTRIES IN gt_score
      WHERE zcid = gt_score-zcid
      AND   zcname IN s_zcname.
      ENDIF.
 
  "将四个内表整合内容到主表里
  LOOP AT gt_student INTO gs_student.
    MOVE-CORRESPONDING gs_student TO gs_total.
    READ TABLE gt_school INTO gs_school WITH KEY zschool = gs_student-zschool.
    IF sy-subrc = 0.
      MOVE gs_school-zsname TO gs_total-zsname.
    ENDIF.
    LOOP AT gt_score INTO gs_score.
      IF gs_student-zcode = gs_score-zcode.
        READ TABLE gt_score INTO gs_score INDEX sy-tabix.
        IF sy-subrc = 0.
          MOVE gs_score-zscore TO gs_total-zscore.
          READ TABLE gt_course INTO gs_course WITH KEY zcid = gs_score-zcid.
          IF sy-subrc = 0.
            MOVE gs_course-zcname TO gs_total-zcname.
            APPEND gs_total TO gt_total.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM END_SCREEN
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM end_screen .
  SET PF-STATUS 'STATUS'.
  SET TITLEBAR 'TITLE'.
  IF gt_total[] IS INITIAL.
    MESSAGE s890 WITH '没有查到符合的数据' DISPLAY LIKE 'E'.
  ELSE.
*    WRITE:/ SY-ULINE(81) .
*    WRITE:/   SY-VLINE NO-GAP,(15) '学号' CENTERED NO-GAP,
*              SY-VLINE NO-GAP,(12) '姓名' CENTERED NO-GAP,
*              SY-VLINE NO-GAP,(5)  '性别' CENTERED NO-GAP,
*              SY-VLINE NO-GAP,(12) '学校' CENTERED NO-GAP,
*              SY-VLINE NO-GAP,(20) '课程' CENTERED NO-GAP,
*              SY-VLINE NO-GAP,(10) '成绩' CENTERED NO-GAP,
*              SY-VLINE.
*    WRITE:/ SY-ULINE(81) .
    LOOP AT gt_total INTO gs_total.
      numc_to_c = gs_total-zcode.
      SHIFT numc_to_c LEFT DELETING LEADING '0'.
      IF gs_total-sex = 'M'.
        gs_total-sex = '男'.
      ELSE.
        gs_total-sex = '女'.
      ENDIF.
      WRITE:/ sy-vline NO-GAP,(15) numc_to_c       CENTERED NO-GAP,
              sy-vline NO-GAP,(12) gs_total-zname  CENTERED NO-GAP,
              sy-vline NO-GAP,(5)  gs_total-sex   CENTERED NO-GAP,
              sy-vline NO-GAP,(12) gs_total-zsname CENTERED NO-GAP,
              sy-vline NO-GAP,(20) gs_total-zcname CENTERED NO-GAP,
              sy-vline NO-GAP,(10) gs_total-zscore CENTERED NO-GAP,
              sy-vline.
      WRITE:/ sy-uline(81) .
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form TOP_PAGE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM top_page .
    FORMAT COLOR 3 ON.
    WRITE:/(81) '学生信息表' CENTERED.
    FORMAT COLOR 3 OFF.
    WRITE:/ sy-uline(81).
    FORMAT COLOR 6 INVERSE ON.
    WRITE:/   sy-vline NO-GAP,(15) '学号' CENTERED NO-GAP,
              sy-vline NO-GAP,(12) '姓名' CENTERED NO-GAP,
              sy-vline NO-GAP,(5)  '性别' CENTERED NO-GAP,
              sy-vline NO-GAP,(12) '学校' CENTERED NO-GAP,
              sy-vline NO-GAP,(20) '课程' CENTERED NO-GAP,
              sy-vline NO-GAP,(10) '成绩' CENTERED NO-GAP,
              sy-vline.
    FORMAT COLOR 6 INVERSE OFF.
    WRITE:/ sy-uline(81) .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form LINE_SELECTION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM line_selection .
* 定义选择行数据FIELD和VALUE
  DATA: lv_field TYPE c LENGTH 30,
        lv_value TYPE c LENGTH 30.
  GET CURSOR FIELD lv_field VALUE lv_value.
  CHECK lv_field = 'GS_TOTAL-ZSNAME'.
  CONDENSE lv_value NO-GAPS.
  CLEAR gs_school.
  SELECT
      SINGLE
      zschool
      zsname
      zadd
      FROM zwxschool_01
      INTO CORRESPONDING FIELDS OF gs_school
      WHERE zsname = lv_value.
  IF sy-subrc = 0.
    WRITE:/ '学校编号:',gs_school-zschool,
          / '学校名称:',gs_school-zsname,
          / '学校地址:',gs_school-zadd.
  ELSE.
    MESSAGE i890 WITH '没有该学校的详细信息'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM user_command .
  CASE sy-ucomm.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT' OR 'CANCEL'.
      LEAVE PROGRAM.
    WHEN 'SORTUP'.
      sy-lsind = sy-lsind - 1.
      PERFORM sort_up.
    WHEN 'SORTDOWN'.
      sy-lsind = sy-lsind - 1.
      PERFORM sort_down.
    WHEN OTHERS.
      MESSAGE s890 WITH '未知的指令'.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SORT_UP
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM sort_up .
  PERFORM sort_list USING 'UP'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SORT_DOWN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM sort_down .
  PERFORM sort_list USING 'DOWN'.
ENDFORM.
 
FORM sort_list USING p_flag.
  " 定义选择行数据field和value
  DATA: lv_field TYPE c LENGTH 30,
        lv_value TYPE c LENGTH 30.
  GET CURSOR FIELD lv_field. "GS_TOTAL-ZCNAME
  IF lv_field = 'NUMC_TO_C'.
    lv_field = 'ZCODE'.
  ELSE.
    lv_field = lv_field+9(*).
  ENDIF.
  IF p_flag = 'UP'.
    SORT gt_total BY (lv_field). "()代表取值
  ELSEIF p_flag = 'DOWN'.
    SORT gt_total BY (lv_field) DESCENDING. "()代表取值
  ENDIF.
  PERFORM end_screen.
ENDFORM
 

标签:SELECTION,&-----------------------------------------------------------------
来源: https://blog.csdn.net/weixin_42921800/article/details/120473052

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有