Windowsのフォームを組み込む
VB.NETに独自のActiveXコンポーネントを実装する代わりに、guixt.EmbedForm()関数を用いてSAP GUI画面にWindowsのフォームを組み込めます。
作成したVB.NETのDLLを、SAP WebリポジトリやSAP Mimeリポジトリなどの一元管理された場所に保存する場合、ユーザーのPCでインストールや登録を行う必要ありません。GuiXTはそのDLLを読み込み、それを実行可能なローカルのキャッシュに保存します。
このチュートリアルでは、顧客の販売情報を表示するサンプルを使用して、この組み込み手法について説明します。このサンプルは比較的広範囲にわたっており、この類のアプリケーションにおいて有用なさまざまな手法が含まれています。
Visual Studioでは、今回のフォームのデザインは以下のようになります。
Visual Studioのフォームデザイナー
このフォームには、さまざまなデータグリッド、ボタン、チャートが含まれています。SAP GUIでは、ユーザーインターフェイスは以下のようになります。
顧客番号を入力して”Start”ボタンを押す
顧客情報が表示され、いくつかのユーザーインターフェイスが用意されている
右上にあるテーブルには、過去5年間に販売された商品が、総売上金額の降順で表示されます。商品の行をクリックすると、選択した商品の販売チャートが表示されます。
このアクションは、データベースへのアクセスを追加することなくVB.NETにて実装できます。他にも、InputScriptが実行されるユーザーインターフェイスが用意されています。例えば”Fidelity 3 years”ボタンを押すと、顧客のfidelity package(お得意様パッケージ)の発注金額が生成されます。
“Fidelity 3 years”を押すとVA01が呼び出され、選択したパッケージが入力される
全体の実装は、GuiXTとVB.NETを組み合わせて実現します。データベースのアクセスとSAP GUIのアクションはGuiXTにより実行され、データグリッドやチャートを含むユーザーインターフェイスについてはVB.NETで実現します。
標準の.NETコントロールを使用して、用意された機能(ヘッダーをクリックして列を並べ替えるなど)を取得することができます。
商品名で並べ替える
顧客販売ダッシュボードは、任意のSAPトランザクションに組み込むことができます。ここでは、既存のSAPトランザクションに対するパラメータートランザクションとして、デモ用のトランザクション”ZCSO”を別途作成しました。今回の例では、”Start_Report”です。デモ用としては十分なものです。
全スクリプトとVB.NETプロジェクトの全体は、zcso.zipに収められています。自身でのテスト用にインストールする場合、無償のMSチャートパッケージも必要となります(Windowsには自動的にインストールされません)。今回は、zcso.zipにセットアップファイルも含めました。Visual Studio 2012以降を使用してください。zcso.zipをダウンロードした後、通常、このファイルを”ブロック解除”する必要があります(マウスを右クリック-> File attributes -> Unblock)。これを行わないと、このファイルの実行がWindowsによってブロックされることになります。あるいは、ファイルの解凍後に、各ファイルを個別にブロック解除してください。
GuiXTスクリプト
// ZCSO
// demo transaction of embedded Windows Forms
// delete existing elements (necessary if implemented as parameter transaction)
del (0,0) (20,120)
// initial screen?
if not V[zcso_main_screen=X]
// title
Title “Customer Sales Order Dashboard”
InputField (1,1) “Customer” (1,20) size=10 name=“zcso_kunnr_ext” techname=“KNA1-KUNNR” -numerical
On “Enter” process=“zcso_init_enter.txt”
Pushbutton (toolbar) “Start” “/0” “F8” process=“zcso_init_enter.txt”
else
// title
Title “&V[zcso_kunnr_ext]: &V[zcso_name1], &V[zcso_city], &V[zcso_country]”
// area for VB.NET control.
// We start at (-1,-1) and use a very large area in order to avoid any padding
Control (-1,-1) (50,300) progid=“Shell.Explorer” name=“r1” initflag=“r1init”
// embed control
if V[r1init]
CallVB charts.zcso.embed “&V[r1]”
endif
Pushbutton (toolbar) “Other customer” process=“zcso_main_back.txt”
Pushbutton (toolbar) “Display customer data (XD03)“ process=“zcso_display_customer.txt”
On “Enter” process=“zcso_main_enter.txt”
On “/3” process=“zcso_main_back.txt”
endif
InputScipt zcso_init_enter.txt
// customer number specified?
if not V[zcso_kunnr_ext]
return “E: Please specify a customer number” -statusline
endif
// customer number with 10 digits
Set V[zcso_kunnr](1-10) “0000000000&V[zcso_kunnr_ext]” -alignright
// set organization key values (option:read from user parameters)
Set V[zcso_vkorg] “1000”
Set V[zcso_vtweg] “10”
Set V[zcso_spart] “00”
// prepare VB.NET form
StatusMessage title=“Processing…”
CallVB charts.zcso.initialize
// read customer address
StatusMessage addstring=“1 Address”
include “zcso_read_address.txt”
// read contacts
StatusMessage addstring=“2 Contacts”
include “zcso_read_contacts.txt”
// read orders
StatusMessage addstring=“3 Open orders”
include “zcso_read_orders.txt”
// read diagram data from S001
StatusMessage addstring=“4 Sales figures”
include “zcso_read_diagramdata.txt”
// build tables, diagrams etc.
CallVB charts.zcso.display
// display main screen
Set V[zcso_main_screen] “X”
StatusMessage -remove
Return
InputScipt zcso_read_address.txt
// read customer address
Call “/guixt/select” cache=“session” in.table=“KNA1” in.fields=“NAME1,ORT01,LAND1” in.condition=“KUNNR = ‘&V[zcso_kunnr]'” out.found=“found” out.v1=“zcso_name1” out.v2=“zcso_city” out.v3=“zcso_countrycode”
// found?
if not V[found]
StatusMessage -remove
return “E: Customer &V[zcso_kunnr_ext] not found” -statusline
endif
// read country text
Call “/guixt/select” cache=“session” in.table=“T005T” in.fields=“LANDX50” in.condition=“SPRAS = ‘&V[_language]’ AND LAND1 = ‘&V[zcso_countrycode]'” out.v1=”zcso_country”
InputScipt zcso_read_contacts.txt
// Build key table for function
Set V[crwa] “”
Set V[crwa](BAPICUSTOMER_IDRANGE-SIGN) “I”
Set V[crwa](BAPICUSTOMER_IDRANGE-OPTION) “EQ”
Set V[crwa](BAPICUSTOMER_IDRANGE-LOW) “&V[zcso_kunnr]”
Set text[cr] “&V[crwa]”
// clear result table
Set text[contacts] “”
// call function
Call “BAPI_CUSTOMER_GETCONTACTLIST” table.CUSTOMERRANGE=“cr” table.CONTACTADDRESSDATA=“contacts”
// transfer data to VB
Set V[i] 1
label contacts_line
CopyText fromText=“contacts” toString=“wa” line=&V[i]
if Q[ok]
Set V[zcso_contactname] “&V[wa](BAPICONTACT_ADDRESSDATA-LASTNAME), &V[wa](BAPICONTACT_ADDRESSDATA-FIRSTNAME)”
Set V[zcso_contacttitle] “&V[wa](BAPICONTACT_ADDRESSDATA-FUNCTION)”
Set V[zcso_contactphone] “&V[wa](BAPICONTACT_ADDRESSDATA-TEL1_NUMBR)”
Set V[zcso_contactemail] “&V[wa](BAPICONTACT_ADDRESSDATA-E_MAIL)”
CallVB charts.zcso.newcontact
Set V[i] &V[i] + 1
goto contacts_line
endif
InputScipt zcso_read_orders.txt
// read open orders
// search condition
Set V[condition] “KUNNR = ‘&V[zcso_kunnr]’ and VKORG = ‘&V[zcso_vkorg]'”
Set V[condition] “&V[condition] and VTWEG = ‘&V[zcso_vtweg]’ and SPART = ‘&V[zcso_spart]’ and TRVOG = ‘0’”
Set V[condition] “&V[condition] and AUDAT GE ‘&V[today-365_ymd]'”
// clear result tables
Set text[r1] “”
Set text[r2] “”
Set text[r3] “”
Set text[r4] “”
Set text[r5] “”
// read orders
Call /guixt/select in.Table=“VBAK” in.Condition=“&V[condition]” in.Fields=“VBELN,AUDAT,AUART,NETWR,BSTNK”table.V1table=“r1” table.V2table=“r2” table.V3table=“r3” table.V4table=“r4” table.V5table=“r5”
// pass to VB
CallVB charts.zcso.neworders
// clear result tables
Set text[r1] “”
Set text[r2] “”
Set text[r3] “”
Set text[r4] “”
Set text[r5] “”
InputScipt zcso_read_diagramdata.txt
// Determine years
Set V[zcso_year0] &V[today_y]
Set V[zcso_year1] &V[zcso_year0] – 1
Set V[zcso_year2] &V[zcso_year0] – 2
Set V[zcso_year3] &V[zcso_year0] – 3
Set V[zcso_year4] &V[zcso_year0] – 4
// search condition
Set V[condition] “KUNNR = ‘&V[zcso_kunnr]’ and VKORG = ‘&V[zcso_vkorg]’ and VTWEG = ‘&V[zcso_vtweg]’ and SPART = ‘&V[zcso_spart]’ and SPMON GE ‘&V[zcso_year4]01′”
// Clear result tables
Set text[r1] “”
Set text[r2] “”
Set text[r3] “”
// read VIS statistics table S001
Call /guixt/select in.Table=”S001″ in.Condition=“&V[condition]” in.Fields=“MATNR,SPMON,AENETWR”table.V1table=“r1” table.V2table=“r2” table.V3table=“r3”
// pass data to VB
CallVB charts.zcso.materialsales
// Clear result tables
Set text[r1] “”
Set text[r2] “”
Set text[r3] “”
// obtain all product numbers from VB
CallVB charts.zcso.products_to_guixt
// read product names
if text[zcso_products]
Set text[ctab] “”
Set V[i] 1
label next
CopyText fromText=“zcso_products” toString=“matnr” line=“&V[i]”
if Q[ok]
if V[i=1]
Set V[condline] “SPRAS = ‘E’ AND (MATNR = ‘&V[matnr]’
else
Set V[condline] “OR MATNR = ‘&V[matnr]'”
endif
CopyText fromString=“condline” toText=“ctab” -appendline
Set V[i] &V[i] + 1
goto next
endif
if V[i>1]
Set V[condline] “)”
CopyText fromString=“condline” toText=“ctab” -appendline
endif
Call /guixt/select in.table=“MAKT” in.fields=“MATNR,MAKTX” table.conditiontable=“ctab”table.V1table=“r1” table.V2table=“r2”
endif
// product names to VB
CallVB charts.zcso.productnames_from_guixt
InputScipt zcso_create_order.txt
Parameter PROMOTION
Enter “/nVA01”
// Enter order type
Screen SAPMV45A.0101
Set F[VBAK-AUART] “TA”
Enter
// Enter customer number
Screen SAPMV45A.4001
Set F[KUAGV-KUNNR] “&V[zcso_kunnr]”
if U[PROMOTION=1]
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,1] “M-20”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,1] “1”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,2] “PA-1000”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,2] “1”
endif
if U[PROMOTION=2]
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,1] “M-20”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,1] “2”
endif
if U[PROMOTION=3]
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,1] “PA-1000”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,1] “1”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,2] “M-10”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,2] “1”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,3] “P-103”
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,3] “1”
endif
Enter
// no delivery proposal?
Screen SAPLATP4.0500
Enter “=WEIT”
// no delivery proposal?
Screen SAPLATP4.0500
Enter “=WEIT”
InputScipt zcso_display_order.txt
if not V[zcso_vbeln]
return “E: Please select an order” -statusline
endif
Enter “/nVA03”
// Display order
Screen SAPMV45A.0102
Set F[VBAK-VBELN] “&V[zcso_vbeln]”
Enter
// Skip Popup
Screen SAPMSDYP.0010
Enter
InputScipt zcso_change_order.txt
if not V[zcso_vbeln]
return “E: Please select an order” -statusline
endif
Enter “/nVA02”
// Display order
Screen SAPMV45A.0102
Set F[VBAK-VBELN] “&V[zcso_vbeln]”
Enter
// Skip Popup
Screen SAPMSDYP.0010
Enter
InputScipt Zcso_display_customer.txt
Enter “/nxd03”
// Display customer
Screen SAPMF02D.7101
Set F[RF02D-KUNNR] “&V[zcso_kunnr]”
Set F[RF02D-VKORG] “&V[zcso_vkorg]”
Set F[RF02D-VTWEG] “&V[zcso_vtweg]”
Set F[RF02D-SPART] “&V[zcso_spart]”
Enter
InputScipt zcso_main_back.txt
// back to initial screen
Set V[zcso_main_screen] “”
Return
VB.NET
1 | Imports guinet |
2 | Imports System.Windows.Forms |
3 | Imports System.Data |
4 | Imports System.Drawing |
5 | Imports System.Windows.Forms.DataVisualization.Charting |
6 | |
7 | |
8 | |
9 | Public Class zcso |
10 | |
11 | |
12 | #Region “Private data” |
13 | ‘ interface to GuiXT |
14 | Private myguixt As guixt |
15 | |
16 | ‘ Dictionary for sales per product and month |
17 | Private matdict1 As New Dictionary(Of String, Decimal) |
18 | |
19 | ‘ Dictionary for sales per product |
20 | Private matdict2 As New Dictionary(Of String, Decimal) |
21 | |
22 | ‘ Dictionary for product names |
23 | Private matdict3 As New Dictionary(Of String, String) |
24 | |
25 | #End Region |
26 | |
27 | |
28 | ‘ embed into SAP GUI window |
29 | Public Sub embed(ByVal w As Object) |
30 | guixt.EmbedForm(Me, w) |
31 | End Sub |
32 | |
33 | ‘ initialize for new customer data |
34 | Public Sub initialize() |
35 | |
36 | ‘ create guixt object for communication with GuiXT |
37 | myguixt = New guixt |
38 | |
39 | ‘ clear data grids |
40 | contacts.RowCount = 0 |
41 | orders.RowCount = 0 |
42 | matbuttons.RowCount = 0 |
43 | |
44 | ‘ clear product dictionaries |
45 | matdict1.Clear() |
46 | matdict2.Clear() |
47 | matdict3.Clear() |
48 | |
49 | End Sub |
50 | |
51 | ‘ final display, all customer data are read |
52 | Public Sub display() |
53 | |
54 | ‘ sort contacts |
55 | contacts.Sort(contacts.Columns(0), System.ComponentModel.ListSortDirection.Ascending) |
56 | |
57 | ‘ sort orders |
58 | orders.Sort(orders.Columns(0), System.ComponentModel.ListSortDirection.Descending) |
59 | |
60 | |
61 | ‘ Build Sales chart |
62 | GenerateSalesChart(“*”) |
63 | |
64 | ‘ no selection |
65 | contacts.ClearSelection() |
66 | orders.ClearSelection() |
67 | |
68 | |
69 | End Sub |
70 | |
71 | ‘ Pass all product numbers to GuiXT via GuiXT long text variable |
72 | Public Sub products_to_guixt() |
73 | |
74 | ‘ Pass product numbers back to GuiXT to obtain product names |
75 | myguixt.SetText(“zcso_products”, String.Join(vbCrLf, matdict2.Keys)) |
76 | |
77 | End Sub |
78 | |
79 | ‘ Obtain all product texts from GuiXT via GuiXT long text variables |
80 | Public Sub productnames_from_guixt() |
81 | |
82 | Dim products As String() = myguixt.GetText(“r1”).Split(vbCrLf) |
83 | Dim productnames As String() = myguixt.GetText(“r2”).Split(vbCrLf) |
84 | |
85 | For k As Integer = 0 To products.Length – 1 |
86 | matdict3.Add(products(k).Trim, productnames(k).Trim) |
87 | Next |
88 | |
89 | |
90 | End Sub |
91 | |
92 | #Region “Event handling” |
93 | |
94 | |
95 | ‘Create new standard order |
96 | Private Sub buttoncreateorder_Click(sender As Object, e As EventArgs) Handles buttoncreateorder.Click |
97 | myguixt.Input(“OK:/0,process=zcso_create_order.txt”) |
98 | End Sub |
99 | |
100 | ‘Create new order, promotion 1 |
101 | Private Sub promotion1_Click(sender As Object, e As EventArgs) Handles promotion1.Click |
102 | myguixt.Input(“U[PROMOTION]:1;OK:/0,process=zcso_create_order.txt”) |
103 | End Sub |
104 | |
105 | ‘Create new order, promotion 2 |
106 | Private Sub promotion2_Click(sender As Object, e As EventArgs) Handles promotion2.Click |
107 | myguixt.Input(“U[PROMOTION]:2;OK:/0,process=zcso_create_order.txt”) |
108 | End Sub |
109 | |
110 | ‘Create new order, promotion 3 |
111 | Private Sub promotion3_Click(sender As Object, e As EventArgs) Handles promotion3.Click |
112 | myguixt.Input(“U[PROMOTION]:3;OK:/0,process=zcso_create_order.txt”) |
113 | End Sub |
114 | |
115 | ‘ Display customer order |
116 | Private Sub buttondisplayyorder_Click(sender As Object, e As EventArgs) Handles buttondisplayorder.Click |
117 | Dim ordernumber As String = “” |
118 | For Each row In orders.SelectedRows |
119 | ordernumber = row.Cells(“ordervbeln”).Value() |
120 | Next |
121 | |
122 | myguixt.SetVariable(“zcso_vbeln”, ordernumber) |
123 | myguixt.Input(“OK:/0,process=zcso_display_order.txt”) |
124 | End Sub |
125 | |
126 | ‘ Change customer order |
127 | Private Sub buttonchangeorder_Click(sender As Object, e As EventArgs) Handles buttonchangeorder.Click |
128 | |
129 | Dim ordernumber As String = “” |
130 | For Each row In orders.SelectedRows |
131 | ordernumber = row.Cells(“ordervbeln”).Value() |
132 | Next |
133 | myguixt.SetVariable(“zcso_vbeln”, ordernumber) |
134 | myguixt.Input(“OK:/0,process=zcso_change_order.txt”) |
135 | End Sub |
136 | |
137 | ‘ Click on product button to generate chart |
138 | Private Sub matbuttons_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles matbuttons.CellClick |
139 | |
140 | Dim product As String = “” |
141 | For Each row In matbuttons.SelectedRows |
142 | product = row.Cells(“prodnumber”).Value() |
143 | Next |
144 | |
145 | GenerateSalesChart(product) |
146 | |
147 | End Sub |
148 | #End Region |
149 | |
150 | |
151 | #Region “contacts” |
152 | |
153 | ‘ called from GuiXT for each new contact |
154 | Public Sub newcontact() |
155 | |
156 | Dim k As Integer = contacts.Rows.Add() |
157 | |
158 | Dim c As System.Windows.Forms.DataGridViewCellCollection = contacts.Rows.Item(k).Cells |
159 | |
160 | c(“contactname”).Value = myguixt.GetVariable(“zcso_contactname”) |
161 | c(“contacttitle”).Value = myguixt.GetVariable(“zcso_contacttitle”) |
162 | c(“contactphone”).Value = myguixt.GetVariable(“zcso_contactphone”) |
163 | c(“contactemail”).Value = myguixt.GetVariable(“zcso_contactemail”) |
164 | |
165 | End Sub |
166 | |
167 | |
168 | |
169 | #End Region |
170 | |
171 | #Region “orders” |
172 | |
173 | ‘ transfer order data from GuiXT to datagrid |
174 | Public Sub neworders() |
175 | |
176 | Dim r1 As String() = myguixt.GetText(“r1”).Split(vbCrLf) |
177 | Dim r2 As String() = myguixt.GetText(“r2”).Split(vbCrLf) |
178 | Dim r3 As String() = myguixt.GetText(“r3”).Split(vbCrLf) |
179 | Dim r4 As String() = myguixt.GetText(“r4”).Split(vbCrLf) |
180 | Dim r5 As String() = myguixt.GetText(“r5”).Split(vbCrLf) |
181 | |
182 | |
183 | For k As Integer = 0 To r1.Length – 1 |
184 | |
185 | orders.Rows.Add() |
186 | |
187 | Dim o As System.Windows.Forms.DataGridViewCellCollection = orders.Rows.Item(k).Cells |
188 | |
189 | o(“ordervbeln”).Value = CInt(r1(k).Trim) |
190 | o(“orderaudat”).Value = r2(k).Trim |
191 | o(“orderauart”).Value = r3(k).Trim |
192 | o(“ordernetwr”).Value = Decimal.Parse(r4(k).Trim, Globalization.NumberStyles.AllowDecimalPoint).ToString() |
193 | o(“orderbstnk”).Value = r5(k).Trim |
194 | |
195 | Next |
196 | End Sub |
197 | |
198 | |
199 | #End Region |
200 | |
201 | |
202 | #Region “materials” |
203 | |
204 | Public Sub materialsales() |
205 | |
206 | Dim r1 As String() = myguixt.GetText(“r1”).Split(vbCrLf) |
207 | Dim r2 As String() = myguixt.GetText(“r2”).Split(vbCrLf) |
208 | Dim r3 As String() = myguixt.GetText(“r3”).Split(vbCrLf) |
209 | |
210 | For k As Integer = 0 To r1.Length – 1 |
211 | |
212 | Dim product As String = r1(k).Trim |
213 | Dim year As String = r2(k).Trim.Substring(0, 4) |
214 | Dim netwr As Decimal = Decimal.Parse(r3(k).Trim) |
215 | |
216 | |
217 | Dim key As String = year & product |
218 | |
219 | If matdict1.ContainsKey(key) Then |
220 | matdict1.Item(key) = matdict1.Item(key) + netwr |
221 | Else |
222 | matdict1.Add(key, netwr) |
223 | End If |
224 | |
225 | |
226 | ‘ product only |
227 | If matdict2.ContainsKey(product) Then |
228 | matdict2.Item(product) = matdict2.Item(product) + netwr |
229 | Else |
230 | matdict2.Add(product, netwr) |
231 | End If |
232 | |
233 | Next |
234 | |
235 | |
236 | |
237 | |
238 | End Sub |
239 | |
240 | |
241 | |
242 | #End Region |
243 | |
244 | |
245 | #Region “charts” |
246 | |
247 | Private total_netwr0 As Decimal = 0 |
248 | Private total_netwr1 As Decimal = 0 |
249 | Private total_netwr2 As Decimal = 0 |
250 | Private total_netwr3 As Decimal = 0 |
251 | Private total_netwr4 As Decimal = 0 |
252 | |
253 | Public Sub GenerateSalesChart(product As String) |
254 | |
255 | ‘ create chart |
256 | Dim Chart1 As New Chart() |
257 | |
258 | Chart1.Size = New System.Drawing.Size(salesdiagram.Size.Width, salesdiagram.Size.Height) |
259 | Chart1.BackColor = Color.FromArgb(240, 240, 240) |
260 | |
261 | Dim ChartArea1 As New ChartArea |
262 | |
263 | ChartArea1.Name = “ChartArea1” |
264 | Chart1.ChartAreas.Add(ChartArea1) |
265 | |
266 | Dim Series1 As New Series |
267 | Series1.ChartArea = “ChartArea1” |
268 | Series1.Palette = ChartColorPalette.Pastel |
269 | Series1.XValueMember = “Year” |
270 | Series1.YValueMembers = “Sales” |
271 | Chart1.Series.Add(Series1) |
272 | |
273 | Dim table As New DataTable |
274 | |
275 | ‘ Create columns in the DataTable |
276 | table.Columns.Add(“Year”, GetType(String)) |
277 | table.Columns.Add(“Sales”, GetType(Integer)) |
278 | |
279 | Dim year0 As String = myguixt.GetVariable(“zcso_year0”) |
280 | Dim year1 As String = myguixt.GetVariable(“zcso_year1”) |
281 | Dim year2 As String = myguixt.GetVariable(“zcso_year2”) |
282 | Dim year3 As String = myguixt.GetVariable(“zcso_year3”) |
283 | Dim year4 As String = myguixt.GetVariable(“zcso_year4”) |
284 | |
285 | Dim netwr0 As Decimal = 0 |
286 | Dim netwr1 As Decimal = 0 |
287 | Dim netwr2 As Decimal = 0 |
288 | Dim netwr3 As Decimal = 0 |
289 | Dim netwr4 As Decimal = 0 |
290 | |
291 | For Each m In matdict1 |
292 | |
293 | If product = “*” Or product = “***” Or product = m.Key.Substring(4) Then |
294 | Select Case m.Key.Substring(0, 4) |
295 | |
296 | Case year0 |
297 | netwr0 += m.Value |
298 | Case year1 |
299 | netwr1 += m.Value |
300 | Case year2 |
301 | netwr2 += m.Value |
302 | Case year3 |
303 | netwr3 += m.Value |
304 | Case year4 |
305 | netwr4 += m.Value |
306 | |
307 | End Select |
308 | End If |
309 | Next |
310 | |
311 | ‘ Save total values |
312 | If product = “*” Then |
313 | total_netwr0 = netwr0 |
314 | total_netwr1 = netwr1 |
315 | total_netwr2 = netwr2 |
316 | total_netwr3 = netwr3 |
317 | total_netwr4 = netwr4 |
318 | |
319 | |
320 | ‘ build matbuttons |
321 | Dim total_netwr As Decimal = total_netwr0 + total_netwr1 + total_netwr2 + total_netwr3 + total_netwr4 |
322 | |
323 | |
324 | |
325 | matbuttons.Rows.Add() |
326 | |
327 | Dim mb As System.Windows.Forms.DataGridViewCellCollection = matbuttons.Rows.Item(0).Cells |
328 | |
329 | mb(“percentage”).Value = “100” |
330 | mb(“product”).Value = “***” |
331 | mb(“prodnumber”).Value = “***” |
332 | mb(“prodname”).Value = “All products” |
333 | mb(“netwr”).Value = total_netwr |
334 | |
335 | ‘ select first row |
336 | matbuttons.ClearSelection() |
337 | matbuttons.Rows.Item(0).Selected = True |
338 | |
339 | |
340 | For Each m In matdict2 |
341 | Dim k As Integer = matbuttons.Rows.Add() |
342 | |
343 | mb = matbuttons.Rows.Item(k).Cells |
344 | |
345 | |
346 | Dim percentage As Integer |
347 | ‘ avoid to divide by 0 |
348 | If total_netwr = 0 Then |
349 | percentage = 0 |
350 | Else |
351 | percentage = CInt(m.Value * 100 / total_netwr) |
352 | End If |
353 | |
354 | |
355 | |
356 | mb(“percentage”).Value = percentage.ToString |
357 | |
358 | |
359 | ‘ Suppress leading 000 |
360 | If IsNumeric(m.Key) Then |
361 | mb(“product”).Value = CInt(m.Key).ToString |
362 | Else |
363 | mb(“product”).Value = m.Key |
364 | End If |
365 | |
366 | mb(“prodnumber”).Value = m.Key |
367 | mb(“prodname”).Value = matdict3.Item(m.Key) |
368 | |
369 | mb(“netwr”).Value = m.Value |
370 | |
371 | Next |
372 | |
373 | |
374 | ‘ sortmatbuttons |
375 | matbuttons.Sort(matbuttons.Columns(“netwr”), System.ComponentModel.ListSortDirection.Descending) |
376 | |
377 | End If |
378 | |
379 | |
380 | ‘ Sales figures for 5 years |
381 | table.Rows.Add(year4, CInt(netwr4)) |
382 | table.Rows.Add(year3, CInt(netwr3)) |
383 | table.Rows.Add(year2, CInt(netwr2)) |
384 | table.Rows.Add(year1, CInt(netwr1)) |
385 | table.Rows.Add(year0, CInt(netwr0)) |
386 | |
387 | ‘ Chart data |
388 | Chart1.DataSource = table |
389 | |
390 | |
391 | Dim bmp As New Bitmap(Chart1.Width, Chart1.Height) |
392 | Dim rec As New Rectangle(0, 0, Chart1.Width, Chart1.Height) |
393 | Chart1.DrawToBitmap(bmp, rec) |
394 | |
395 | salesdiagram.Image = bmp |
396 | |
397 | |
398 | ‘ Title variable |
399 | If product = “*” OrElse product = “***” Then |
400 | product_selected.Text = “All products” |
401 | Else |
402 | product_selected.Text = product & ” ” & matdict3.Item(product) |
403 | End If |
404 | |
405 | salesdiagram.Refresh() |
406 | |
407 | End Sub |
408 | |
409 | |
410 | |
411 | #End Region |
412 | |
413 | |
414 | End Class |