Posted on 2007-02-09 12:52
大大毛 閱讀(348)
評論(1) 編輯 收藏 所屬分類:
SQL
前言:
??????上回提到過的架構(gòu)及一些細節(jié)上的分析,馬上(時隔2天)就要拉出來蹓蹓了。這次的起因是需求變動。對頁面的顯示效果進行變更。
需求變動:
??????要求將相同職場的單位進行合併,以前產(chǎn)出的記錄集會是這樣:
職場單位 | 職場 | 其它信息 |
---|
Unit1 | AA001 | .... |
Unit2 | AA001 | .... |
Unit3 | AA002 | .... |
??????現(xiàn)在頁面要顯示成這樣:
職場單位 | 職場 | 其它信息 |
---|
Unit1,Unit2 | AA001 | .... |
Unit3 | AA002 | .... |
思考及方案選擇:
??????這次的變動算是不大,對邏輯沒有影響,難度較低,可選方案有2個。
??????1. 直接修改視圖,例如在ASP頁面中對產(chǎn)出記錄集的職場單位字段按職場實施合併;
??????2. 在產(chǎn)出記錄集前實施修改,例如在VB的DLL代碼中增加處理。
??????沒有什麼可以盤旋的余地,直接選擇方案2,原因是
??????a. 模塊的視圖掛了兩種,一種是ASP頁面的“預覽”,另一種是Excel數(shù)據(jù)文件的產(chǎn)出,方案1的變更需要在多處進行。
??????b. 留下適應再次變更的余地。
實施細節(jié):
??????這次的變更屬於視圖層的變更,不需要去變更實現(xiàn)邏輯,因此不會考慮去變更實施邏輯的SQL(而且SQL也不擅長解決此類問題),采取體外手術(shù)的方式解決。
??????實施的流程示例:
????????????SQL->原RS->處理(適應這次的需求變更)->新RS->產(chǎn)出
??????這樣一來改動的影響會是極其特別以及肯定的非常小,在cls中增加功能函數(shù)就好。
代碼:
??????在原來的功能模塊fGetFreePlace中插入一行
????If?pretreatmentRsPlace(rsPlace)?=?False?Then?GoTo?ErrHandler
??????增加的處理FUNCTION,為能重復使用分割成2個了(cloneRsFrame是準備以後復用的)。
''****************************************************************************************************
'*程式功能??:???????預處理"待退(閒置)租約資料報表"所需的職場記錄集
'*功能說明??:???????現(xiàn)階段要求將相同"職場"?&&?"同狀態(tài)"的單位合併成一條記錄,單位檔合併成"單位1,單位2",以逗號分隔
'*開發(fā)人員??: ?????ddm?2006/12/17
''****************************************************************************************************
Private?Function?pretreatmentRsPlace(ByRef?rsPlace?As?Variant)?As?Boolean
On?Error?GoTo?ErrHandler
????Dim?rsResult?As?New?ADODB.Recordset
????Dim?tmpArr?As?Variant
????Dim?strCPlaceCode?As?String,?strFlagState?As?String,?strCUnitName?As?String
????Dim?strCPlaceCodeFlag?As?String,?strFlagStateFlag?As?String,?strCUnitNameList?As?String,?index?As?Long,?i?As?Long
????'如果源記錄集為空則返回
????If?rsPlace.EOF?Then
????????pretreatmentRsPlace?=?True
????????Exit?Function
????End?If
????'準備記錄集
????Set?rsResult?=?cloneRsFrame(rsPlace)
????If?rsResult?Is?Nothing?Then?GoTo?ErrHandler
????
????'變量初始化
????ReDim?tmpArr(rsResult.Fields.Count?-?1)
????strCPlaceCodeFlag?=?"i?am?ddm"
????strCUnitNameList?=?""
????index?=?0
????Do?While?Not?rsPlace.EOF
????????strCUnitName?=?Trim(rsPlace("CUnitName"))
????????strCPlaceCode?=?Trim(rsPlace("CPlaceCode"))
????????strFlagState?=?Trim(rsPlace("FlagState"))
????????'比較是否一條新的職場記錄,由於同一個單位既可能屬於"閒置",同時該職場在考察期也可能會"退租",因此分開
????????If?Not?((strCPlaceCodeFlag?=?strCPlaceCode)?And?(strFlagStateFlag?=?strFlagState))?Then
????????????If?index?=?0?Then
????????????????'第1條記錄,更新標識
????????????Else
????????????????'更新記錄集
????????????????rsResult.AddNew
????????????????For?i?=?0?To?rsResult.Fields.Count?-?1
????????????????????rsResult(i)?=?tmpArr(i)
????????????????Next
????????????????'使用合併單位名稱列表的值
????????????????rsResult("CUnitName")?=?strCUnitNameList
????????????????'清除單位列表,保存標識
????????????????strCUnitNameList?=?""
????????????End?If
????????????strCPlaceCodeFlag?=?strCPlaceCode
????????????strFlagStateFlag?=?strFlagState
????????Else
????????????'?do?nothing
????????End?If
????????'保存當前記錄
????????For?i?=?0?To?rsPlace.Fields.Count?-?1
????????????tmpArr(i)?=?rsPlace(i)
????????Next
????????'合併單位名稱
????????If?Len(strCUnitNameList)?<?1?Then
????????????strCUnitNameList?=?strCUnitName
????????Else
????????????strCUnitNameList?=?strCUnitNameList?&?",?"?&?strCUnitName
????????End?If
????????
????????index?=?index?+?1
????????rsPlace.MoveNext
????Loop
????'更新記錄集
????rsResult.AddNew
????For?i?=?0?To?rsResult.Fields.Count?-?1
????????rsResult(i)?=?tmpArr(i)
????Next
????'使用合併單位名稱列表的值
????rsResult("CUnitName")?=?strCUnitNameList
????
????'處理完畢,關(guān)閉源記錄集,返回處理過的記錄集
????If?rsPlace.State?=?1?Then?rsPlace.Close
????Set?rsPlace?=?rsResult
????rsPlace.MoveFirst
????
????pretreatmentRsPlace?=?True
????Exit?Function
ErrHandler:
????pretreatmentRsPlace?=?False
????objCommon.WriteErrLog?TheMdlName,?"pretreatmentRsPlace",?"克隆記錄集結(jié)構(gòu)異常",?Err.Number,?Err.Description
End?Function
'*****************************************************************************************************
'*程式功能??:???????克隆記錄集結(jié)構(gòu)
'*開發(fā)人員??:???????ddm?2006/12/19
'*異動人員
'*傳入值????:???????templetRs???????????--樣本記錄集
'*回傳值????:???????Recordset???????????--克隆記錄集
'*****************************************************************************************************
Public?Function?cloneRsFrame(templetRs?As?Variant)?As?ADODB.Recordset
On?Error?GoTo?ErrHandler
????Dim?newRs?As?New?ADODB.Recordset,?f?As?Field
????If?templetRs?Is?Nothing?Then
????????Set?cloneRsFrame?=?Null
????Else
????????Set?newRs?=?New?ADODB.Recordset
????????'克隆字段結(jié)構(gòu)
????????For?Each?f?In?templetRs.Fields
???????????newRs.Fields.Append?f.Name,?f.Type,?f.DefinedSize,?adFldIsNullable
????????Next
????????newRs.Open
????End?If
????Set?cloneRsFrame?=?newRs
????Exit?Function
ErrHandler:
????Set?cloneRsFrame?=?Nothing
????objCommon.WriteErrLog?TheMdlName,?"cloneRsFrame",?"克隆記錄集結(jié)構(gòu)異常",?Err.Number,?Err.Description
End?Function
後記:
??????算是一個小插曲,不過也是從這次的實現(xiàn)中(cloneRsFrame)受益。
??????後來USER增加了資料匯入的功能,當俺們完成後就發(fā)現(xiàn)不得不“適當”的修改一下表(僅僅是因為USER在Excel導入文件中某些列上寫了過多的說明而已),修改表是最簡單的那種,放列寬。
??????有兄弟的模塊中使用了這樣的代碼:
????Dim?rsPlace?as?new?ADODB.RecordSet
????rsPlace.Fields.Append?"CAddress",?adChar,?200
????rsPlace.AddNew
????rsPlace("CAddress")?=?Trim(rsSource("CAddress"))
???
.
??????當N列放寬後,終於...掛了。