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/tech/pnotes/18015.html

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

相关推荐

发表回复

登录后才能评论