多表取数
1. A表从数据库取数,到内表
B表从数据库取数,到内表
2. 循环A表内表,根据对应关键字读取B表
读取成功
赋值
不成功
3. 赋值到总表
SELECT zcode zname sex zschool weight
FROM zstudent_qb_02
INTO CORRESPONDING FIELDS OF TABLE gt_student
WHERE zcode IN s_zcode
AND zschool IN s_school
AND zname IN s_ZNAME
AND sex IN r_sex.
IF gt_student IS NOT INITIAL.
SELECT zschool zsname
FROM ZSCHOOL_qb_01
INTO CORRESPONDING FIELDS OF TABLE gt_SCHOOL
FOR ALL ENTRIES IN gt_student
WHERE zschool = gt_student-zschool.
SORT gt_school BY zschool.
ENDIF.
LOOP AT gt_student INTO gs_student.
CLEAR gs_TOTAL.
MOVE-CORRESPONDING gs_student TO gs_total.
MOVE gs_student-weight TO gs_total-zweight.
"WEIGHT 字段不同只能单独传,
"或者在定义时就将total表的字段定义成引用的数据库表中的字段
READ TABLE gt_SCHOOL INTO gs_school
WITH KEY zschool = gs_total-zschool BINARY SEARCH.
IF sy-subrc = 0."读取到
gs_total-zsname = gs_school-zsname.
ELSE."读取失败
CONTINUE."终止当前循环,并执行下一次
ENDIF.
APPEND gs_total TO gt_total.
ENDLOOP.
程序模块化
INCLUDE
包含程序。包含程序不能被单独调用,必须被其他程序包含,相
当于此程序代码完全复制在当前程序中。
- 注意声明部分与包含程序的位置。
INCLUDE...TOP
INCLUDE..FORM.
PERFORM/FORM
- Subroutines,子程序,子例程,在程序中形成重用模块,可以进
行多次重复调用
- 对子程序的调用
PERFORM<子程序名称>TABLES... USING....CHANGING....
- 子程序代码块
FORM<子程序名称>TABLES ...[TYPEtype] USING...[TYPE type] CHANGING...
[TYPE type].
ENDFORM.
表头事件
TOP-OF-PAGE
这个事件是在报表程序里输出自定义的表头用的,在新的一页刚开始遇到write语句的时候这个事件块就会执行一次
第一次执行:遇到程序中的第一个write语句时,跳转到TOP-OF-PAGE事件执行,执行完毕后返回执行write语句
隐藏默认表头,在REPORT程序第一行进行设置:
REPORT program NO STANDARD PAGE HEADING
定义子例程
TOP-OF-PAGE.
PERFORM top_of_page.
FORM top_of_page .
FORMAT COLOR 3 ON.
WRITE: /(92) '学生信息表' CENTERED.
FORMAT COLOR 3 OFF.
WRITE: /1(92) sy-uline.
FORMAT COLOR 6 INVERSE ON.
WRITE: /1 sy-vline NO-GAP, (10) '学号' NO-GAP CENTERED,"有输出长度CENTERED才有用
sy-vline NO-GAP, (20) '姓名' NO-GAP CENTERED,
sy-vline NO-GAP, (5) '性别' NO-GAP CENTERED,
sy-vline NO-GAP, (20) '体重(KG)' NO-GAP CENTERED,
sy-vline NO-GAP, (10) '学校' NO-GAP CENTERED,
sy-vline NO-GAP, (20) '校名' NO-GAP CENTERED,
sy-vline NO-GAP.
WRITE: /1(92) sy-uline.
FORMAT COLOR 6 INVERSE OFF.
ENDFORM.
次级表单的表头
TOP-OF-PAGE DURING LINE-SELECTION.
CASE sy-ucomm.
WHEN 'SORTUP' OR 'SORTDOWN'.
PERFORM top_of_page.
WHEN OTHERS.
FORMAT COLOR 3 ON.
WRITE:/ '详细信息'.
FORMAT COLOR 3 OFF.
ENDCASE.
设置按钮和标题
END-OF-SELECTION."输出
GT_STATUS = 'DOWNLOAD'.
APPEND GT_STATUS.
SET PF-STATUS 'STATUS' EXCLUDING GT_STATUS."使用GUI STATUS
" EXCLUDING GT_STATUS可以不包含...
SET TITLEBAR 'TITLE' WITH ' 学生信息' '学校信息'.
鼠标点击事件
AT LINE-SELECTION.
PERFORM line_select.
FORM line_select.
DATA: lv_field(30),
lv_value(30).
* 获取光标位置
GET CURSOR FIELD lv_field "字段名GS_TOTAL-ZSCHOOL
VALUE lv_value."字段值
"判断是否是学校id字段
CONDENSE lv_value.
IF lv_field = 'GS_TOTAL-ZSCHOOL'
OR lv_field = 'GS_TOTAL-ZSNAME'.
"取数从学校表
SELECT SINGLE *
FROM zschool_qb_01
"INTO ... 默认取到table语句结构体中
WHERE zschool = lv_value
OR zsname = lv_value.
"取数是否成功
IF sy-subrc = 0."成功
"显示学校的详细信息
WRITE: / '学校编号:', zschool_qb_01-zschool,
/ '学校名称:', zschool_qb_01-zsname,
/ '学校地址:', zschool_qb_01-zadd.
ELSE."不成功
"消息
MESSAGE i003 WITH '该学校信息不完善!'.
ENDIF.
ELSEIF
lv_field = 'GS_TOTAL-ZCODE'
OR lv_field = 'GS_TOTAL-ZNAME'
OR lv_field = 'GS_TOTAL-SEX'
OR lv_field = 'GS_TOTAL-WEIGHT'.
SELECT SINGLE *
FROM ZSTUDENT_qb_02
"INTO ... 默认取到table语句结构体中
WHERE zcode = lv_value
OR zname = lv_value.
"取数是否成功
IF sy-subrc = 0."成功
"显示学生的详细信息
WRITE: / '学生编号:', zstudent_qb_02-zcode,
/ '学生姓名:', zstudent_qb_02-zname,
/ '学生体重:', (5) zstudent_qb_02-weight,'KG',
/ '学生性别:', zstudent_qb_02-sex.
ELSE."不成功
"消息
MESSAGE i003 WITH '不存在可用信息'.
ENDIF.
ENDIF.
初始化事件
LOAD-OF-PROGRAM
用于执行程序加载
当执行一个1类型(可执行程序),M类型(Module Pool),F类型(Function Group),S类型 (Subroutine Pool)程序时,SAP系统自动将程序加载至内存中时,自动调用这个事件
默认执行,不需coding,执行完毕后执行INITIALIZATION