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

本文记录了新增一支用于设定每日交易及放行时间程序的过程,包括资料表与程式的建立、数据库Function的撰写以及交易与放行程式的修改等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

這兩天按要求新增了一支程式WOT150:每日交易、放行時間設定作業。做的過程中,遇到几個瓶頸,不過通過大腦思考和查資料,最后還是順利完成了。這里記錄下來,好下次遇到同樣的問題時有個參考。
       要新增的程序是很簡單的,只是完成對資料的新增、修改、刪除的功能就OK了,關鍵是要用設定的時間去控制所有的交易程序和放行程序。
1.   新建資料表,這個最簡單。
2.   新建程式,程式主要是設定每日交易、放行的時間段的。主要維護交易別(01:基金,02:定存,03:股票交易,04:股票受益,05:活存受益),每日交易時間起迄和每日放行時間起迄,對于時間,我在數據庫中設置的是位長度,精確到分。先拉好畫面,再寫個查詢,改改SourceCode就完成了。不過,既然涉及到起迄了,就得判斷‘起’不能大于‘迄’了,這個判斷我是在前台的HTML里面做的。因為畫面上時間的小時部分和分鐘部分是分開的,所以需要先將它們進行字符串相加,然后再比較。在進行字符串相加的時候,當字符串的長度是1的時候,還需要將它前面補‘0,比如88,相加的時候就需要變成0808才對。<這個字符串相加也花了不少時間呢。>
3.   在數據庫中撰寫Function,傳入參數有BusinTypeTxTypeIDNowTimeKindType,其中,BusinType 為業務別,TxTypeID為交易別,NowTime為現在時間,KindType為判斷種類(0:判斷交易時間,1:判斷放行時間)。要求當NowTime 不在設定的時間範圍中則回傳false,當NowTime在設定的時間範圍中則回傳True。這個嘛,數據庫中好像沒有boolean型哦,只有個bit型可以表示01,但是要回傳TrueFalse,還得轉換才行。想想,就讓函數Return一個Varchar吧,讓這個Varchar等于TrueFalse。呵呵,反正能解決問題就行了。完整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語句執行會返回字符TrueFalse。判斷這個值,就可以了。
l            交易的程序很好改,只要調用方法CheckTradeTime()就好了。
l            放行的程式就麻煩點了。因為放行是綜合放行,要放行所有的交易,而且會有多筆相同的交易,比如有2筆基金的交易要放行,但是我只能出一個提示說“基金交易不在設置、定的基金交易放行區間內!”。所以得去掉重復記錄呀。這個問題可花了我一個下午的時間呢,終于解決了。
Spread中勾選的資料存放在一個DataSet dstCheck中,所以dstCheck中就有可能會有重復的交易類型。本來想利用dstCheck.Tables[0].Select("Distinct TxName like *","TxName")的方法選擇出交易類型,可是行不通,總是出錯,而且好象不能這么用,將Distinct去掉,雖然不出錯了,但是卻不能去掉重復記錄,只好放棄。
然后就想,我先定義一個新的DataSet dstTxName吧,往dstTxName里面添加兩個字段:TxNameIsExistTxName用來記錄交易類型,IsExist用來記錄該交易是否存在,0代表不存在,1為代表存在,默認值為‘0然后,手動往dstTxName中添加5筆記錄,TxName分別為0102030405IsExist為默認值‘0。接著,循環判斷dstCheckTxName,如果為01,則修改dstTxNameTxName01的記錄,將其IsExist值修改為1。這樣子好像是可行的,但是,問題又來了,我該怎么找到dstTxNameTxName01的那筆記錄并且修改它。只好又放棄,重新思考,另尋它路咯。。。
既然DataSet我沒辦法處理,我為什么不把它放到我能夠處理的數據類型里面呢,比如說數組。嗯,完全可以試一下的嘛。首先,找個去除數組中重復數據的方法Distinct,經過測試可行。然后,就循環將dstCheckTxName存放到一個數組中,交給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;
         }
接著,將dstCheckTxName存放到一個數組中,然后調用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.大功告成,可以安心過周末了。。。呵呵。。。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值