大大毛 的笔记

  DDM's Note

哪怕没有办法一定有说法,
就算没有鸽子一定有乌鸦,
固执无罪 梦想有价,
让他们惊讶.

posts - 14, comments - 23, trackbacks - 0, articles - 58
   :: 首页 ::  :: 联系 ::  :: 管理
前言
      上回提到過的架構及一些細節上的分析,馬上(時隔2天)就要拉出來蹓蹓了。這次的起因是需求變動。對頁面的顯示效果進行變更。

需求變動:
      要求將相同職場的單位進行合併,以前產出的記錄集會是這樣:
職場單位職場其它信息
Unit1AA001....
Unit2AA001....
Unit3AA002....
      現在頁面要顯示成這樣:
職場單位職場其它信息
Unit1,Unit2AA001....
Unit3AA002....

思考及方案選擇:
      這次的變動算是不大,對邏輯沒有影響,難度較低,可選方案有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列放寬後,終於...掛了。

评论

# re: 複雜SQL語句的構建以及內部的封裝調試--續章1(視圖變更)  回复  更多评论   

2007-07-02 19:47 by 大大米
路过,顺便浇下水~``

只有注册用户登录后才能发表评论。


网站导航:
 

i am ddm