1、文档说明
在开发中需要验证某SAP用户的账密来执行某些操作。具体就是指,当使用某个操作时,需要输入账号密码进行校验,此校验和登录时的校验是一致的,也具备多次校验错误后的账户锁定。
本文档将通过代码示例,实现账密校验功能
2、实现过程
首先画出用于输入账密的屏幕,下一个Dynpro置空

布局中画上输入框


逻辑流

为了能在屏幕中输错账密后再次输入,可以通过循环输出屏幕,校验通过后退出循环

本实例中还校验了账号维护的全称是否完整

可以通过SU01进行维护

执行效果如下
输入密码回车或点击按钮

错误效果

成功则直接关闭当前屏幕,执行后续操作
3、参考代码
TABLES:rc70d.
DATA:gv_sign_result TYPE char1,
gv_screen_keep TYPE char1. "保持弹框
DATA:r_ucomm LIKE sy-ucomm,
ok_code TYPE sy-ucomm,
save_code TYPE sy-ucomm.
"调用弹框输入密码校验
gv_screen_keep = 'X'.
WHILE gv_screen_keep IS NOT INITIAL.
CALL SCREEN 9000 STARTING AT 10 1.
ENDWHILE.
IF gv_sign_result = 'S'.
MESSAGE '校验成功' TYPE 'S'.
ENDIF.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'PW_ENTER'.
SET TITLEBAR '001'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_9000 OUTPUT.
CLEAR:gv_sign_result.
CLEAR:rc70d-signer,rc70d-password,rc70d-reason_ktxt.
rc70d-signer = sy-uname.
rc70d-sign_reason = 'XX签名'.
SET CURSOR FIELD 'RC70D-PASSWORD'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INPUT_CHECK INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE input_check INPUT.
DATA: l_user_address TYPE addr3_val.
IF ok_code <> 'EESC'.
CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
EXPORTING
user_name = rc70d-signer
IMPORTING
user_address = l_user_address
EXCEPTIONS
user_address_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* User nicht gefunden oder nicht vollständig gepflegt.
CLEAR rc70d-signer.
CLEAR rc70d-password.
CLEAR rc70d-full_name.
* MESSAGE e259(sig) WITH rc70d-signer.
MESSAGE i259(sig) WITH rc70d-signer.
* g_error-user_address_not_found = c_no_user.
SET SCREEN 0.
LEAVE SCREEN.
* EXIT.
ELSE.
IF ( NOT l_user_address-name_first IS INITIAL AND
NOT l_user_address-name_last IS INITIAL ).
CONCATENATE l_user_address-name_last l_user_address-name_first
INTO rc70d-full_name SEPARATED BY space.
ELSE.
* User nicht gefunden oder nicht vollständig gepflegt.
CLEAR rc70d-signer.
CLEAR rc70d-password.
CLEAR rc70d-full_name.
* MESSAGE e257(sig) WITH rc70d-signer.
MESSAGE i257(sig) WITH rc70d-signer.
* g_error-user_address_not_found = c_no_fullname.
SET SCREEN 0.
LEAVE SCREEN.
* EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
DATA: lt_row TYPE lvc_t_row,
lt_roid TYPE lvc_t_roid,
ls_row TYPE lvc_s_row.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
WHEN 'EESC'."设置功能键返回按钮单击事件
CLEAR:gv_screen_keep.
MESSAGE '用户取消操作' TYPE 'S' DISPLAY LIKE 'E'."用户取消操作
LEAVE TO SCREEN 0.
WHEN 'ENT'.
PERFORM frm_check_password.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_PASSWORD
*&---------------------------------------------------------------------*
* text 校验密码
*----------------------------------------------------------------------*
FORM frm_check_password." USING pv_signer TYPE sig_signer
* pv_password TYPE ssfpw
* CHANGING pv_type TYPE char1
* pv_message TYPE char255.
DATA:go_system_signature TYPE REF TO cl_ssft_system_signature.
DATA:lv_signer TYPE sig_signer,
lv_password TYPE ssfpw,
lv_message TYPE char255.
CLEAR:gv_sign_result.
lv_signer = rc70d-signer.
lv_password = rc70d-password.
CREATE OBJECT go_system_signature.
CALL METHOD go_system_signature->if_ssft_system_signature~check_password
EXPORTING
if_signer = lv_signer
if_ask_pwd = '' "不弹出弹框
if_password = lv_password
EXCEPTIONS
canceled_by_user = 1
password_invalid = 2
password_expired = 3
profile_locked = 4
system_error = 5
rfc_error = 6
profile_error = 7
signature_error = 8
OTHERS = 9.
IF sy-subrc NE 0.
* pv_type = 'E'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = lv_password.
MESSAGE lv_password TYPE 'I'."
ELSE.
gv_sign_result = 'S'.
CLEAR:gv_screen_keep."去掉屏幕保持
ENDIF.
ENDFORM.
1307

被折叠的 条评论
为什么被折叠?



