SAPパーソナルデスクトップ

ここで、これまで示した手法を用いて、より高度な例、すなわち、個人の要求や好みに合わせてSAP関数を2次元的に再配置可能な”SAPパーソナルデスクトップ”を実装したいと思います。

この”パーソナルデスクトップ”は、始めは標準的なレイアウトで表示されます。

左側のボタンを使用して、自分用にカスタマイズされたレイアウトを保存できるため、それ以降は、2種類のレイアウト(標準レイアウトとカスタマイズされたレイアウト)を選択できるようになります。

ここで示す例は既に実用的なものですが、顧客や発注情報などの業務オブジェクトをこのパーソナルデスクトップに追加して、オブジェクトがクリックされたときに目的のトランザクションが開始されるようにすることができます。これを実現するには、いくつかのSAPトランザクションについてGuiXTの”Add to Personal Desktop”(パーソナルデスクトップに追加)ボタンを作成し、ボタンをクリックするだけでユーザーがオブジェクト(発注番号など)を追加できるようにします。

このサンプルを実現するには、以下のものが必要です。

  • ユーザーに提供したいトランザクションおよびInputScriptsのリスト(適切なアイコンを含む)
  • 必要なGuiXTスクリプトおよびVBScript関数

このチュートリアルでは、いくつかのトランザクションを選択し、販促リストを呼び出すInputScriptを1つ選択しました。アイコンは、インターネットで見つけたフリーウェアの画像を使用します(各32×32ピクセルの.gif形式。.jpg形式または.ico形式も使用可能)。

デスクトップ機能は、”menu\icons.txt”および”menu\items.E.txt”の2つのファイルで記述します。ここで、Eは言語キーです。これらのファイルをスクリプトディレクトリに保存します。

書式:

“icons.txt”: アイコンのIDで始まり、ファイル名(GuiXTスクリプトディレクトリへの絶対パスまたは相対パス)がその後ろに続きます。区切り文字はセミコロンです。

“items.E.txt”: トランザクションコードで始まります。オプションとして、その後ろにInputScriptの呼び出しを記述できます。その後ろに、項目ラベルとアイコンIDが続きます。

今回の例では以下のファイルを使用します。

// icons for SAP Personal Desktop
cust1;menu\icons\customer.gif
cust2;menu\icons\customer_change.gif
cust3;menu\icons\customer_display.gif
order1;menu\icons\order.gif
order2;menu\icons\order_change.gif
order3;menu\icons\order_display.gif
room;menu\icons\room.gif
prom1;menu\icons\promotions.gif

// Items for SAP Personal Desktop English version
XD01; Create customer; cust1
XD02; Change customer; cust2
XD03; Display customer; cust3

VA01; Create order; order1
VA02; Change order; order2
VA03; Display order; order3

// Promotions
SA38,process=promotions.txt; Promotions list; prom1

// Rooms and Meetings
PP30; Room reservation; room

2次元レイアウトもテキストファイルに保存します。今回は、レイアウトを個人用レイアウトとして保存し、それを標準レイアウトとしてコピーするため、このファイルを手動で作成する必要はありません。

アイコンファイルを含むすべてのファイルは、SAP Webリポジトリに保存できます。

今回の”SAPパーソナルデスクトップ”は、SAP標準のナビゲーションツリーを置き換えます。さらなる拡張として、SAP標準のナビゲーションツリーとパーソナルデスクトップを切り替え可能なボタンを追加することもできます。

GuiXT Scriptにて、”Microsoftコモンコントロール”のリストビューコントロールを再度使用します。スクリプトに含まれる要素については、すべて前のチュートリアルで説明しています。&%[USERPROFILE]を使用して、個人用レイアウトを保存するためのユーザープロファイルフォルダーを指定します。このフォルダーは、Windowsのバージョンに応じて、例えばC:\Documents and Settings\{username}やC:\Users\{username}のようになります。

GuiXT script:

Title “SAP Personal Desktop”

// delete SAP standard menu
del X[IMAGE_CONTAINER]

// special functions
Pushbutton (1,0) “@2L\QSave as personal layout@”process=”menu_save_layout.txt”
Pushbutton (3,0) “@9T\QStandard Layout@”process=“menu_standard_layout.txt”
Pushbutton (5,0) “@42\QRestore personal layout@”process=“menu_personal_layout.txt”

Control (0,6) (50,300) progid=“Comctl.ListViewCtrl”name=“menu_control” initflag=“menu_init”

// initialize if necessary
if V[menu_init=X]

  // copy standard menu files to long texts
 CopyText fromFile=“menu\icons.txt” toText=“menu_icons”
CopyText fromFile=”menu\items.&V[_language].txt”toText=“menu_items”

// create menu
 CallVbs menu_init &V[menu_control]

// set personal or standard layout
CopyText fromFile=“&%[USERPROFILE]\sap_personal_desktop_layout.txt”toText=“menu_layout”

if not Q[ok]
 CopyText fromFile=“menu\layout.txt” toText=“menu_layout”
  endif 

CallVBS set_menu_layout &V[menu_control]

endif

今回の例では、GuiXTロングテキスト変数の”menu”および”menu_layout”に基づきパーソナルデスクトップを作成します。ここで、”menu_layout”には各アイテムの座標が格納されます。このファイルは、ユーザーが”Save as personal layout”(個人用レイアウトとして保存)ボタンを押したときに自動的に生成されます。このファイルが空の場合、リストビューコントロールによって線形レイアウトが使用されます。今回の標準レイアウトの例では、ファイルは以下のようになります(リストビューコントロールは”pixels”ではなく”twips”を使用します)。

XD01;4366;2037
XD02;4313;4948
XD03;4233;7964
VA01;6112;2037
VA02;6033;4921
VA03;5953;7964
SA38,process=promotions.txt;9340;1984
PP30;9181;5054

VBScriptにおいて、シンボルとともに各アイテムを作成します。そして、このコントロールのイベント処理(ダブルクリック)を定義します。関数”set_menu_layout”は、各要素を指定された位置に移動します。

‘ ———————————————
‘       SAP Personal Desktop                   ’
‘                                              ’ 
‘ ——————————————— 

Sub menu_init(mv)

‘ for VbsEdit only to use context sensitive help 
If IsEmpty(mv) Then
Set mv = CreateObject(“ComCtl.ListViewCtrl”)
End If 

mv.View = 0    ‘ 0 = lvwIcon = icons (MS docu) 

‘ no label editing
mv.LabelEdit = 1  ‘ manual

‘ font
mv.Font.Name = ”Arial”
mv.Font.Size = 10

 ’ color
mv.BackColor = RGB(255,255,255)
mv.ForeColor = RGB(50,60,90)

‘ Icons
Dim imgList
Set imgList = guixt.CreateObject(“ComCtl.ImageListCtrl”)

imgList.ListImages.Clear()
imgList.ImageHeight = 32
imgList.ImageWidth = 32
imgList.MaskColor = RGB(255,255,255)

    ’ parameters in menu line
Dim params

‘ read menu
Dim icons
icons = Split(guixt.GetText(“menu_icons”), vbCrLf)

‘ create icons
For Each line In icons

If Not line = ”” And Not Mid(Trim(line),1,2) = ”//” Then

params = Split(Trim(line), ”;”)

Dim imagepath
imagepath = guixt.FilePath(Trim(params(1)))

Call imgList.ListImages.Add(1, Trim(params(0)), LoadPicture(imagepath))

End If  
    Next
    
    
    Set mv.Icons = imgList

‘ read menu items
Dim items
items = Split(guixt.GetText(“menu_items”), vbCrLf)

Dim itm

‘ create items
For Each line In items

If Not line = ”” And Not Mid(Trim(line),1,2) = ”//” Then

params = Split(Trim(line), ”;”)

‘ create new list view item
Set itm = mv.ListItems.Add()

itm.Tag =   Trim(params(0))
itm.Text =  Trim(params(1))

If Not params(2) = ”” Then
itm.Icon =  Trim(params(2))
End If  
            
        End If  
    Next

‘ handle  events
Set e = New menu_events
Set e.mv = mv
Call guixt.SetEventHandler(mv, e)

End Sub

Class menu_events

Dim mv

‘ double click   
Function OnDblClick

If mv.selectedItem Is Nothing Then
            Exit Function
        End If

guixt.input(“OK:” & mv.selectedItem.Tag)

End Function
    
    
End Class

Sub get_menu_layout(mv)

Dim s()
Dim n
n = 0

For Each itm In mv.listitems
ReDim Preserve s(n)

s(n) = itm.Tag & ”;” & itm.Top & ”;” & itm.Left

n = n + 1

Next
    
    
    Call guixt.settext(“menu_layout”,Join(s,vbCrLf))

End Sub  

Sub set_menu_layout(mv)

Dim s
s = Split(guixt.gettext(“menu_layout”), vbCrLf)

‘ create dictionary object
Set pos = CreateObject(“Scripting.Dictionary”)

For Each line In s
params = Split(Trim(line), ”;”)
Call pos.Add(params(0), params(1) & ”;” & params(2))
Next 
    
    
    For Each itm In mv.listitems

 Dim p
p = pos.Item(itm.Tag)

If Not p = ”” Then
Dim p2
p2 = Split(p, ”;”)

itm.Top  = p2(0)
itm.Left = p2(1)
End If  
        
        
    Next
    
    
End Sub 

レイアウトの保存、および標準/個人用レイアウトの読み込みを行うInputScriptsはシンプルです。

// InputScript menu_save_layout.txt
Set text[menu_layout] “”
CallVBS get_menu_layout &V[menu_control]
CopyText fromText=“menu_layout” toFile=“&%[USERPROFILE]\sapmenu_layout.txt”
Return “S: Menu layout saved” -statusline

 

// InputScript menu_personal_layout.txt
CopyText fromFile=“&%[USERPROFILE]\sapmenu_layout.txt”toText=“menu_layout”
CallVBS set_menu_layout &V[menu_control]

 

// InputScript menu_standard_layout.txt
CopyText fromFile=menu\standard_layout.txt” toText=“menu_layout”
CallVBS set_menu_layout &V[menu_control]

 

最後に、”販促”リストの表示に使用するInputScriptを示します。

// InputScript promotions.txt
Screen SAPMS38M.0101
Set F[Programm] “RV15C003”
 Enter “/8”

// List Promotions
Screen RV15C003.1000
Enter “/8”