2009/10/19

Google Chrome 的幽默


之前就有人提到Google map的路徑規劃會叫人游泳渡過太平洋、划獨木舟渡台灣海峽,沒想到今天Chrome也讓我開了眼界。

2009/06/19

Google app engine初體驗

成為Google忠實fans後,三不五時總會在Google軟體裡逛逛,今天無意間看到Google app engine,既然Google提供了大容量的網頁開發空間,又不用收費,當然要來試試看囉~

根據Google Code的指引,首先得安裝 Python 2.5.X版(app engine好像不支援3.0版)、App Engine SDK。
然後試了Google Code的步驟,一直會出現complie錯誤的訊息,直到按著孤影棧的方式,才成功看到Hello World:

http://www.dotblogs.com.tw/ajun/archive/2008/04/14/2912.aspx

只是以後得學習Python語法,真希望Google可以出C#版本,減少學習成本。
以後有空再來試試其他的了。

2009/05/26

自訂物件@Javascript

每次重頭開始寫javascript物件,都會忘了怎麼去寫 constructor。今天把範例放上來,以免以後又忘。

function test(width){
var myObj = new azObject(width) ;
alert(myObj.width);
myObj.enlarge(2);
alert(myObj.width);
}

function azObject(_width){
this.width = _width ;
this.enlarge = azEnlarge ;
}

function azEnlarge(plus){
this.width = this.width * plus ;
}

2008/03/06

工作流程的新體悟

今天早上在畫客戶的作業流程圖時,終於體認到現在Workflow在架構上的一個共同盲點--無法跨流程簽核。

從直覺上來看,不同系統之間的整合似乎不是Workflow應有的範圍,但從實務面的需求來看,Workflow往往成了各系統的啟動點,而且在簽核流程之中,似乎也會存在不同系統之間資料相互檢核的平台。舉例來說:員工想買一台電腦,採購申請單是啟動點,經過單位主管、採購部門、高階主管層層審核後同意採購,資料或先或後進入採購系統。等到貨物送來、收到發票,開票申請單又是一個啟動點,不論資料或先或後進入財會系統,但卻必須勾稽到採購系統的採購單。

問題就來了,到底要在財會系統做勾稽?還是在Workflow做?那採購系統如何更新採購狀態?有一種最簡單,也是最昂貴的作法-導入ERP。但一般ERP是沒有Workflow功能的,或只有簡單到不勘使用的簽核管理,整合的工作還是跑不掉。

另一種作法是客製MIS來做整合,因為額外導入的Workflow是不處理系統整合的。但在強調Reengineering的年代,不同作業流程中間的整合勢必無法避免,Workflow即然是處理流程的平台,理應替各個系統建立整合機制,以減少系統整合的開發工作。

看來Workflow軟體還有很大的成長空間。

2008/01/31

GridView事件執行順序@ASP.Net

在一個空白頁中置入GridView和一個Button後,當使用者按下按鈕後,各事件發生的順序如下:

Page GridView Button
------------ ------------ ------------
1 Init
2 Load
3 Load
4 RowCreated
5 RowDataBound
6 DataBound
7 Click
8 PreRender

2008/01/30

在空的GridView中顯示Header、Footer列@ASP.Net

因為GridView內建修改、刪除之功能,所以很多人利用GridView的Footer列,加入控制項,作為新增的功能。但因為GridView在沒有資料的時候,除了Empty Template外,不會顯示Header和Footer列,所以新增的功能就無效了。

有人直接利用Empty Template,加入FormView或DetailView作為新增的功能,但我覺得畫面上的不一致,容易造成使用者的困擾,執意要找出利用Footer列的方式。為此用Google找了一個晚上和早上,再加上 try 了半天,終於讓我摸索出最佳答案了。

方法是在GridView的PreRender事件中,判斷 Rows.Count 是否等於0,再執行下面這個函數。這樣利用Footer列做為新增資料的功能,就萬無一失了。

不過在執行階段時,新增資料後自動重新整理本頁時,因為GridView的DataSource還是我們虛擬的DataTable,因此不會顯示新增的記錄,故需在GridView1_Load中加入一段,改回原本的SqlDataSource。

public static void renderEmptyGridView(GridView EmptyGridView, string FieldNames)
{
//將GridView變成只有Header和Footer列,以及被隱藏的空白資料列
DataTable dTable = new DataTable();
char[] delimiterChars = {','};
string[] colName = FieldNames.Split(delimiterChars);
foreach (string myCol in colName)
{
DataColumn dColumn = new DataColumn(myCol.Trim());
dTable.Columns.Add(dColumn);
}
DataRow dRow = dTable.NewRow();

foreach (string myCol in colName)
{
dRow[myCol.Trim()] = DBNull.Value;
}
dTable.Rows.Add(dRow);

EmptyGridView.DataSourceID = null;
EmptyGridView.DataSource = dTable;
EmptyGridView.DataBind();
EmptyGridView.Rows[0].Visible = false;
}

        protected void GridView1_PreRender(object sender, EventArgs e)
{
if (GridView1.Rows.Count == 0)
{
renderEmptyGridView(GridView1, "FLOW_UID, FLOW_CODE, FLOW_NAME, FLOW_TYPE");
}

}

protected void GridView1_Load(object sender, EventArgs e)
{
//回復原本GridView的資料連結
GridView1.DataSource = null;
GridView1.DataSourceID = "SqlDataSource1";
}

2008/01/20

DataFormatString@ASP.Net

終於進入ASP.Net領域。
在GridView中設定資料格式可用DataFormatString屬性,但需先將HtmlEncode屬性設為false才能發揮作用。