去掉DataSet中重復記錄----好久沒動腦筋了

這兩天按要求新增了一支程式 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. 大功告成,可以安心過周末了。。。呵呵。。。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值