如何實現用戶一登陸SAP即觸發特定程序的運行的說明(二)
作者:袁雲飛(AlbertYuan)- 微信號yuanalbert
以下內容均爲原創,希望對初學者有一些輔助作用,本人主要從事MM/QM/WM的相關工作,不專業處請多多指點,十足乾貨,碼字不易,且行且珍惜,你們的關注就是我努力的動力,轉載請引用出處,感激不盡;
我們在上一篇以及討論過通過標準的一個程序,或者一個函數,就能實現當用戶登錄系統的時候自動執行一個設定好的事務代碼;
這一篇,我們繼續探討實現這個功能的另一個辦法,這個辦法的應用場景可不僅僅只有這一個,如果小夥伴們能腦洞大開,這個辦法可以用來做非常多的功能應用出來;
言歸正傳,我們說的這個方法就是系統爲我們提供的增強SUSR0001;
這個增強裏沒有任何入參,出參,以及表參;其可以在我們登陸系統成功後進行介入;所以我們的設計思路就是,當增強被執行的時候,我們call需要啓動的程序,來完成用戶登錄事務代碼立即啓動的效果;而作爲輔助,我們可以創建一個客製表,裏面存放用戶名和對應的事務代碼,甚至可以設計一個有效期間;這樣當用戶登錄,增強執行的時候,我們先訪問這個客製表,找到是否SY-UNAME的用戶在我們的客製表中存在,並處於有效期,這樣我們就能定製化的讓其執行我們制定的程序;
對於這個增強,我們再拓展延伸一下;比如企業的網絡管理或者域控制比較齊備,我們可以控制,非特定IP或特定IP的用戶能登錄我們的SAP;比如我們創建一個客製表SRVLIST;配置好允許登錄SAP的用戶名和IP地址,以有效期;這樣當授權用戶沒有使用授權IP進行登錄的時候(說白了,用戶移動網絡設置,或不在有效局域網裏);我們可以通過發出錯誤消息,阻止用戶登錄系統;
TABLES: SRVLIST.
SELECT * FROM SRVLIST
WHERE SERVER = SYST-HOST
AND USER = SYST-UNAME.
IF SY-SUBRC <> 0.
MESSAGE E...
ENDIF.
我們的設計思路就類似於上面的這段僞代碼;
當然了隨着科技發展,如果網絡控制技術本身就能實現這些功能,比如VPN相關技術,或多用戶授權系統等等,則就沒有必要使用上面的方法了,比較這個辦法比較“廉價”O(∩_∩)O;
而如何能在用戶登錄的時候得到其對應的比如IP地址,登錄終端名字,比如計算機名等;我們可以使用函數TH_USER_INFO;很簡單吧;
輸入登錄用戶名(這個好獲得吧),對應client,以及是否堅持GUI(就是檢查是否本次登錄是通過SAP GUI客戶端登錄的,還是其他方式比如WEB);
就能輕鬆得到IP地址,計算機名;
我們再拓展一下這個增強,結合上面這個函數,我們還能設計出一個功能,就是鎖定用戶只能同時打開多少個會話窗口;如上圖,函數同時會返回,目前用戶激活的會話數量,以及最大會話數量,如果我們鎖定某些用戶只能同時打開2個,則通過這裏判斷,結合一個客製化表即可完成我所說的功能,小夥伴們可以自行進行試驗;非常簡單的;
其實這個函數的核心代碼如下;
CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE_USR_ATTR
id 'CLIENT' field client
id 'USR' field user
ID 'TERMINAL' FIELD TERMINAL
ID 'TID' FIELD TID
ID 'HOSTADDR' FIELD HOSTADDR
ID 'ACT_SESSIONS' FIELD ACT_SESSIONS
ID 'MAX_SESSIONS' FIELD MAX_SESSIONS
ID 'MY_SESSION' FIELD MY_SESSION
ID 'MY_INTERNAL_SESSION' FIELD MY_INTERNAL_SESSION
ID 'TASK_STATUS' FIELD TASK_STATE
id 'UPD_REC' field update_rec_exist
id 'CHECK_GUI' field check_gui
id 'ADDRSTR' field addrstr.
rc = sy-subrc.
if gui_check_failed is requested.
gui_check_failed = sy-subrc.
endif.
之所以給小夥伴們看這個,就是我們可以也通過另一個方法來實現控制用戶會話窗口的目的(當然也是利用這個增強);有空的小夥伴可以花點時間研究一下,它的設計思路又是怎麼樣的,是否更優秀一些;
TABLES: UINFO.
DATA: N TYPE I VALUE 2. "Upper limit of login sessions
DATA: OPCODE TYPE X VALUE 2, I TYPE I, A(60).
DATA: BEGIN OF BDC_TAB1 OCCURS 5.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDC_TAB1.
DATA: BEGIN OF USR_TABL OCCURS 10.
INCLUDE STRUCTURE UINFO.
DATA: END OF USR_TABL.
* Exclude Limit login by Users
IF SY-UNAME <> 'XXX'
AND SY-UNAME <> 'XXX'.
CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE
ID 'TAB' FIELD USR_TABL-*SYS*.
LOOP AT USR_TABL.
IF SY-UNAME = USR_TABL-BNAME AND SY-MANDT = USR_TABL-MANDT.
I = I + 1.
ENDIF.
ENDLOOP.
IF I >= N.
A = 'You have already '.
A+17(2) = I - 1.
A+19(25) = 'login sessions in client '.
A+44(4) = SY-MANDT.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
TITEL = 'UNSUCCESSFUL LOGIN'
TXT1 = A
TXT2 = 'You are not allowed to log in'.
MOVE: 'SAPMSSY0' TO BDC_TAB1-PROGRAM,
'120' TO BDC_TAB1-DYNPRO,
'X' TO BDC_TAB1-DYNBEGIN.
APPEND BDC_TAB1.CLEAR BDC_TAB1.
MOVE: 'BDC_OKCODE' TO BDC_TAB1-FNAM,
'/nex' TO BDC_TAB1-FVAL.
APPEND BDC_TAB1.CLEAR BDC_TAB1.
CALL TRANSACTION 'SM04' USING BDC_TAB1 MODE 'N'.
ENDIF.
ENDIF.
最後小夥伴們要注意一點就是,SUSR0001這個增強在低版本的ECC系統裏,不僅僅在用戶登錄系統的時候介入,每次用戶進入事務代碼,它都會介入,所以可以用來做一個用戶操作系統的日誌表來用,當然要注意併發和系統負載的問題;但到了S/4,這個增強就僅僅在用戶登錄系統的時候介入了;
以上爲本章全部內容,希望對小夥伴們有所幫助;