チャートの生成と表示

このチュートリアルでは、SAPのデータからチャートを生成し、それをSAPのトランザクションにて表示する方法を示します。今回の例は以下のようになります。

トランザクションMM03(品目の表示)にて、”Sales chart”(販売チャート)ボタンを追加します。

ユーザーがボタンをクリックすると、過去12か月間の商品の月間売上高を示す棒グラフを表示します(このグラフは現在のSAPデータから生成されます)。

これを実装するには、以下の手順で行います。

(1) SAPからデータを読み込む

これは、BAPIコール、データベースへの直接アクセス、または既存のSAPトランザクションによって実現します。今回の例では、売上高をABAPリストとして表示する標準のトランザクションである”MC+Q”を使用します。

(2) チャートを生成する外部のツールにデータを渡す

今回の例では、”Advanced Software Engineering Limited”(http://www.advsofteng.com)の”ChartDirector”を使用します。ここでは、VBScriptを用いてGuiXTからグラフィックコンポーネントにデータを渡します。

(3) SAP GUIウィンドウにチャートを表示する

ここでは、Windows標準のフォーム画像コントロールである”Forms.Image.1″を使用します。

MM03用のGuiXTスクリプト

// saplmgmm.e0060
if V[MM03_display_sales_chart=X]
Control (4,1) (26,120) name=“MM03_sales_chart”progid=“Forms.Image.1” initflag=“chartinit”

if V[chartinit=X]
CallVbs generate_chart “&V[MM03_sales_chart]”
endif

Pushbutton (4,121) “x”process=“mm03_display_sales_chart_reset.txt”

else

Pushbutton (4,1) “Sales chart”process=“mm03_display_sales_chart.txt”

endif

InputScriptの”mm03_display_sales_chart.txt”は、トランザクションMC+Qを用いて売上高の表示を呼び出し、必要なデータをABAPリストから抽出します。InputScriptによってバックグラウンドで処理されるInputScriptと画面を以下に示します。

// save material number
Set V[MM03_matnr] “&F[Material]”

// transaction MC+Q
Enter “/NMC+Q

// Material Analysis: Invoiced Sales: Selection 
Screen RMCV0200.1000

  // Month selection, e.g. 07.2010 – 06.2011
Set V[y2] “&V[today_y]”
Set V[m2] “&V[today_m]” + 0     // e.g.: 01 -> 1

if V[m2=12]
Set V[y1] “&V[y2]”
Set V[m1] “1”
 else
Set V[y1] &V[y2] – 1
Set V[m1] &V[m2] + 1
endif

Set F[Material] “&V[MM03_matnr]”
Set F[Sales Organization] “”
Set F[Distribution Channel] ” ”
 Set F[Month] “&V[m1].&V[y1]”
Set F[Month to] “&V[m2].&V[y2]”

Enter “/8” // Execute

// Information screen may occur, e.g. “no data available
Screen SAPMSDYP.0010
Enter

// back to selection screen? then no data found for this selection 
Screen RMCV0200.1000
Message “E: No sales data found for product number &V[MM03_matnr]” -statusline
Enter “/NMM03”
Leave

// Material Analysis: Invoiced Sales: Basic List 
Screen RMCV0200.0120
Enter “/7” // Switch drilldown…

// Switch drilldown 
Screen SAPLMCS2.0201
 Set R[Month] “X”
Enter

Screen RMCV0200.0120

// Month names
Set V[monthname.1] “January”
Set V[monthname.2] “February”
Set V[monthname.3] “March”
Set V[monthname.4] “April”
Set V[monthname.5] “May”
Set V[monthname.6] “June”
Set V[monthname.7] “July”
Set V[monthname.8] “August”
Set V[monthname.9] “September”
Set V[monthname.10] “October”
Set V[monthname.11] “November”
Set V[monthname.12] “December”

// Set chart title
Set V[chart.title] “Monthly Sales &V[MM03_matnr]&V[monthname.&V[m1]] &V[y1] – &V[monthname.&V[m2]]&V[y2]”

// Set labels
Set V[k] 1
Set V[month] “&V[m1]”

label next_month_label

// set label
Set V[chart.label.&V[k]] “&V[monthname.&V[month]]”

// reset month values
Set V[chart.amount.&V[k]] “0”

// reverse month index
  // necessary since the SAP list does not always contain each month
Set V[reverse_month.&V[month]] “&V[k]”

if V[k<12]
Set V[k] &V[k] + 1

if V[month=12]
Set V[month] “1”
else
Set V[month] &V[month] + 1
endif

goto next_month_label

endif

// xtract sales figures from ABAP list

Set V[k] 6

label next_month_in_list

Set V[dot] “&V[_listline(&V[k])](4-4)
if not V[dot=.]
goto end_month_in_list
endif

// month, year and sales amount from list display
Set V[month] “&V[_listline(&V[k])](2-3)” + 0 // 01 -> 1 etc.
Set V[amount] “&V[_listline(&V[k])](21-34)” / 1000decimals=decimalseparator=UserDefault
Set V[chart.amount.&V[reverse_month.&V[month]]]“&V[amount]”

// next month
Set V[k] &V[k] + 1
goto next_month_in_list

label end_month_in_list

Set V[MM03_display_sales_chart] “X”

Enter “/NMM03”

 

InputScriptの”mm03_display_sales_chart_reset.txt”は非常にシンプルです。

Set V[MM03_sales_chart] “”
Set
 V[MM03_display_sales_chart] “”
Return

 

今回のVBScript関数”generate_chart”は、”ChartDirector”コンポーネントを使用してチャートを生成し、それを画像コントロールに渡します。これは、ChartDirectorヘルプファイルに含まれる各種サンプルのひとつをベースにしています。

‘ The example uses ChartDirector from Advanced Software Engineering Limited
‘ http://www.advsofteng.com/

Function generate_chart(img)

Dim cd
Set cd = guixt.CreateObject(“ChartDirector.API”)

‘ Set license code
cd.setLicenseCode(“xxxx-xxxx-xxxx-xxxx-xxxx-xxxx”)

‘ The data for the bar chart
Dim data(11)
Dim labels(11)

For k = 1To12
data(k-1) = CInt(guixt.Get(“chart.amount.”  & k))
labels(k-1) = guixt.Get(“chart.label.”  & k)
Next

‘ The colors for the bar chart
Dim colors
colors = Array(&Hb8bc9c, &Ha0bdc4, &H999966, &Hb8bc9c,  &Ha0bdc4, &H999966,&Hb8bc9c, &Ha0bdc4, &H999966,&Hb8bc9c, &Ha0bdc4, &H30cc30)

‘ Create an XYChart object of size 800 x 460 pixels, golden background
Dim c
Set c = cd.XYChart(800, 460, cd.goldColor(), -1, 2)

‘ Add a title box using 12 point Arial Bold font. 
Call c.addTitle(guixt.Get(“chart.title”), ”arialbd.ttf”, 12, &H606060)

‘ Set the plotarea at (60, 40) and of size 720 x 360 pixels
Call c.setPlotArea(60, 40, 720, 360)

‘ Add a multi-color bar chart layer using the given data and colors
Dim layer
Set layer = c.addBarLayer3(data, colors)

‘  Use a 1 pixel 3D border for the bars.
Call layer.setBorderColor(-1, 1)

‘ Set bar shape to circular (cylinder)
Call layer.setBarShape(cd.CircleShape)

‘ Enable bar label for the whole bar
Call layer.setAggregateLabelStyle()

‘ Set the labels on the x axis.
Call c.xAxis().setLabels(labels)

 ’ Add a title to the y axis
 Call c.yAxis().setTitle(“in thousands €”)

‘ Output the chart
Set img.Picture = c.makePicture()

End Function