- 程序名:ZABAP1903_07screen_selection
- 主界面
*&---------------------------------------------------------------------*
*& Report ZABAP1903_07SCREEN_SELECTION
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZABAP1903_07SCREEN_SELECTION NO STANDARD PAGE HEADING
LINE-COUNT 8
LINE-SIZE 90.
INCLUDE ZHQ_01_02TOP. "top include
INCLUDE ZHQ_01_02FORM. "form include
*&---------------------------------------------------------------------*
*& EVENT 初始化界面Initialization
*&---------------------------------------------------------------------*
INITIALIZATION.
GV_NAME = '待檢查…'. "zcode后面提示的內(nèi)容添加初始值
*&---------------------------------------------------------------------*
*& EVENT SELECTION SCREEN EVENT
*&---------------------------------------------------------------------*
* PBO,PAI 是屏幕中的兩個模塊
*PBO是在屏幕事件發(fā)生前處理的邏輯 PAI就是在屏幕事件發(fā)生后處理的邏輯
AT SELECTION-SCREEN OUTPUT. "PBO = Process before output 選擇界面的pbo事件
PERFORM MODIFIED_SCREEN.
AT SELECTION-SCREEN . "PAI = Process after input 選擇界面的pai事件
PERFORM SELECTION_SCREEN_PAI.
*&---------------------------------------------------------------------*
*& event start of selection
*&---------------------------------------------------------------------*
START-OF-SELECTION.
"屏幕代碼一般不能使用代碼塊
PERFORM GET_DATA.
*&---------- -----------------------------------------------------------*
*& event end of selection
*&---------------------------------------------------------------------*
END-OF-SELECTION.
*定義完之后在程序中使用 菜單,執(zhí)行見效果
SET PF-STATUS 'STATUS' EXCLUDING GT_STATUS. "按鈕的創(chuàng)建
SET TITLEBAR 'TITLE' WITH '學(xué)生' '如下:'. "修改程序描述,將參數(shù)‘學(xué)生’傳給title里面的變量&1 ,各個參數(shù)用空格隔開
* PERFORM DISPLAY_DATA.
IF GT_TOTLE IS NOT INITIAL.
PERFORM DISPLAY_DATA.
ELSE.
MESSAGE S001(PD) DISPLAY LIKE 'E'.
ENDIF.
*&---------- -----------------------------------------------------------*
*& event top of page
*&---------------------------------------------------------------------*
TOP-OF-PAGE. "給report添加后綴LINE-COUNT 10之后,給每個模塊都填表頭的方法。
PERFORM TOP-OF-PAGE.
*&---------- -----------------------------------------------------------*
*& event line selection
*&---------------------------------------------------------------------*
AT LINE-SELECTION. "雙擊事件
PERFORM LINE_SELECT.
*&---------- -----------------------------------------------------------*
*& event top of page of line selection
*&---------------------------------------------------------------------*
*初級表單:TOP-OF-PAGE
*次級表單:TOP-OF-PAGE DURING LINE-SELECTION
TOP-OF-PAGE DURING LINE-SELECTION.
CASE SY-UCOMM.
WHEN 'SORTUP' OR 'SORTDOWN'.
PERFORM TOP-OF-PAGE.
WHEN OTHERS.
FORMAT COLOR 3 ON. "背景顏色: 給表頭添加顏色 取值范圍 1~7
WRITE:/ '學(xué)校信息'.
FORMAT COLOR 2 OFF.
ENDCASE.
*&---------- -----------------------------------------------------------*
*& event user ccommand 按鈕功能實現(xiàn)
*&---------------------------------------------------------------------*
AT USER-COMMAND.
PERFORM USER_COMMAND.
TABLES: ZSTUDENT_LPJ_01,ZSCHOOL_LPJ_01.
TYPES: BEGIN OF GTY_TOTLE,
ZCODE TYPE ZSTUDENT_LPJ_01-ZCODE,
ZNAME TYPE ZSTUDENT_LPJ_01-ZNAME,
SEX TYPE ZSTUDENT_LPJ_01-SEX,
ZSCHOOL TYPE ZSTUDENT_LPJ_01-ZSCHOOL,
ZSNAME TYPE ZSCHOOL_LPJ_01-ZSNAME,
END OF GTY_TOTLE.
"合計數(shù)據(jù)
DATA: GT_TOTLE TYPE TABLE OF GTY_TOTLE,
GS_TOTLE TYPE GTY_TOTLE,
"學(xué)校表
GT_SCHOOL TYPE TABLE OF ZSCHOOL_LPJ_01,
GS_SCHOOL TYPE ZSCHOOL_LPJ_01,
"學(xué)生表
GT_STUDENT TYPE TABLE OF ZSTUDENT_LPJ_01,
GS_STUDENT TYPE ZSTUDENT_LPJ_01.
*隱藏按鈕
DATA: GT_STATUS LIKE TABLE OF SY-UCOMM WITH HEADER LINE. "聲明內(nèi)表 SY-UCOMM是一個對象,用like
*&---------------------------------------------------------------------*
*& 選擇界面
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-T01. "必須是text 后面必須是三位
*單選框 p_zcode:變量; OBLIGATORY: 將單選框設(shè)置為必輸項
*PARAMETERS: p_zcode LIKE gs_student-zcode OBLIGATORY DEFAULT '123'. "參照結(jié)構(gòu)體里面的字段
"將單選框設(shè)置成雙選框(用雙選框的SELECT-OPTIONS…for…),NO-EXTENSION:再隱藏雙選框后面的按鈕;no INTERVALS:隱藏按鈕前面的框
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT (10) TEXT-T06 FOR FIELD P_ZCODE. "加了FOR FIELD commment 和 p_zcode 就會有下劃線連接起來。
SELECTION-SCREEN: POSITION 30.
SELECT-OPTIONS: P_ZCODE FOR GS_STUDENT-ZCODE NO-EXTENSION NO INTERVALS.
SELECTION-SCREEN: POSITION 51.
SELECTION-SCREEN: COMMENT (10) GV_NAME. "輸入p_zcode后,在后面顯示內(nèi)容
SELECTION-SCREEN: END OF LINE.
*復(fù)選框 s_zname:內(nèi)表 select-options的四個字段:sign,option,low,high
SELECT-OPTIONS: S_ZNAME FOR GS_STUDENT-ZNAME.
*select-options: s_zname for gs_student-zname default 'abc' to 'def' sign e option bt. "DEFAULT:默認值 ,從'abc'到'def',SIGN E:不包含,OPTION BT:前后欄的關(guān)系是范圍
SELECT-OPTIONS: S_ZSCHL FOR GS_SCHOOL-ZSCHOOL.
SELECTION-SCREEN END OF BLOCK BK1.
SELECTION-SCREEN SKIP 2. "上下塊之間的距離
SELECTION-SCREEN BEGIN OF BLOCK BK2 WITH FRAME TITLE TEXT-T02.
*SELECTION-SCREEN BEGIN OF LINE. "行 加行之后,只有按鈕,沒有文本,所以需要重新加文本
*RADIOBUTTON GROUP:默認char類型,長度為1,選中為X,不選為空
PARAMETERS: R_MALE RADIOBUTTON GROUP RG01. "單選框 男
*SELECTION-SCREEN COMMENT (10) text-t04 FOR FIELD r_male. "重新加文本 ,comment 與長度之間必須有空格
*SELECTION-SCREEN POSITION 20. "兩個按鈕之間的距離,是從最左邊開始的20個長度是第二個按鈕
PARAMETERS: R_FEMALE RADIOBUTTON GROUP RG01. "單選框 女
*SELECTION-SCREEN COMMENT (10) text-t05 FOR FIELD r_female. "重新加文本
*SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BK2.
SELECTION-SCREEN SKIP 2. "上下塊之間的距離
"char 1,選中為X,不選為空 。 command:命令,指揮,指令
PARAMETERS P_CHECK AS CHECKBOX USER-COMMAND HIDE.
" hide:function code(功能代碼) 的名稱(自己取名),實現(xiàn)什么樣的功能,用名稱進一步去實現(xiàn)。此處是實現(xiàn)隱藏,選中復(fù)選框不需要回車就可以隱藏/顯示。
*將復(fù)選框變成復(fù)選功能,帶有功能的按鈕
SELECTION-SCREEN ULINE. "橫線
SELECTION-SCREEN BEGIN OF BLOCK BK3 WITH FRAME TITLE TEXT-T03.
PARAMETERS: SD RADIOBUTTON GROUP GR02 MODIF ID DEP,
MM RADIOBUTTON GROUP GR02 MODIF ID DEP,
PP RADIOBUTTON GROUP GR02 MODIF ID DEP,
FI RADIOBUTTON GROUP GR02 MODIF ID DEP,
CO RADIOBUTTON GROUP GR02 MODIF ID DEP.
SELECTION-SCREEN END OF BLOCK BK3.
*&---------------------------------------------------------------------*
*& Include ZHQ_01_02FORM
*&---------------------------------------------------------------------*
"一小時零九分鐘
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& 取數(shù)及輸出
*&---------------------------------------------------------------------*
FORM GET_DATA.
RANGES R_SEX FOR GS_STUDENT-SEX. "ranges跟select-option的結(jié)構(gòu)一樣,但是在界面不產(chǎn)生控件,只是一個單獨的內(nèi)表
*根據(jù)選擇界面給range賦值 select-options的四個字段:sign,option,low,high
CLEAR: R_SEX,R_SEX[].
IF R_MALE = 'X'. "選擇性別為男
R_SEX-SIGN = 'I'. " I 代表include ; E代表的是exclude。
R_SEX-OPTION = 'EQ'.
R_SEX-LOW = 'M'.
APPEND R_SEX.
ELSE.
R_SEX-SIGN = 'I'. "選擇性別為女 elseif R_FEMALE = 'X'.
R_SEX-OPTION = 'EQ'.
R_SEX-LOW = 'F'.
APPEND R_SEX.
ENDIF.
* select多條取數(shù)——>into table 多表取數(shù)據(jù)
* 多表取數(shù):1. inner join ;2. left outer join;3. 多表sselect
* 1. inner join
* SELECT
* A~ZCODE A~ZNAME A~SEX B~ZSCHOOL B~ZSNAME
* FROM
* ZSTUDENT_LPJ_01 AS A INNER JOIN ZSCHOOL_LPJ_01 AS B
* ON A~ZSCHOOL = B~ZSCHOOL "join 的條件用ON,連接兩張表的條件(外鍵)
* INTO CORRESPONDING FIELDS OF TABLE GT_TOTLE
* WHERE
* A~ZSCHOOL IN S_ZSCHL AND A~ZCODE IN P_ZCODE AND A~ZNAME IN S_ZNAME.
*2. LEFT OUTER JOIN :左外聯(lián)合,左外連接;
*SELECT
* A~ZCODE A~ZNAME A~SEX B~ZSCHOOL B~ZSNAME
* FROM
* ZSTUDENT_LPJ_01 AS A LEFT OUTER JOIN ZSCHOOL_LPJ_01 AS B
* ON A~ZSCHOOL = B~ZSCHOOL "ON 條件下必須包含右表 where 條件下必須不包含右表
* INTO CORRESPONDING FIELDS OF TABLE GT_TOTLE
* WHERE "where 條件下必須不包含右表
* A~ZSCHOOL IN S_ZSCHL AND A~ZCODE IN P_ZCODE AND A~ZNAME IN S_ZNAME.
*3. 多表select
SELECT ZCODE ZNAME SEX ZSCHOOL
FROM ZSTUDENT_LPJ_01
INTO CORRESPONDING FIELDS OF TABLE GT_STUDENT
WHERE ZCODE IN P_ZCODE
AND ZNAME IN S_ZNAME
AND ZSCHOOL IN S_ZSCHL
AND SEX IN R_SEX.
* FOR ALL ENTRIES IN 只要有這個語句,必須檢查(下面if語句) : 條件一
IF GT_STUDENT IS NOT INITIAL. "如果gt_student中有數(shù)據(jù),才會執(zhí)行下面語句 ,下面一條注釋
* range表限制學(xué)校代碼的取數(shù)()
* LOOP AT gt_student INTO gs_student.
* CLEAR r_school.
* r_school-sign = 'I'.
* R_SCHOOL-OPTION = 'EQ'.
* R_SCHOOL-LOW = GS_STUDENT-ZSCHOOL. "RANGE 只能用一個字段來賦值,聯(lián)合字段不行(一個外鍵)
* APPEND R_SCHOOL.
* ENDLOOP.
SELECT ZSCHOOL ZSNAME
FROM ZSCHOOL_LPJ_01
INTO CORRESPONDING FIELDS OF TABLE GT_SCHOOL
FOR ALL ENTRIES IN GT_STUDENT "FOR ALL ENTRIES IN: 所有項目 如果gt_school內(nèi)表中沒有數(shù)據(jù)時,將會取數(shù)據(jù)庫中的所有數(shù)據(jù)
WHERE ZSCHOOL = GT_STUDENT-ZSCHOOL . " 條件二: 兩個表的關(guān)聯(lián)字段(類型,長度必須相同) 基本限制
SORT GT_SCHOOL BY ZSCHOOL. "*使用二分法搜索,先對zschool進行排序 從那個表讀的哪個字段,就對哪個表的哪個字段進行排序
ENDIF.
LOOP AT GT_STUDENT INTO GS_STUDENT.
CLEAR GS_TOTLE. "先清空
MOVE-CORRESPONDING GS_STUDENT TO GS_TOTLE.
READ TABLE GT_SCHOOL INTO GS_SCHOOL WITH KEY ZSCHOOL = GS_TOTLE-ZSCHOOL BINARY SEARCH. "BINARY SEARCH: 二分查找 read中使用二分法查找很快
IF SY-SUBRC = 0. "讀取到
GS_TOTLE-ZSNAME = GS_SCHOOL-ZSNAME.
ELSE. "讀取失敗
CONTINUE. "終止當前循環(huán)并執(zhí)行下一次循環(huán)
ENDIF.
APPEND GS_TOTLE TO GT_TOTLE. "把totle里面的數(shù)據(jù)放回內(nèi)表
ENDLOOP.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DISPLAY_DATA .
* WRITE:/1(56) SY-ULINE. "添加表頭
* WRITE:/1 SY-VLINE NO-GAP, (10) '學(xué)號' NO-GAP CENTERED, "centered居中
* SY-VLINE NO-GAP, (10) '姓名' NO-GAP CENTERED,
* SY-VLINE NO-GAP, (10) '性別' NO-GAP CENTERED,
* SY-VLINE NO-GAP, (10) '學(xué)校' NO-GAP CENTERED,
* SY-VLINE NO-GAP, (10) '校名' NO-GAP CENTERED,
* SY-VLINE.
* WRITE:/1(56) SY-ULINE. "循環(huán)外畫一條橫線,從第一列開始畫,并制定其長度
LOOP AT GT_TOTLE INTO GS_TOTLE.
* 橫線:sy-uline 豎線:sy-vline,.。.
WRITE:/1 SY-VLINE NO-GAP, (10) GS_TOTLE-ZCODE NO-GAP CENTERED,
SY-VLINE NO-GAP, (10) GS_TOTLE-ZNAME NO-GAP CENTERED,
SY-VLINE NO-GAP, (10) GS_TOTLE-SEX NO-GAP CENTERED,
SY-VLINE NO-GAP, (10) GS_TOTLE-ZSCHOOL NO-GAP CENTERED,
SY-VLINE NO-GAP, (10) GS_TOTLE-ZSNAME NO-GAP CENTERED,
SY-VLINE.
WRITE:/1(56) SY-ULINE. "每一條數(shù)據(jù)循環(huán)完畫一條橫線
ENDLOOP.
ENDFORM. " DISPLAY_DATA
*&---------------------------------------------------------------------*
*& Form MODIFIED_SCREEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM MODIFIED_SCREEN.
LOOP AT SCREEN.
IF P_CHECK = 'X'.
"顯示
ELSE.
"隱藏
* IF screen-name = 'SD' or "通過變量名來隱藏多個 "注意大小寫,小寫在屏幕上不識別,會自動轉(zhuǎn)換成大寫
* screen-name = 'PP' or
* screen-name = 'MM'.
IF SCREEN-GROUP1 = 'DEP'. "通過用 (MODIF ID 組名)定義組來實現(xiàn)的
SCREEN-INVISIBLE = 1. "1:true 0:false
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " MODIFIED_SCREEN
*&---------------------------------------------------------------------*
*& Form SELECTION_SCREEN_PAI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SELECTION_SCREEN_PAI.
SELECT SINGLE *
FROM ZSTUDENT_LPJ_01
INTO CORRESPONDING FIELDS OF GS_STUDENT "當是結(jié)構(gòu)體的時候不需要table關(guān)鍵字,是表的時候需要。對比99行和21行
WHERE ZCODE IN P_ZCODE.
IF SY-SUBRC = 0.
GV_NAME = '存在'.
MESSAGE S000(HQ) WITH '該學(xué)號存在'.
ELSE.
GV_NAME = '不存在'.
MESSAGE S000(HQ) WITH '該學(xué)號不存在' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM. " SELECTION_SCREEN_PAI
*&---------------------------------------------------------------------*
*& Form TOP-OF-PAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM TOP-OF-PAGE .
FORMAT COLOR 2 ON. "背景顏色: 給表頭添加顏色 取值范圍 1~7
WRITE:/1(56) '學(xué)生信息表' CENTERED.
FORMAT COLOR 2 OFF.
WRITE:/1(56) SY-ULINE. "添加表頭
FORMAT COLOR 6 INVERSE ON. "INVERSE:字體顏色
WRITE:/1 SY-VLINE NO-GAP, (10) '學(xué)號' NO-GAP CENTERED, "centered居中
SY-VLINE NO-GAP, (10) '姓名' NO-GAP CENTERED,
SY-VLINE NO-GAP, (10) '性別' NO-GAP CENTERED,
SY-VLINE NO-GAP, (10) '學(xué)校' NO-GAP CENTERED,
SY-VLINE NO-GAP, (10) '校名' NO-GAP CENTERED,
SY-VLINE.
WRITE:/1(56) SY-ULINE.
FORMAT COLOR 6 INVERSE OFF.
ENDFORM. " TOP-OF-PAGE
*&---------------------------------------------------------------------*
*& Form LINE_SELECT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM LINE_SELECT .
DATA: LV_FIELD(30),
LV_VALUE(30).
*獲取光標所在的位置
GET CURSOR FIELD LV_FIELD "字段名 gs_totle-zschool
VALUE LV_VALUE. "字段值
"判斷是否是學(xué)校ID字段
CHECK LV_FIELD = 'GS_TOTLE-ZSCHOOL'. "check 注意字符串里面的大小寫
*從學(xué)校表取數(shù)
SELECT SINGLE *
FROM ZSCHOOL_LPJ_01
* into…… "省略此語句,默認取到tables語句的結(jié)構(gòu)體中
WHERE ZSCHOOL = LV_VALUE.
"取數(shù)成功與否
IF SY-SUBRC = 0. "成功
*顯示學(xué)校的詳細信息
WRITE:/ '學(xué)校編號:',ZSCHOOL_LPJ_01-ZSCHOOL,
/ '學(xué)校名稱:',ZSCHOOL_LPJ_01-ZSNAME,
/ '學(xué)校地址:',ZSCHOOL_LPJ_01-ZADD.
ELSE. "不成功
* 消息提示
MESSAGE I000(HQ) WITH '不存在該學(xué)校的信息'.
ENDIF.
ENDFORM. " LINE_SELECT
*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM USER_COMMAND .
*判斷function code 確定點擊的按鈕
CASE SY-UCOMM. "SY-UCOMM:記錄操作
WHEN 'BACK'.
LEAVE TO SCREEN 0. "0 代表上一個
WHEN 'EXIT'OR 'CANCEL'.
LEAVE PROGRAM. "退出程序
WHEN 'SORTUP'.
SY-LSIND = SY-LSIND - 1. "每進行一次排序之后的操作不進行累加(默認累加),后退一步,就可以直接退出執(zhí)行界面,一般只用于排序。
* PERFORM SORT_UP.
* 下面三行代碼是拖進來的拖的子程序是SORT_LIST
PERFORM SORT_LIST
USING
'UP'. "將P_FLAG參數(shù)的值賦為up.up是實參,傳遞給形參P_flag
WHEN 'SORTDOWN'.
SY-LSIND = SY-LSIND - 1.
PERFORM SORT_LIST
USING
'DOWN'. "將P_FLAG的值賦為DOWN.
* PERFORM SORT_DOWN.
WHEN 'DOWNLOAD'.
MESSAGE S000(HQ) WITH '下載成功! '.
WHEN OTHERS.
* ……
ENDCASE.
ENDFORM. " USER_COMMAND
*&---------------------------------------------------------------------*
*& Form SORT_LIST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p_FLAG text
*----------------------------------------------------------------------*
*調(diào)用SORT_LIST子程序,用P_FLAG參數(shù)進行傳遞
FORM SORT_LIST USING P_FLAG. "P_FLAG:形參
DATA: LV_FIELD(30),
LV_FIELDNAME(30).
*獲取光標
GET CURSOR FIELD LV_FIELD. "GS_TOTLE-zcode
*排序
CHECK LV_FIELD+0(8) = 'GS_TOTLE'.
* SPLIT LV_FIELD AT '-' INTO LV_FIELD LV_FIELDNAME.
LV_FIELDNAME = LV_FIELD+9(*). "獲取點擊的字段名
IF P_FLAG = 'UP'.
SORT GT_TOTLE BY (LV_FIELDNAME) ASCENDING.
ELSEIF P_FLAG = 'DOWN'.
SORT GT_TOTLE BY (LV_FIELDNAME) DESCENDING. "加括號表示取此變量的值 當通過zcode字段進行排序的時候,就將zcode賦給變量即可
ENDIF.
*輸出
PERFORM DISPLAY_DATA.
ENDFORM. "SORT_LIST