Visifire下展示cube

來源:互聯網
上載者:User

摘要:

本文主要描述在Siverlight下使用開源圖表組件Visifire展現Cube中的資料。由於Cube結構本身很複雜所以本文使用一維的查詢結果,側重於從OLAP到Silverlight端的方法。

環境概述:

本文使用Silverlight 2,visifire版本是2.0.4
beta。Cube的SQLServer版本是2008,樣本中使用的Cube是微軟樣本CubeAdventure Works DW
2008,對於複雜的Cube查詢aspnetx建議只使用表格的形式展現,為不使圖表看上去很亂,建議使用簡單的一維數列,所以在這個Cube中本
文使用如下MDX語句作為示範:

select [Measures].[Reseller Order Count] on 0,

[Product].[Category].members on 1

from [Sales Targets]

其查詢結果如下:

為什麼要用visifire?

其實在微軟的silverlight
toolkit中已經有了圖表組件,但是筆者認為其效果不如visifire的效果好,而且visifire中的每個資料點datapoint都可以被點
擊到,這個在做BI相關項目的時候很重要,因為類似drill down/up和drill throught to
detail的操作都得依賴這個來實現。

建立Silverlight項目:

開啟Visual Studio 2008,選擇檔案,建立Silverlight項目。建立項目的同時會提示是使用asp.net
web項目來寄宿silverlight項目還是只使用一個簡單的測試頁來寄宿silverlight項目。這裡選擇asp.net web
application項目。

Silverlight本身作為瀏覽器的外掛程式是沒有System.Data
這樣的命名空間的,所以需要從資料庫或其它資料來源擷取資料的話就需要通過webservice以及類似的方式,所以,為silverlight提供資料的
webservice相關資源我們會建立在剛才的寄宿silverlight的asp.net web applition項目中。

添加Visifire到頁面中:

首先需要添加visifire引用到項目中。這裡我們只需添加一個dll檔案即可,這個檔案可以在:

http://visifire.com/download_silverlight_charts.php

下載到。下載後解壓縮可以看到如下兩個dll檔案:

其中WPFVisifire.Chart.dll是在WPF Application下使用的,SLVisifire.Charts.dll是在silverlight項目下使用的。

這裡我們在剛才建立的silverlight項目下按右鍵References,選擇Add References…,在彈出的Add
Reference表單下選擇Browse選項卡,定位到visifire下載目錄,找到SLVisifire.Charts.dll,然後單擊OK。

由於visual
studio本身是不支援silverlight控制項的設計時拖拽支援的,所以這裡需要用到Blend2。按右鍵Page.xaml檔案,選擇Open
in Expression Blend…。只要正確安裝了Blend2+SP1,那麼這個選項就會出現。

在Blend中,找到我們添加的visifire chart控制項放到Page.xaml中,具體方法如下:

如,在Blend的工具列中找到>>這樣的按鈕,單擊它,會出現Asset Library對話方塊,選擇Custom
Controls,然後單擊Chart。這個Chart就是我們要添加的Visifire
chart。現在滑鼠變成了一個十字型,在面板上勾畫一個矩形地區,至此visifire chart添加完畢。

Visifire 2以後的版本都帶了Blend設計時支援,所以在Blend裡可以看到其預留位置。此外,我們還需要給這個chart取一個名字(預設是沒有名字的),好以後在c#檔案裡可以引用到它:

我們也可以在代碼中建立chart到面板中,visifire的document中有很多範例程式碼,在此不作過多描述。

建立WebService服務:

回到visual studio中。由於資料來自於Cube,所以需要添加ADOMD.Net的引用。右鍵asp.net web
application項目,選擇Add
Reference…,找到Microsoft.AnalysisServices.AdomdClient,選擇10版本的,如:

接下來添加服務檔案,同樣右鍵asp.net web application項目,選擇Add-New Item…,在彈出的對話方塊中選擇Web Service,添加一個web服務到項目中。

開啟這個服務檔案,在頂部添加如下引用:

using Microsoft.AnalysisServices.AdomdClient;

Visual Studio會為我們預設添加一個Hello World方法,刪除它,然後加入如下代碼:

 

[WebMethod]

public List<ChartItem> GetResult()

{

List<ChartItem> result = new List<ChartItem>();

AdomdConnection conn = new AdomdConnection();

conn.ConnectionString = "provider=msolap ;Integrated Security =SSPI
;Data Source= localhost ;Catalog = Adventure Works DW 2008 ;";

conn.Open();

AdomdCommand comm = new AdomdCommand();

comm.Connection = conn;

comm.CommandText = "select [Measures].[Reseller Order Count] on
0,[Product].[Category].[Category].members on 1 from [Sales Targets]";

AdomdDataReader dr = comm.ExecuteReader();

while (dr.Read())

{

ChartItem ci = new ChartItem();

ci.Title = dr[0].ToString();

ci.Value = double.Parse(dr[1].ToString());

result.Add(ci);

}

return result;

}

傳回型別是List<ChartItem>,其中ChartItem是自訂的一個類,代碼如下:

public class ChartItem

{

public string Title { get; set; }

public double Value { get; set; }

}

 

資料的查詢過程和查詢資料庫的大同小異,只不過是針對Cube有專門的AdomdConnection和AdomdCommand等對象。接受結
果用CellSet是比較多的,但是這裡由於只用了一維的數列,結構相對比較簡單,所以用AdomdDataReader來接收就足夠了。然後
dr.Read()迴圈建立ChartItem對象添加到類型為List<ChartItem>的結果result中。

關於ADOMD.NET請參考筆者的這篇文章:

ADOMD.NET 9 簡記---ADOMDConnection

本文中用到的是10,不過根據aspnetx的經驗9跟10的變化不大(我懷疑甚至是沒有)。

至此,服務建立完畢,瀏覽下這個服務,如果能返回類似如下介面就說明服務運行正常:

另外,我們需要記錄下這個服務的地址,這個地址我們可以通過按右鍵剛才建立的Web Service檔案選擇View in Browser,然後在彈出的瀏覽器介面中看到:

複製下這個地址,後面要用到。

Visifire讀取Webservice資料並且展現:

回到silverlight項目,右鍵silverlight項目,選擇Add Service Reference…(注意這裡跟剛才添加引用不同,這裡是加入服務參考)。在彈出的介面中,Address裡填入剛才複製的地址,然後點擊Go。系統會檢測到這個地址下有哪些服務,選擇我們剛才建立的服務,Namespace這裡我們選擇預設,然後單擊OK。

然後,開啟Page.xaml.cs,添加如下引用:

using SLVisifire.ServiceReference1;

using Visifire.Charts;

添加第一個引用是為了建立服務執行個體的時候不需要太囉嗦,第二個引用的目的是使用visifire下的如下類:DataSeries和DataPoint。前者是可以作為visifire chart執行個體的資料來源(序列),其本身是一個集合,後者就是它其中的元素。

最後,在Page裡用如下代碼替換現有代碼:

 

public Page()

{

InitializeComponent();

this.Loaded += new RoutedEventHandler(Page_Loaded);

}

void Page_Loaded(object sender, RoutedEventArgs e)

{

WebService1SoapClient wc = new WebService1SoapClient();

wc.GetResultCompleted += new EventHandler<GetResultCompletedEventArgs>(wc_GetResultCompleted);

wc.GetResultAsync();

}

void wc_GetResultCompleted(object sender, GetResultCompletedEventArgs e)

{

DataSeries ds = new DataSeries();

foreach (ChartItem item in e.Result)

{

DataPoint dp = new DataPoint();

dp.AxisXLabel = item.Title;

dp.YValue = item.Value;

ds.DataPoints.Add(dp);

}

chtTest.Series.Add(ds);

}

 

至此,項目建立完畢,運行項目,我們就可以看到如下介面:

實際的效果是帶動畫的,要比靜態圖片效果好。

[本文相關項目檔案下載]

總結:

本文大體描述了在silverlight中使用visifire顯示Cube中的資料的一般方法,下文中筆者將繼續圍繞這一話題藉助visifire實現更多展現功能。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.