這兩天按要求新增了一支程式WOT150:每日交易、放行時間設定作業。做的過程中,遇到几個瓶頸,不過通過大腦思考和查資料,最后還是順利完成了。這里記錄下來,好下次遇到同樣的問題時有個參考。
要新增的程序是很簡單的,只是完成對資料的新增、修改、刪除的功能就OK了,關鍵是要用設定的時間去控制所有的交易程序和放行程序。
1. 新建資料表,這個最簡單。
2. 新建程式,程式主要是設定每日交易、放行的時間段的。主要維護交易別(01:基金,02:定存,03:股票交易,04:股票受益,05:活存受益),每日交易時間起迄和每日放行時間起迄,對于時間,我在數據庫中設置的是位長度,精確到分。先拉好畫面,再寫個查詢,改改SourceCode就完成了。不過,既然涉及到起迄了,就得判斷‘起’不能大于‘迄’了,這個判斷我是在前台的HTML里面做的。因為畫面上時間的小時部分和分鐘部分是分開的,所以需要先將它們進行字符串相加,然后再比較。在進行字符串相加的時候,當字符串的長度是1的時候,還需要將它前面補‘0’,比如8:8,相加的時候就需要變成0808才對。<這個字符串相加也花了不少時間呢。>
3. 在數據庫中撰寫Function,傳入參數有BusinType,TxTypeID,NowTime,KindType,其中,BusinType 為業務別,TxTypeID為交易別,NowTime為現在時間,KindType為判斷種類(0:判斷交易時間,1:判斷放行時間)。要求當NowTime 不在設定的時間範圍中則回傳false,當NowTime在設定的時間範圍中則回傳True。這個嘛,數據庫中好像沒有boolean型哦,只有個bit型可以表示0和1,但是要回傳True和False,還得轉換才行。想想,就讓函數Return一個Varchar吧,讓這個Varchar等于True和False。呵呵,反正能解決問題就行了。完整SQL語句如下:
/***************************************************************
**CreateDate:2007/05/09
**Author :yangyongli
**參數說明 :BusinType 業務別
** TxTypeID 交易別
NowTime 現在時間
KindType 判斷種類(0:判斷交易時間,1:判斷放行時間)
**函數目的 :當NowTime不在設定的時間範圍中則回傳False
當NowTime在設定的時間範圍中則回傳True
***************************************************************/
CREATE Function dbo.fCheckTradeTime
(@striBusinType Varchar(2) --業務別
,@striTxTypeID Varchar(2) --交易別
,@striNowTime Varchar(4) --現在時間
,@striKindType Varchar(1)) --判斷種類
Returns Varchar(5)
/***************************************
Declare @striBusinType Varchar(2)
Declare @striTxTypeID Varchar(2)
Declare @striNowTime Varchar(4)
Declare @striKindType Varchar(1)
Set @striBusinType = 'CT'
Set @striTxTypeID = '01'
Set @striNowTime = '0030'
Set @striKindType = '0'
***************************************/
As
Begin
Declare @strResult Varchar(5)
If @striKindType = '0' --0:判斷交易時間
Begin
If Not Exists(Select *
From WOTDB.dbo.TradeTimeSetting
Where 1 = 1
And BusinType = @striBusinType
And TxTypeID = @striTxTypeID
And TradeStartTime <= @striNowTime
And TradeEndTime >= @striNowTime)
Begin
Set @strResult = 'False'
End
Else
Begin
Set @strResult = 'True'
End
End
Else If @striKindType = '1' --1:判斷放行時間
Begin
If Not Exists(Select *
From WOTDB.dbo.TradeTimeSetting
Where 1 = 1
And BusinType = @striBusinType
And TxTypeID = @striTxTypeID
And PassStartTime <= @striNowTime
And PassEndTime >= @striNowTime)
Begin
Set @strResult = 'False'
End
Else
Begin
Set @strResult = 'True'
End
End
Return @strResult
End
4. 開始修改交易和放行程式了:
l 因為需要傳入當前的時間,所以得寫個方法獲得當前時間。
取得當前時間的SQL語句:Select convert(char,getdate(),108) NowTime
查詢結果形式為:17:19:58
所以,我可以用Substring來獲得小時 + 分鐘
string strResult = strNowTime.Substring(0, 2) + strNowTime.Substring(3, 2);
l 調用步驟3寫好的Function,寫一個方法CheckTradeTime(strBusinType, strTxTypeID, strNowTime, strKindType),判斷當前時間是否在設定時間區間內,返回值為bool型。
Select dbo.fCheckTradeTime(strBusinType, strTxTypeID, strNowTime, strKindType)
這條SQL語句執行會返回字符True或False。判斷這個值,就可以了。
l 交易的程序很好改,只要調用方法CheckTradeTime()就好了。
l 放行的程式就麻煩點了。因為放行是綜合放行,要放行所有的交易,而且會有多筆相同的交易,比如有2筆基金的交易要放行,但是我只能出一個提示說“基金交易不在設置、定的基金交易放行區間內!”。所以得去掉重復記錄呀。這個問題可花了我一個下午的時間呢,終于解決了。
Spread中勾選的資料存放在一個DataSet dstCheck中,所以dstCheck中就有可能會有重復的交易類型。本來想利用dstCheck.Tables[0].Select("Distinct TxName like ‘*’","TxName")的方法選擇出交易類型,可是行不通,總是出錯,而且好象不能這么用,將Distinct去掉,雖然不出錯了,但是卻不能去掉重復記錄,只好放棄。
然后就想,我先定義一個新的DataSet dstTxName吧,往dstTxName里面添加兩個字段:TxName和IsExist,TxName用來記錄交易類型,IsExist用來記錄該交易是否存在,0代表不存在,1為代表存在,默認值為‘0’。然后,手動往dstTxName中添加5筆記錄,TxName分別為01,02,03,04,05,IsExist為默認值‘0’。接著,循環判斷dstCheck的TxName,如果為’01’,則修改dstTxName中TxName為’01’的記錄,將其IsExist值修改為’1’。這樣子好像是可行的,但是,問題又來了,我該怎么找到dstTxName中TxName為’01’的那筆記錄并且修改它。只好又放棄,重新思考,另尋它路咯。。。
既然DataSet我沒辦法處理,我為什么不把它放到我能夠處理的數據類型里面呢,比如說數組。嗯,完全可以試一下的嘛。首先,找個去除數組中重復數據的方法Distinct,經過測試可行。然后,就循環將dstCheck的TxName存放到一個數組中,交給Distinct方法去做,這不就OK了嗎!
首先,寫一個去除數組中重復數據的方法Distinct,代碼如下:
//將數組strSource去除重復數據,將結果存到ArrayList中
public ArrayList Distinct(string[] strSource)
{
//string[] stest = new string[]{"aaa","bbb","ccc","aaa","ccc"};
ArrayList list = new ArrayList();
for(int i = 0; i < strSource.Length; i++)
{
bool bolIsExist = true;
for(int j = 0; j < list.Count; j++)
{
if(list[j].ToString() == strSource[i])
{
bolIsExist = false;
break;
}
}
if(bolIsExist)
list.Add(strSource[i]);
}
return list;
}
接著,將dstCheck的TxName存放到一個數組中,然后調用Distinct方法去除數組中重復數據,代碼如下:
//1.取得dstCheck的TxName值,存在數組strTxID[]中
int RowNo = dstCheck.Tables[0].Rows.Count;
string[] strTxID = new string[RowNo];
for(int i = 0; i < dstCheck.Tables[0].Rows.Count; i++)
{
strTxID[i] = dstCheck.Tables[0].Rows[i]["TxName"].ToString().Substring(0, 2);
}
//2.去除數組中重復數據
ArrayList arrTxID = Distinct(strTxID);
最后,循環arrTxID就可以了,用下面語句取得arrTxID中的值:
for(int i = 0; i <= arrTxID.Count - 1; i++)
{
string strTxName = arrTxID[i].ToString();
if(strTxName.Trim() == "01") //基金交易
{
……………………………
}
}
l 好了,完成了。
5.大功告成,可以安心過周末了。。。呵呵。。。