大大毛 的筆記

            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

          主站蜘蛛池模板: 五家渠市| 香格里拉县| 寻乌县| 尖扎县| 繁昌县| 桦甸市| 昌黎县| 榕江县| 百色市| 肃北| 阜南县| 青龙| 常山县| 南雄市| 牙克石市| 攀枝花市| 哈巴河县| 禹州市| 广东省| 安乡县| 高陵县| 宣威市| 德令哈市| 印江| 罗江县| 平果县| 大洼县| 延寿县| 宁城县| 岐山县| 石台县| 和林格尔县| 山阴县| 叙永县| 中阳县| 南陵县| 璧山县| 古交市| 涟源市| 普安县| 敦煌市|