VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

小技巧分享:2進位與10進位換算的某種用途

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Niles



註冊時間: 2004-12-07
文章: 53


第 1 樓

發表發表於: 星期日 九月 11, 2005 4:18 am    文章主題: 小技巧分享:2進位與10進位換算的某種用途 引言回覆

此想法是這樣由來的...
需求是:由總公司統一建立商品資料然後分別傳輸到多家分店,而且每一家分店需要的資料記錄不盡相同
過去一開始的處理方式是將不同分店各自需要的資料輸出成不同檔名的 table 作為區分方式
後來發現有更好的方法,就是在總公司的商品檔增加各分店的旗標欄位(如此每一家店會佔用一個 logic 欄位)
接下來的改良是只用一個字串欄位(寬255)作代表,然後對應分店的流水代號,取出此旗標欄位的第N個位元來判斷該筆紀錄是否要下傳至分店
最後的演變是只用一個整數欄位,寬度大約10就很夠用了,經由換算為2進位方式,就可取得第N個2進位數為1或0,效果會很類似上一個方法

*************************
Procedure _getBinStrFromInt
************************* 從整數值轉為二進位表示式的字串
Lparameters nInt,lReversed
Do Case
Case !Between(Parameters(),1,2)
Return '0'
Case Vartype(nInt) # 'N'
Return '0'
Case Vartype(lReverse) # 'L'
Return '0'
Endcase
Local cResult As String
Store '' To cResult
Do While !Empty(nInt)
If lReversed && 逆字串處理, 為了應用上的方便
Store cResult+Str(Mod(nInt,2),1) To cResult
Else
Store Str(Mod(nInt,2),1)+cResult To cResult
Endif
Store Int(nInt/2) To nInt
Enddo
Return cResult

補充說明,使用逆字串處理參數會更便利於此案例應用,因為2進位表示是是由右而左,但是我們習慣上是由左而右(分店1,分店2,分店3....)來判斷
如果資料下載成功要回寫旗標的話就必須改變二進位表示式的字串然後轉為數值傳回

*************************
Procedure _putBinStrToInt
************************* 從二進位表示式的字串轉為整數值
Lparameters cBinStr
Do Case
Case Parameters() # 1
Return 0
Case Vartype(cBinStr) # 'C'
Return 0
Endcase
Local nResult As Integer
Store 0 To nResult
Local i As Integer
For i = 1 To Len(cBinStr)
If !Inlist(Subs(cBinStr,Len(cBinStr)-i+1,1),'1','0',Space(1)) && 無效的二進位表示式字串
Wait Window "Invalid parameter [cBinStr]:"+cBinStr
Store 0 To nResult
Exit
Endif
Local nTMP As Integer
Store 1 To nTMP
Local j As Integer
For j=1 To i-1
Store nTMP*2 To nTMP
Endfor
Store Val(Subs(cBinStr,Len(cBinStr)-i+1,1))*nTMP + nResult To nResult
Endfor
Return nResult

結論: 此作法在許多的實務應用面來說的確是過於拐彎抹角 , 不過它幾乎不受分店數量的限制 . 此外當我們透過 Internet 去SQL Server
詢問某筆紀錄是否要傳回時 , SQL Server 回答的是一個簡短的整數 , 幾乎可以立即反應 , 因此更新的作業可以接近即時處理.
話雖如此 , 想必還有許多更好的方法或建議 , 還望大家不吝指教
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作