| EEP JQuery如何實現統計圖表 訊光科技 前言在ERP專案開發過程中,統計圖表(chart)普遍應用於各種統計和報表中,其形象直觀,內容清晰。EEP的JQuery網站項目使用了Easyui 外掛程式並且進行了包裝,但是easyui並沒有提供圖表相關的元件和實現方法。為了實現圖表功能,需要使用另一些協力廠商JQuery圖表外掛程式來實現圖表的功能。本文使用基於jQuery的開源javascript繪圖庫外掛程式Flot,並結合EEP的N-Tier架構來實現簡單的柱狀圖(barchart)和餅狀圖(piechart)設計。 
 準備工作
 資料來源:使用SQL Server 範例資料庫Northwind 的Orders表與Order Details表。       EEP2012:使用EEP2012的JQWebClient網站。 Flot外掛程式下載:http://code.google.com/p/flot/ 並且將需要使用的JS檔加入到EEP的JQWebClient網站中。
 Bar chart實例 (1)   實現功能:統計1997年訂單的每月銷售額, 並以Barchart做比較。  (2)   資料庫語句:select month(orders.OrderDate) as Month,sum(Orders.TotalAmout) as TotalAmount from orders where year(orders.OrderDate)=1997 group by month(orders.OrderDate)
 (3)   建立Server端:使用SSingle模版加入一個Server端命名為SBarChart,然後將以上資料庫語句複製到Master(infocommand元件)的CommandText屬性上,build這個Server端工程。然後在EEPNetServer的Package Manager上加入build好的SBarChart.dll。 
 (4)   建立Client端:在JQWebClient網站下建立一個ChartExample資料夾存放我們範例的網頁,在這個資料夾下加入一個空白網頁BarChart.aspx。然後加入EEP使用的js,以及Flot使用的js的參考。 
 <!-- infolight and easyui js -->     <link href="../js/themes/default/easyui.css" rel="stylesheet" />     <link href="../js/themes/icon.css" rel="stylesheet" />     <script src="../js/jquery-1.8.0.min.js"></script>     <script src="../js/jquery.easyui.min.js"></script>     <script src="../js/jquery.json.js"></script>     <script src="../js/jquery.infolight.js"></script>     <script type="text/javascript" src="../js/datagrid-detailview.js"></script>       <!-- flot js -->     <!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../flot-master/excanvas.min.js"></script><![endif]-->       <script language="javascript" type="text/javascript" src="../flot-master/jquery.flot.js"></script>       <script language="javascript" type="text/javascript" src="../flot-master/jquery.flot.categories.js"></script>     <script language="javascript" type="text/javascript" src="../flot-master/jquery.flot.pie.js"></script>   (5)   加入一個div用作圖表的顯示區域,加入id等屬性,以及EEP使用的參數選項infolight-options  <div id="chartid" style="width:auto;height:500px"     infolight-options="remoteName:'SBarChart.Master',tableName:'Master',xField:'Month',yField:'TotalAmount'">      </div>   (6)   加入繪製圖表的JS代碼。 <script type="text/javascript">           $(document).ready(function () {               var data = [];               var target = $('#chartid');               //獲取參數               var remoteName = getInfolightOption(target).remoteName; //Server端remote               var tableName = getInfolightOption(target).tableName; //Server端table               var xField = getInfolightOption(target).xField; //X軸欄位               var yField = getInfolightOption(target).yField; //Y軸欄位               var url = getRemoteUrl(remoteName, tableName, false); //呼叫Server取得數據的url               var queryWord = new Object(); //查詢條件               $.ajax({                   type: "POST",                   url: url,                   data: "queryWord=" + $.toJSONString(queryWord),                   cache: false,                   async: false,                   success: function (returndate) {                       if (returndate != null) {                           var rows = $.parseJSON(returndate)//將回傳的字串轉換成json                           for (var i = 0; i < rows.length; i++) {                               data[i] = [rows[i][xField], rows[i][yField]]; //給data數組賦值                           }                       }                   },                   error: function () {                       alert('error');                   }               });               $.plot(target, [data], {//將顯示的資料内容給予顯示的div                   series: {                       bars: {                           show: true,                           barWidth: 0.8,                           align: "center"                       }                   },                   xaxis: {                       mode: "categories",                       tickLength: 0                   }               });           })       </script>   (7)   在EEPManager中將這個頁面掛在Menu上並且設定許可權,然後通過VS開啟Logon.aspx登陸瀏覽這個頁面。 
 
   Pie chart實例 (1)   實現功能:根據不同產品代號,計算單一產品的訂單總額,取產品代號1-10做成餅狀圖。
 (2)   資料庫語句:select [Order Details].ProductID,sum([Order Details].UnitPrice*[Order Details].Quantity) as Amout from [Order Details] group by [Order Details].ProductID
 (3)   建立Server端:使用SSingle模版加入一個Server端命名為SPieChart,然後將以上資料庫語句複製到Master(infocommand元件)的CommandText屬性上,build這個Server端工程。然後在EEPNetServer的Package Manager上加入build好的SPieChart.dll。(如同SBarChart.dll的操作方式) (4)   建立Client端:在JQWebClient網站下的資料夾ChartExample存放我們範例的網頁,在這個資料夾下加入一個空白網頁PieChart.aspx。然後加入EEP使用的js,以及Flot使用的js引用。(EEP的js同BarChart.aspx的範例) 
   <script language="javascript" type="text/javascript" src="../flot-master/jquery.flot.js"></script>   <script language="javascript" type="text/javascript" src="../flot-master/jquery.flot.categories.js"></script>     <script language="javascript" type="text/javascript" src="../flot-master/jquery.flot.pie.js"></script>   (5)   加入一個div用作圖表的顯示區域,加入id等屬性,以及EEP使用的參數選項infolight-options:  <div id="chartid" style="width:auto;height:500px"     infolight-options="remoteName:'SPieChart.Master',tableName:'Master',labelField:'ProductID',valueField:'Amout'"></div> (6)   加入繪製圖表的JS代碼:  <script type="text/javascript"> function labelFormatter(label, series) {    return "<div style='font-size:8pt; text-align:center; padding:2px; color:white;'>ProcuctID: "              + label + "<br/> TotalAmout: " + series.data[0][1] + "</div>";    }     $(document).ready(function () {         var data = [];         var target = $('#chartid');         //獲取參數         var remoteName = getInfolightOption(target).remoteName; //Server端remote         var tableName = getInfolightOption(target).tableName; //Server端table         var labelField = getInfolightOption(target).labelField; //顯示的label欄位         var valueField = getInfolightOption(target).valueField; //值的欄位         var url = getRemoteUrl(remoteName, tableName, false); //呼叫Server取得數據的url         var queryWord = new Object();         queryWord.whereString = "ProductID >=1 and ProductID <10"; // 查詢條件                   $.ajax({             type: "POST",             url: url,             data: "queryWord=" + $.toJSONString(queryWord),             cache: false,             async: false,             success: function (returndata) {                 if (returndata != null) {                     var rows = $.parseJSON(returndata)                     for (var i = 0; i < rows.length; i++) {                         data[i] = {                             label: rows[i][labelField],                             data: rows[i][valueField]                         }                     }                 }             },             error: function () {                 alert('error');             }         });         //flot自身方法         $.plot(target, data, {//將顯示的資料内容給予顯示的div             series: {                 pie: {                     show: true,                     radius: 1,                     label: {                         show: true,                         radius: 1,                         formatter: labelFormatter,                         background: {                             opacity: 0.8                         }                     }                 }             },             legend: {                 show: false             }         });      })   </script>  在EEPManager中將這個頁面掛在Menu上並且設定許可權,然後通過VS開啟Logon.aspx登陸瀏覽這個頁面。 
 結語 以上是EEP結合Flot外掛程式繪製柱狀圖和餅狀圖的簡易範例,在設計專案的過程中我們可能不是如此簡單的單一幅圖,也可能並不是使用flot外掛程式,但是方法是通用的。以此範例抛磚引玉,可以看出此類控件的3個重點,第一加入需要使用到的js引用;第二,設定先是圖表的div,注意infolight-option裏設定顯示統計圖的資料源以及圖表上的所要顯示的欄位;第三,通過js程式讀取div上設定的資料源以及顯示欄位(讀取後轉成JSON格式),并將其内容顯示在div上。由此可見,利用EEP的N-Tier架構從Server端獲取到資料之後,前端只要將資料轉換成需要的資料形式(如JSON)交給繪圖外掛組件,就能輕鬆完成統計圖表了。 |