问题:当SAP报表选择界面存在多组,通过RADIOBUTTON GROUP 按钮,来区分多个选择界面时,如果有一个界面上对于条件做了必输,那么如果不输入条件,就点击另一组时是会报错的,同样的,如果界面挂的有前台维护配置表,如果没有输入相应的必输条件就点击,也是会报错XXX字段必输的
解决方法:在定义选择条件时不使用OBLIGATORY,而选择SCREEN-REQUIRED = 2 来控制界面的字段必输
这里如果SCREEN-REQUIRED = 2 则屏幕必输,但是点击其他RADIOBUTTON时不会因为这个而报错,如果使用SCREEN-REQUIRED = 1. 则会报错,而SCREEN-REQUIRED = 0.则表示不控制必输,另外如果必输字段没有输入,就点击执行,SET CURSOR FIELD P_FILE.可以用这个将光标放到指定字段上,并加之报错信息和返回
实现效果如下:
对于界面配置表类型
对于RADIOBUTTON GROUP
代码如下:
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-T01 . PARAMETERS: P_FILE TYPE RLGRAP-FILENAME MODIF ID MD1. SELECT-OPTIONS : S_BUKRS FOR ZTFI027A-BUKRS NO INTERVALS MODIF ID MD2. PARAMETERS: P_GJAHR LIKE ZTFI027A-GJAHR MODIF ID MD2, P_MONAT LIKE ZTFI027A-MONAT MODIF ID MD2. SELECT-OPTIONS: S_VKBUR FOR ZTFI027A-VKBUR MODIF ID MD2, S_ZBRAND FOR ZTFI027A-ZBRAND MODIF ID MD2, S_MATNR FOR ZTFI027A-MATNR MODIF ID MD2, S_ZFYMX FOR ZTFI027A-ZFYMX MODIF ID MD2. PARAMETERS: P_DR RADIOBUTTON GROUP G1 DEFAULT 'X' USER-COMMAND CM1, P_CX RADIOBUTTON GROUP G1 . "导入 "查询 SELECTION-SCREEN END OF BLOCK BK1. SELECTION-SCREEN FUNCTION KEY 1. LOOP AT SCREEN. CASE 'X'. WHEN P_DR . IF SCREEN-GROUP1 = 'MD1'. SCREEN-REQUIRED = 2. "当屏幕组为md1时控制相应字段必输 SCREEN-INVISIBLE = '0'. "控制是否可见 SCREEN-ACTIVE = 1. "控制屏幕字段是否激活 ELSEIF SCREEN-GROUP1 = 'MD2'. IF SCREEN-NAME CS 'S_BUKRS' OR SCREEN-NAME CS 'P_GJAHR' OR SCREEN-NAME CS 'P_MONAT'. SCREEN-REQUIRED = 0. ENDIF. SCREEN-INVISIBLE = '1'. SCREEN-ACTIVE = 0. ENDIF. WHEN P_CX. IF SCREEN-GROUP1 = 'MD1'. SCREEN-REQUIRED = 0. SCREEN-INVISIBLE = '1'. SCREEN-ACTIVE = 0. ELSEIF SCREEN-GROUP1 = 'MD2'. IF SCREEN-NAME CS 'S_BUKRS' OR SCREEN-NAME CS 'P_GJAHR' OR SCREEN-NAME CS 'P_MONAT'. SCREEN-REQUIRED = 2. ENDIF. SCREEN-INVISIBLE = '0'. SCREEN-ACTIVE = 1. ENDIF. WHEN OTHERS. ENDCASE. MODIFY SCREEN. ENDLOOP. CASE 'X'. WHEN P_DR. IF P_FILE IS INITIAL. "上传文件必输 SET CURSOR FIELD P_FILE. "如果屏幕这个字段是空的,则将鼠标光标放置到这个字段框上 MESSAGE S008(ZFICO_001) DISPLAY LIKE 'E'. "返回报错信息 LEAVE LIST-PROCESSING. ENDIF. WHEN P_CX. IF S_BUKRS IS INITIAL. SET CURSOR FIELD S_BUKRS. MESSAGE S010(ZFICO_001) DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ELSEIF P_GJAHR IS INITIAL . SET CURSOR FIELD P_GJAHR. MESSAGE S011(ZFICO_001) DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ELSEIF P_MONAT IS INITIAL. SET CURSOR FIELD P_MONAT. MESSAGE S012(ZFICO_001) DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. WHEN OTHERS. ENDCASE.