Posted on 2007-02-09 12:52
大大毛 阅读(338)
评论(1) 编辑 收藏 所属分类:
SQL
前言:
上回提到過的架構及一些細節上的分析,馬上(時隔2天)就要拉出來蹓蹓了。這次的起因是需求變動。對頁面的顯示效果進行變更。
需求變動:
要求將相同職場的單位進行合併,以前產出的記錄集會是這樣:
職場單位 | 職場 | 其它信息 |
---|
Unit1 | AA001 | .... |
Unit2 | AA001 | .... |
Unit3 | AA002 | .... |
現在頁面要顯示成這樣:
職場單位 | 職場 | 其它信息 |
---|
Unit1,Unit2 | AA001 | .... |
Unit3 | AA002 | .... |
思考及方案選擇:
這次的變動算是不大,對邏輯沒有影響,難度較低,可選方案有2個。
1. 直接修改視圖,例如在ASP頁面中對產出記錄集的職場單位字段按職場實施合併;
2. 在產出記錄集前實施修改,例如在VB的DLL代碼中增加處理。
沒有什麼可以盤旋的余地,直接選擇方案2,原因是
a. 模塊的視圖掛了兩種,一種是ASP頁面的“預覽”,另一種是Excel數據文件的產出,方案1的變更需要在多處進行。
b. 留下適應再次變更的余地。
實施細節:
這次的變更屬於視圖層的變更,不需要去變更實現邏輯,因此不會考慮去變更實施邏輯的SQL(而且SQL也不擅長解決此類問題),采取體外手術的方式解決。
實施的流程示例:
SQL->原RS->處理(適應這次的需求變更)->新RS->產出
這樣一來改動的影響會是極其特別以及肯定的非常小,在cls中增加功能函數就好。
代碼:
在原來的功能模塊fGetFreePlace中插入一行
If pretreatmentRsPlace(rsPlace) = False Then GoTo ErrHandler
增加的處理FUNCTION,為能重復使用分割成2個了(cloneRsFrame是准備以後復用的)。
''****************************************************************************************************
'*程式功能 : 預處理"待退(閒置)租約資料報表"所需的職場記錄集
'*功能說明 : 現階段要求將相同"職場" && "同狀態"的單位合併成一條記錄,單位檔合併成"單位1,單位2",以逗號分隔
'*開發人員 : 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
'處理完畢,關閉源記錄集,返回處理過的記錄集
If rsPlace.State = 1 Then rsPlace.Close
Set rsPlace = rsResult
rsPlace.MoveFirst
pretreatmentRsPlace = True
Exit Function
ErrHandler:
pretreatmentRsPlace = False
objCommon.WriteErrLog TheMdlName, "pretreatmentRsPlace", "克隆記錄集結構異常", Err.Number, Err.Description
End Function
'*****************************************************************************************************
'*程式功能 : 克隆記錄集結構
'*開發人員 : 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
'克隆字段結構
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", "克隆記錄集結構異常", Err.Number, Err.Description
End Function
後記:
算是一個小插曲,不過也是從這次的實現中(cloneRsFrame)受益。
後來USER增加了資料匯入的功能,當俺們完成後就發現不得不“適當”的修改一下表(僅僅是因為USER在Excel導入文件中某些列上寫了過多的說明而已),修改表是最簡單的那種,放列寬。
有兄弟的模塊中使用了這樣的代碼:
Dim rsPlace as new ADODB.RecordSet
rsPlace.Fields.Append "CAddress", adChar, 200
rsPlace.AddNew
rsPlace("CAddress") = Trim(rsSource("CAddress"))
.
當N列放寬後,終於...掛了。