魔鬼在細節中:你不一定知道的SAP程序變式和選擇變量

文 | SAP油瓶哥

前言

說起SAP中的變式(Variant),SAP從業者肯定不會陌生,對于選擇屏幕復雜的程序界面,我們可以使用變式來簡化界面(比如隱藏不相關字段),對于經常使用的并且每次都需要輸入相同篩選條件的程序(比如每月都要執行的報表),可以設定和調用變式來簡化操作,此外當我們需要需要設定后臺JOB時,我們也需要為后臺程序指定相應的變式。

本文嘗試為變式相關概念做些總結,并再簡單說下變式中的選擇變量(Selection variables)的用法。

維護變式

當我們新定義一個變式時,我們需要:

進入程序界面,在選擇屏幕輸入選擇條件

點擊保存按鈕進入變式屬性界面

填上變式名字和描述

保存

或者我們也可以通過SE38,填上程序名,選擇子對象變式,點擊顯示或修改按鈕進入變式維護界面。

當我們需要從前臺調用時變式時,只要點擊變式按鈕雙擊想調用的變式即可。

需要注意的是當一個程序的變式數大于10個時,點擊變式按鈕會彈出額外的選擇界面:

這些常規操作,大家應該都非常熟悉,這里我們來看下變式屬性的其他選項,看看他們都有什么作用。

變式屬性

使用屏幕分配 (Use screen assignment)

如果一個程序包含多個選擇屏幕(例如:COOIS),當我們只想編輯某一個選擇屏幕的變式屬性時,可以先在右側勾選選擇屏幕號,然后再點擊使用屏幕分配按鈕,這時下方的窗格就會只顯示對應的選擇屏幕字段,當然SAP中大多數程序還是只有一個選擇屏幕界面,所以這個按鈕用到的情況并不多。

僅用于后臺處理 (Only for Background Processing)

如果勾上了此項,那么變式就不能在前臺被調用了,只能用于后臺JOB。

保護變式 (Protect Variant)

勾選后,該變式其他用戶無法修改。

僅在目錄中顯示 (Only Display in Catalog)

勾選后,點擊變式按鈕不會看見此變式,變式也不會出現在SE38的變式子界面的搜索幫助中,只能在變式目錄中找到此變式。

變式目錄可以在SE38的變式子界面,通過如下菜單位置找到:

僅出現在變式目錄中的變式依然可以被用于定義后臺JOB:

系統變式 (System Variant)

該選項無法手工勾選,當定義新的系統變式或查看系統變式時會自動勾上。

關于系統變式可以分享的幾點如下:

A. 系統變式命名以SAP&或CUS&開頭,SAP&表示SAP原生定義的系統變式,CUS&表示客戶自定義的系統變式

B. 無法為本地程序定義系統變式,否則系統會給出DB248報錯

C. 系統變式不會被覆蓋并且只能由創建者或最后修改者修改

D. 系統變式保存時會觸發自動傳輸(Workbench類型,傳輸對象是 LIMU VARI)

E. 當傳輸程序時,對應的系統變式會一起被傳輸

F. 系統變式不區分Client (not client-specific),系統變式只能從Client 000中調用T類型選擇變量(靜態變量),這個下面會談到。

屏幕字段類型 (Type)

屏幕字段一共有兩種類型,P和S , P表示參數(PARAMETERS),S表示選擇選項(SELECTION-OPTIONS),從前臺界面上來看就會一下子明白。(這里需要說明的是,并不是屏幕上看到單個空格的就一定是P類型,用SELECTION-OPTIONS定義的選擇屏幕也是可以實現單個空格效果的)。

不同類型的屏幕字段也只能調用相應類型的選擇變量,這個下面會談到。

保護字段 (Protect field)

勾選后,當程序調用此變式執行時,字段在前臺選擇屏幕上可見,但不接受用戶輸入,只能在維護變式時錄入。

隱藏字段 (Hide field / Hide field 'TO')

勾選后,當程序調用此變式執行時,字段在前臺選擇屏幕上將不可見,但在維護變式時錄入的值依然有效。

保存無值的字段 (Save field without values)

使用后,系統在保存變式時會不考慮錄入的字段值。

如果該字段與MEMORY ID無關,那么對該字段系統將以空值保存在變式中。

如果該字段與MEMORY ID有關,那么系統在調用變式時該字段值會受到SAP memory中的值和用戶變量的影響,具體三者間的關系,后面會談到。關于MEMORY ID下面也會聊到。

GPA關閉 (Switch GPA off)

這里的GPA指的是SPA/GPA, 即SELECT/GET Parameter ID,也就是用戶參數文件中的SET/GET 參數標識(可以用SU3或SU01維護),Parameter ID(pid)存在表TPARA中。

要討論這個選項,我們需要先說下SAP memory。我們在日常操作中肯定注意過這種現象,就是有時我們進入到一些程序時(注意:不是用變式啟動),會發現有些字段的值已經自動填寫上了,這里其實用到了SAP memory機制。在這種機制下,當一個屏幕被調用時,那些用MEMORY ID語法定義的屏幕字段會去SAP memory中搜尋當前值,并自動填充到屏幕上。SAP memory是與用戶ID綁定的,這種機制提高了用戶的操作體驗。

下面我們先看一個例子,理解下這個自動填充的邏輯:

登錄SAP, 我們在SU3中維護PID WRK = 8000

進入MB51, 會發現工廠字段是自動填寫上8000的

我們手工改為6000 (注意:要按下回車才會進入SAP memory),退出MB51

再次進入MB51,會發現工廠字段默認帶出了6000 (其實進入MB52也會發現工廠字段自動會帶出6000)

我們手工改為空,退出MB51

再次進入MB51,會發現工廠字段默認為空

登出SAP,再次登錄SAP,進入MB51,會發現工廠字段自動帶出了8000

退出MB51,進入SU3修改WRK = 6010

再次進入MB51,會發現工廠字段默認帶出了6010

這里我們就可以明白這個SAP memory的工作原理了,當我們以無變式方式進入一個程序屏幕時,假如A字段用到了MEMORY ID語句關聯了PID,并且沒有在語法中給出默認值,那么當SAP memory中有值時系統會優先調用(注意:包括其他屏幕操作寫入的值、空值和新保存在用戶參數文件中的值),當SAP memory中還沒有值時(比如剛登錄系統,未進行其他操作),系統會去檢查用戶參數文件中有無維護PID,如果有,就調用PID值(包括空值),如果沒有,那么就以初始值顯示(即空值)。

回到GPA關閉這個選項上來,首先這個選項只對使用了MEMORY ID定義的屏幕字段有效,對其他屏幕字段來說這個選項是不可編輯的。如果我們勾選了GPA關閉,那么當我們調用變式時,就不會觸發SAP memory機制。

更詳細的舉例可以參加后面的組合測試部分。

要求的字段 (Required field)

使用后,當程序調用此變式執行時,該字段在選擇屏幕上變為必輸項。

選擇變量 (Selection variable)

選擇變量可以幫助我們更靈活去管理變式,目前SAP支持的選擇變量一共有4種:

靜態變量,即表TVARVC中的值 (類型T)

動態日期計算 (類型D、X)

動態時間計算 (類型Z、Y)

用戶變量 (類型B)

下面我們依次來看下這幾種變量的用法。

T類型選擇變量:表TVARVC中的值

我們可以直接將表TVARVC中定義的值用在變式中,這樣當選擇條件發生小的變更時,就不用每次都去變更已有的變式,只要更新表TVARVC中的靜態變量即可。

T類型選擇變量也可以配合保護字段一起使用。

假如我們每月需要為所有的工廠執行一系列的報表或程序,我們為這些程序創建了變式,并設定了后臺JOB,隨著業務的增長,每當有新的工廠被創建后,我們需要為這一系列程序去修改變式。如果我們在表TVARVC中定義了一個ZPLANT的變量(類型:選擇選項),并將這個變量應用在所有的變式中,這樣當業務環境發生變化時,我們就僅需要去修改ZPLANT這個變量值,這將大大簡化我們的工作量。

關于T類型的選擇變量,其他需要說明的有:

A. T類型選擇變量存儲在表TVARV和TVARVC中,TVARV不區分Client,TVARVC區分Client

B. 自Release 610開始, TVARV 被TVARVC所替代,可以用程序RSTVARVCLIENTDEPENDENT來將 TVARV的值拷貝至TVARVC

C. 事務碼STVARV可以用來維護當前Client的表TVARVC中的值,事務碼STVARVC可以在任一Client維護Client 000的表TVARVC的值。也可以在變式屬性定義界面通過菜單>環境>定義選擇變量進行維護。

D. Client 000中的表TVARVC中的值是給系統變式用的。

E. P類型的屏幕字段可以調用表TVARVC中的參數值,S類型的屏幕字段可以調用表TVARVC中的選擇選項值

F. 因為動態期間計算不能涵蓋所有場景,我們可以根據需要在表TVARVC創建變量,并開發一個程序進行定期更新。

比如事務碼IDCNACCTBLN中的年份和期間這兩個字段不能使用動態計算,我們可以在表TVARVC創建變量ZCURRENT_YEAR(本年)和ZLAST_PERIOD(上月),通過一個自開發程序每月去更新ZCURRENT_PERIOD,每年去更新ZCURRENT_YEAR。

注意:T類型的選擇變量會影響到所有調用它的變式

D、X類型選擇變量:動態日期計算

只有數據類型為DATS的屏幕字段才能使用動態日期計算。D類型動態日期計算使用的是本地日期,X類型使用的是系統日期。

SAP支持的動態日期計算選擇如下:

Z、Y類型選擇變量:動態時間計算

只有數據類型為TIMS的的屏幕字段才能使用動態時間計算。Z類型動態日期計算使用的是本地時間,Y類型使用的是系統時間。

SAP支持的動態時間計算選擇如下:

B類型選擇變量:用戶變量 (User-specific Selection Variables)

最后來看下用戶變量,用戶變量是與用戶ID綁定的選擇變量,如果我們要在變式中使用用戶變量,需要滿足3個條件:

No.1 該屏幕字段用到了MEMORY ID語法關聯到了PID;

No.2 表TUVID 中有相應的PID值;

No.3 已經維護了相應的用戶變量值 (用戶變量存儲在表TVARUVN中)。

當以上條件達到時,我們在維護變式時就可以選擇類型B作為選擇變量,并且系統會自動帶出變量名稱。

維護用戶變量

維護用戶變量的方法有兩種:

一. 通過菜單

A. 在選擇屏幕中,通過菜單>轉到>用戶變量進入維護界面

B. 單擊要維護的PID

C. 眼鏡按鈕會顯示當前的用戶參數值,筆按鈕會進入修改界面,如果點擊獲取,會讀取當前的用戶參數值并填到屏幕字段上

D. 點擊筆后,選擇變量,填上參數值保存即可。(注意:需要點擊刪除才會保存成功,如果選擇保存空,就會以空值保存

E. 點擊筆后,如果點擊選擇屏幕,系統會讀取當前屏幕上的值做出輸入參照

F. 如果要刪除用戶變量值,需要進入修改界面然后將參數值改為空,最后選擇刪除即可

二. 調用功能

用戶變量也可以通過SE37調用功能來修改,相關的功能如下:

VARI_USER_VARS_GET: 讀取現有變量值

VARI_USER_VARS_SET: 修改現有變量值

VARI_USER_VARS_COPY:復制變量值

VARI_USER_VARS_DELETE:刪除變量值

VARI_USER_VARS_RENAME:重命名變量值

VARI_USER_VARS_DIALOG:出現對話框輸入變量值

組合測試

我們可以看到用戶變量和SAP memory都關聯到了PID,那么它們間的關系又是怎樣的呢?我自己花了點時間測試了下保存無值字段,GPA關閉及用戶變量這幾個易混淆的選項,在此也把測試的結果分享給大家,希望大家看過后可以了然于胸。

測試對象:

測試場景:

測試結果:

從上面可以看出,如果不考慮保存無值字段的影響,系統取值時優先級最高的是用戶變量,然后是創建變式時手工錄入的字段值,最后是GPA(SAP memory)

文件鏈接:

https://pan.baidu.com/s/1pF8wXEEIQa3psJnFsrq1AA

密碼: u9cu

后記

本篇緣起年前的一次用戶培訓上,在講到如何設置變式中的動態計算變量時,用戶提到為什么事務碼IDCNACCTBLN中的年度和期間不能設置動態計算,一開始只是想弄清這個,沒曾想寫的過程中覺得,要不看看所有的變式屬性都有什么用,哎,系統變式是啥,以前沒注意過啊,GPA是什么東東?反正不會是大學成績績點,保存無值字段該怎么理解,怎么還有個B類型的選擇變量。。

我覺得我某種程度是有強迫癥的。

以上。

參考資料

1746893 - Dynamic date and time calculation in variant

1994216 - How to maintain variant variables in table TVARVC

557314 - As of Release 610: TVARV replaced with TVARVC

770084 - Maintaining TVARVC in transaction STVARV

372724 - Maintenance of report variants

Dynamic date selection in Variants

Dynamic Dates in Screen Variants

Create SAP Dynamic Variant using Date Calculation

SAP Documentation: Variant Maintenance

SAP Documentation: SPA/GPA Parameters as Default Values

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容