這兩天按要求新增了一支程式
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.
大功告成,可以安心過周末了。。。呵呵。。。