SAP选择屏幕详解编程语言

1.T1

注意: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.

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/18015.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论