ABAP制作密码输入框

 

  这几天做一个系统维护的程序,需要用户输入用户名和密码登录。可怎样实现输入密码显示星号的框呢?在其它语言中简单的选那个文本框控件作为 “Password”框显示就OK了(一般会有单行、密码和多行供选)。可在ABAP中,把I/O字段属性查了个遍,没找见类似的属性,郁闷!

网上一搜,前人已经实现了。一看,更郁闷!居然是设置“不可见”属性!!(原以为选上他控件会消失呢!)写在这里,留个备份,也给需要的朋友作个参考。

下面分别介绍不同界面编程的具体实现方法:

(1)选择屏幕(Selection-Screen)中实现密码框:

假设选择屏幕中有如下声明:

PARAMETERS: txt_pass type string.

“txt_pass“是要接收密码的字段,则在选择屏幕的输出事件中加入如下代码,修改这个字段“不可见”:

AT SELECTION-SCREEN OUTPUT. 
loop at screen.
    if screen-name = 'TXT_PASS'.
      screen-invisible = '1'.
      modify screen.
    endif.
  endloop.

经过上面修改,txt_pass在界面上将显示成带星号的文本域。

(2)在屏幕(Screen)中实现密码框:

与选择屏幕上面一样,还是设置“不可见”属性,只是更简单(不用写代码了)。

假设在屏幕设计器上放了个名叫“txt_pass”的I/O域来接收密码输入,则双击这个字段,在属性窗口下面的“显示”页勾选“不可见”(如右图所示),激活,OK!

总结:

(1)SAP这个属性搞的变态(不过想一下,也有道理);

(2)自己以后可不能想当然了,要注重动手实践。

(3)上面密码数据类型我使用了string,SAP数据字典中还提供了个叫“XUNCODE”的文本元素专门用于密码数据类型,可以使用它。

 

ABAP 生成随机密码有多种方法: #### 方法一:生成动态密码 该方法先创建随机数对象,获取 0 - 99999 之间的随机整数,然后将其与特定字符串拼接成密码并去除空格。 ```abap DATA: cl_random TYPE REF TO cl_random_number, lv_password TYPE bapipwd, lv_sm TYPE string, lv_m TYPE i. CREATE OBJECT cl_random. CALL METHOD cl_random->if_random_number~init. CALL METHOD cl_random->if_random_number~get_random_int EXPORTING i_limit = 99999 RECEIVING r_random = lv_m. lv_sm = lv_m. CONCATENATE 'Xxxx' lv_sm '@' INTO lv_password. CONDENSE lv_password NO-GAPS. ``` #### 方法二:生成随机数字字符串密码 此方法创建随机数对象,获取 0 - 9999999 之间的随机整数作为密码。 ```abap DATA: cl_random TYPE REF TO cl_random_number, m TYPE i. CREATE OBJECT cl_random. CALL METHOD cl_random->if_random_number~init. CALL METHOD cl_random->if_random_number~get_random_int EXPORTING i_limit = 9999999 RECEIVING r_random = m. ``` #### 方法三:使用函数 `GENERAL_GET_RANDOM_STRING` 生成随机大小字母字符串密码 调用该函数,指定生成字符串的长度,获取随机字符串作为密码。 ```abap DATA: snum TYPE string. CALL FUNCTION 'GENERAL_GET_RANDOM_STRING' EXPORTING number_chars = '40' IMPORTING random_string = snum. ``` #### 方法四:使用函数 `RSEC_GENERATE_PASSWORD` 指定字符串集生成随机字符串密码 先定义一个包含各种字符的字符串集,然后调用函数,指定输出长度,生成随机字符串作为密码。 ```abap DATA: l_no(40) TYPE c, l_index TYPE i, albet(80). CLEAR: l_no, l_index. CONCATENATE 'ABCDEFGHJKLMNPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' '123456789~!#$%^&*()[]/\{}' INTO albet. CALL FUNCTION 'RSEC_GENERATE_PASSWORD' EXPORTING alphabet = albet output_length = 40 IMPORTING output = l_no EXCEPTIONS some_error = 1. ``` #### 方法五:使用自定义类生成密码 通过自定义类 `zcl_tools_management` 的 `generate_password` 方法,根据用户输入的参数(密码长度、是否包含大写字母、小写字母、数字、符号)生成密码。 ```abap DATA: lv_tabix TYPE i. PARAMETERS: p_length TYPE i DEFAULT '8'. PARAMETERS: p_upper AS CHECKBOX DEFAULT 'X', p_lower AS CHECKBOX DEFAULT 'X', p_number AS CHECKBOX DEFAULT 'X', p_symbol AS CHECKBOX DEFAULT 'X'. START-OF-SELECTION. DO. DATA(lv_pwd) = zcl_tools_management->generate_password( iv_length = p_length iv_uppercase = p_upper iv_lowercase = p_lower iv_number = p_number iv_symbol = p_symbol ). IF lv_pwd IS NOT INITIAL. lv_tabix += 1. WRITE: / lv_pwd. ENDIF. IF lv_tabix = 5. EXIT. ENDIF. ENDDO. ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值