這幾天小弟被要求要去對報表的數字是否正確,其實我心裡是千百個不願意~
一來對數字,我認為是USER的職責,
二來是報表的程式,註解少到用手指頭都算得出來,
小弟最討厭看這種不寫註解的程式。
果不其然,當報表數字有問題時,回去看程式的SQL追問題時,因為程式不易閱讀,讓小弟看的很痛苦。 以下是幾點建議。
1. 一個Sql可以完成的事,不必用兩個Sql
比如,我們要去更新表格A的總消費金額欄位(CONSUME_AMT),你會選擇 :
(a) 先下 Select A.CONSUME_AMT from A , 取出總金額到變數X,
然後 X = X+新消費金額, 再 UPDATE A set CONSUME_AMT=X 。
(b) 直接下 UPDATE A set CONSUME_AMT= (CONSUME_AMT+ 新消費金額)
這樣一看很明顯~~當然是選 (b)!!
這支程式很多Insert和Update都是用(a) ... 這樣也算了,但是它還犯了下面這個錯誤...
2. 避免直接拿DataTable.Rows[0][X]來組Sql:
假設我們有多個來源表格: A, B , 要把A, B的某些欄位放到C
第一個Sql : SELECT X, Y, Z ... FROM A
把結果放到 DataTable_A ~
第二個Sql : SELECT S, T, U ... FROM B
把結果放到 DataTable_B ~
然後Insert的Sql寫成這樣 :
String iSql = "INSERT INTO C (col02, col05, col01, ... )" +
"VALUES ( '"+ DataTable_A.Rows[0][15].ToString() +"','" +
DataTable_B.Rows[0][11].ToString() +"','" +
DataTable_B.Rows[0][0].ToString() +"','" +
DataTable_A.Rows[0][10].ToString() +"','" +
... );
好的,我們現在發現表格C的某個欄位有問題,我們要回去找來源的資料,
問題來了,我們會先去找iSql,找出對應的欄位值是 DataTable_A.Rows[0][10].ToString() ,
然後我們再回到 第一個Sql,開始去找這第十個欄位是哪一個A的欄位!!!
如果沒有整理好的DB schema,會超級浪費時間!!
如果多寫幾行程式碼:
DataRow dr_A = DataTable_A.Rows[0];
String sC_COL_01 = dr_A["X"].ToString();
String sC_COL_02 = dr_A["Y"].ToString();
....
String iSql = "INSERT INTO C (col02, col05, col01, ... )" +
"VALUES ( '"+ sC_COL_02 +"','" +
sC_COL_05 +"','" +
sC_COL_01 +"','" +
... );
要找C的某欄位,可以馬上找到對應的欄位值為 sC_COL_XX,
由sC_COL_XX是不是很快可以知道是從哪一個表格的哪一個欄位帶過來的嗎?
是不是節省了很多時間呢?
而且sC_COL_XX這些變數,都可以重複再使用~~
(待續...)
沒有留言:
張貼留言