ABAP获取随机数

方法一:

DATA:my_value TYPE i,
     my_seed type i.

CALL FUNCTION 'QF05_RANDOM_INTEGER'
 EXPORTING
   RAN_INT_MAX         = 11"随便写一个
   RAN_INT_MIN         = 1
 IMPORTING
   RAN_INT             = my_seed
 EXCEPTIONS
   INVALID_INPUT       = 1
   OTHERS              = 2.
IF sy-subrc <> 0.
ENDIF.
"只写一个call得到的随机数每次都是一样的,要写两次.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
 EXPORTING
   RAN_INT_MAX         = 100 "随机数范围:到
   RAN_INT_MIN         = 1   "随机数范围:从
 IMPORTING
   RAN_INT             = my_value
 EXCEPTIONS
   INVALID_INPUT       = 1
   OTHERS              = 
<think>我们正在讨论的是ABAP中如何获取当前屏幕信息。根据引用[4],在ABAP选择屏幕中,我们可以使用系统变量`SY-DYNNR`来获取当前屏幕的编号,使用`SY-UCOMM`来获取用户在当前屏幕执行的功能码(如回车、执行等)。此外,在屏幕事件(如`AT SELECTION-SCREEN`)中,我们可以根据这些变量来判断当前所处的屏幕以及用户的操作。 但是,用户的问题是如何获取当前屏幕信息,这包括屏幕编号、屏幕字段值、用户操作等。下面我们将详细说明: ### 1. **获取当前屏幕编号** - 使用系统变量`SY-DYNNR`,它存储当前屏幕的编号。例如,选择屏幕的标准屏幕编号是`1000`,而自定义选择屏幕的编号则是在定义时指定的(如引用[4]中的`700`)。 ### 2. **获取用户操作(功能码)** - 使用系统变量`SY-UCOMM`,它存储用户触发的功能码。例如,在选择屏幕上按执行按钮,`SY-UCOMM`的值会是`'ONLI'`(执行)或自定义的功能码(如引用[4]中的`'CRET'`)。 ### 3. **获取选择屏幕的输入值** - 在选择屏幕中,我们通常使用`PARAMETERS`和`SELECT-OPTIONS`定义的变量。这些变量在程序中是全局的,因此可以直接在程序中使用。 ### 4. **在普通屏幕(非选择屏幕)中获取屏幕信息** - 如果是在普通屏幕(通过Screen Painter创建的屏幕)中,我们可以使用`MODULE ... OUTPUT`和`MODULE ... INPUT`来处理屏幕输出和输入。在屏幕流逻辑中,我们可以使用`FIELD`语句和`CHAIN`语句来获取字段的值,并通过`SY-DYNNR`获取屏幕编号,`SY-UCOMM`获取功能码。 ### 5. **获取屏幕字段的值** - 在屏幕处理中,我们可以使用`MODULE ... INPUT`模块来响应用户输入。在模块中,我们可以直接访问屏幕字段绑定的全局变量。另外,也可以使用`DYNP_VALUES_READ`函数来读取屏幕字段的值。 ### 示例代码 #### 示例1:在选择屏幕中获取屏幕编号和功能码 在`AT SELECTION-SCREEN`事件中: ```abap AT SELECTION-SCREEN. " 获取当前屏幕编号和功能码 DATA(lv_dynnr) = sy-dynnr. DATA(lv_ucomm) = sy-ucomm. " 根据屏幕编号和功能码执行不同操作 CASE lv_dynnr. WHEN '1000'. " 标准选择屏幕 IF lv_ucomm = 'ONLI'. " 执行 " 执行数据处理 ENDIF. WHEN '700'. " 自定义选择屏幕 IF lv_ucomm = 'CRET'. " 自定义执行按钮 " 执行自定义操作 ENDIF. ENDCASE. ``` #### 示例2:在普通屏幕中获取屏幕字段值 假设我们有一个屏幕字段`P_FIELD1`绑定到全局变量`gv_field1`。在屏幕的PBO(Process Before Output)和PAI(Process After Input)模块中,我们可以直接使用`gv_field1`来访问字段值。 在PAI模块中: ```abap MODULE user_command_9000 INPUT. CASE sy-ucomm. WHEN 'SAVE'. " 保存屏幕字段的值 DATA(lv_value) = gv_field1. " ... 其他操作 WHEN 'BACK'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. ``` #### 示例3:使用函数读取屏幕字段值 如果我们需要在程序的其他地方(不在屏幕事件中)读取屏幕字段的值,可以使用函数`DYNP_VALUES_READ`: ```abap DATA: lt_dynp_fields TYPE TABLE OF dynpread, ls_dynp_fields LIKE LINE OF lt_dynp_fields. " 设置要读取的字段 ls_dynp_fields-fieldname = 'P_FIELD1'. APPEND ls_dynp_fields TO lt_dynp_fields. " 读取当前屏幕字段的值 CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-repid " 程序名 dynumb = sy-dynnr " 屏幕编号 TABLES dynpfields = lt_dynp_fields EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 invalid_parameter = 7 undefind_error = 8 double_conversion = 9 stepl_not_found = 10 OTHERS = 11. IF sy-subrc = 0. READ TABLE lt_dynp_fields INTO ls_dynp_fields INDEX 1. IF sy-subrc = 0. " 获取字段值 DATA(lv_field_value) = ls_dynp_fields-fieldvalue. ENDIF. ENDIF. ``` ### 总结 在ABAP获取当前屏幕信息主要依靠: - 系统变量:`SY-DYNNR`(当前屏幕编号)、`SY-UCOMM`(用户操作功能码) - 直接访问绑定到屏幕字段的全局变量 - 使用函数`DYNP_VALUES_READ`读取屏幕字段值(适用于动态读取) ### 相关问题 1. 如何获取ABAP选择屏幕中用户输入的选择条件值? 2. 在ABAP中如何创建自定义屏幕并获取用户输入? 3. 如何动态修改ABAP屏幕字段的值?</think>### ABAP 获取当前屏幕信息的方法ABAP获取当前屏幕信息主要通过系统变量和特定函数实现,以下是核心方法: #### 1. **关键系统变量** | 变量名 | 描述 | 示例值 | |--------------|--------------------------|-------------| | `SY-DYNNR` | 当前屏幕编号 | `1000` | | `SY-UCOMM` | 用户操作的功能码 | `'ONLI'` (执行) | | `SY-TCODE` | 当前事务码 | `'VA01'` | | `SY-CPROG` | 当前主程序名 | `'ZREPORT'` | **使用示例**: ```abap DATA(lv_current_screen) = sy-dynnr. " 获取当前屏幕编号 DATA(lv_user_action) = sy-ucomm. " 获取用户操作 ``` #### 2. **获取屏幕字段值** 使用函数 `DYNP_VALUES_READ` 读取屏幕字段值: ```abap DATA: lt_fields TYPE TABLE OF dynpread, ls_field TYPE dynpread. " 设置要读取的字段名 ls_field-fieldname = 'P_MATNR'. " 屏幕字段名 APPEND ls_field TO lt_fields. " 读取当前屏幕字段值 CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-cprog " 程序名 dynumb = sy-dynnr " 屏幕编号 TABLES dynpfields = lt_fields. " 获取字段值 IF lt_fields IS NOT INITIAL. DATA(lv_matnr) = lt_fields[ 1 ]-fieldvalue. ENDIF. ``` #### 3. **在屏幕事件中获取信息** 在屏幕事件处理块中直接访问系统变量: ```abap AT SELECTION-SCREEN. CASE sy-dynnr. " 根据屏幕编号处理 WHEN '1000'. IF sy-ucomm = 'ONLI'. " 执行按钮 PERFORM process_data. ENDIF. WHEN '2000'. " 处理其他屏幕... ENDCASE. ``` #### 4. **获取屏幕元素属性** 使用 `DYNP_GET_VALUE` 函数获取动态属性: ```abap DATA: lv_value TYPE char50. CALL FUNCTION 'DYNP_GET_VALUE' EXPORTING fieldname = 'S_BUKRS' " 选择范围字段 dynonr = sy-dynnr IMPORTING value = lv_value. ``` #### 5. **调试技巧** 在调试器中查看关键信息: 1. 在事务码 `SE38` 或 `SE80` 中设置断点 2. 查看系统变量: - `SY-DYNNR`:当前屏幕号 - `SY-UCOMM`:最后执行的功能码 - `SY-TCODE`:当前事务码 3. 使用 `/h` 命令启动调试模式 > **注意**:选择屏幕的标准屏幕号是 `1000`[^1],自定义屏幕号在 `SELECTION-SCREEN BEGIN OF SCREEN...` 中定义[^4]。 --- ### 相关问题 1. 如何动态修改 ABAP 屏幕字段的属性? 2. 在 ABAP 中如何捕获用户按下的功能键(如 F1、F4)? 3. 如何实现 ABAP 屏幕之间的数据传递? 4. 选择屏幕(SELECTION-SCREEN)与普通屏幕(SCREEN 1000)有何区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值