 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
catjoke
註冊時間: 2003-06-16 文章: 175 來自: 香港
第 1 樓
|
發表於: 星期五 一月 02, 2004 3:50 pm 文章主題: 裝箱單 - 箱單檢查問題 |
|
|
訂單明細中, 有一欄是 箱號: CTN_NOS C(30)
例子:
ITEM CTN_NOS
產品A 003,005-008
產品B 004,007-012
產品C 014,016,020-030
....
你也知道, 裝箱是 工人做的, 如果一張裝箱單內有很多資料, 箱號可能會有 錯亂...
就舉上面的例子, 如果用程式去 檢查, 要得出以下的結果:
箱號 範圍: 003-014,016,020-030
重疊 箱號: 007-008
缺欠 箱號: 013,015,017-019
以便 操作員 可以仔細檢查有問題的箱號, 以免遺漏 箱號..
這麼多 錯亂的資料, 只可能由電腦去尋找 錯誤, 怎樣寫好呢!?
這是一個很實際, 很實用的問題, 請幫幫忙~ _________________ 喵喎~ 貓當然是 "茅" 的嘛! ^0^; |
|
回頂端 |
|
 |
朱育興
註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
第 2 樓
|
發表於: 星期五 一月 02, 2004 11:41 pm 文章主題: |
|
|
* 為求排版美觀,空白為全形,若要測試,請轉為半形後再測試
* 條件評估及定出規則
* 1.假設你的訂單明細之 Alias 為 Detail
* 2.假設箱號範圍 001 到 999,每一個箱號都是 C(3)
* 3.假設 CTN_NOS 都是如你所舉例的樣式,且由小排到大
* 4.若有不符你的要求,那就由你自己去變通
* 5.你的結果中:
* 箱號 範圍: 003-014,016,020-030
* 要修正為
* 箱號 範圍: 003-012,014,016,020-030
* 前置作業
* > 測試資料
SELECT 0
CREATE CURSOR Detail ;
(ITEM C(6), CTN_NOS C(30))
APPEND BLANK
REPLACE ITEM WITH "產品A"
REPLACE CTN_NOS WITH "003,005-008"
APPEND BLANK
REPLACE ITEM WITH "產品B"
REPLACE CTN_NOS WITH "004,007-012"
APPEND BLANK
REPLACE ITEM WITH "產品C"
REPLACE CTN_NOS WITH "014,016,020-030"
* >
SELECT 0
CREATE CURSOR TMP_Sort ;
(BoxNo C(3),Total N(3))
INDEX ON BoxNo TAG TAG01
* 整理
SELECT Detail
SCAN ALL
M_cThisLine = "," + ALLTRIM(Detail.CTN_NOS) + ","
M_nCommaTotal = OCCURS(",",M_cThisLine) - 1
SELECT TMP_Sort
FOR W1_nSUB_A = 1 TO M_nCommaTotal
M_cNoString = STREXTRA(M_cThisLine,",",",",W1_nSUB_A)
DO CASE
CASE LEN(M_cNoString) = 3 && 像 003 這種形式
IF !SEEK(M_cNoString)
APPEND BLANK
REPLACE TMP_Sort.BoxNo WITH M_cNoString
ENDIF
REPLACE TMP_Sort.Total WITH TMP_Sort.Total+1
CASE LEN(M_cNoString) = 7 && 像 003-008 這種形式
M_nStNo = VAL(SUBSTR(M_cNoString,1,3))
M_nEnNo = VAL(SUBSTR(M_cNoString,5,3))
FOR W1_nSUB_B = M_nStNo TO M_nEnNo
MM_cBoxNo = TRANSFORM(W1_nSUB_B,"@L 999")
IF !SEEK(MM_cBoxNo)
APPEND BLANK
REPLACE TMP_Sort.BoxNo WITH MM_cBoxNo
ENDIF
REPLACE TMP_Sort.Total WITH TMP_Sort.Total+1
ENDFOR
ENDCASE
ENDFOR
ENDSCAN
* 歸納
DIMENSION M_aResult(3,2)
STORE SPACE(0) TO M_aResult
SELECT TMP_Sort
SCAN ALL
* > Set Relation
M_cBoxNo = TMP_Sort.BoxNo
* > 箱號範圍 與 重疊箱號
FOR W1_nSUB_A = 1 TO 2 && 1:箱號範圍 2:重疊箱號
* > Set Filter
IF W1_nSUB_A = 2
IF TMP_Sort.Total <= 1
LOOP
ENDIF
ENDIF
* >
DO CASE
CASE EMPTY(M_aResult(W1_nSUB_A,2))
M_aResult(W1_nSUB_A,1) = M_cBoxNo
CASE VAL(M_cBoxNo) - VAL(M_aResult(W1_nSUB_A,2)) = 1
IF !RIGHT(M_aResult(W1_nSUB_A,1),1) = "-"
M_aResult(W1_nSUB_A,1) = M_aResult(W1_nSUB_A,1) + "-"
ENDIF
OTHERWISE
IF RIGHT(M_aResult(W1_nSUB_A,1),1) = "-"
M_aResult(W1_nSUB_A,1) = M_aResult(W1_nSUB_A,1) + M_aResult(W1_nSUB_A,2)
ENDIF
M_aResult(W1_nSUB_A,1) = M_aResult(W1_nSUB_A,1) + "," + M_cBoxNo
ENDCASE
M_aResult(W1_nSUB_A,2) = M_cBoxNo
ENDFOR
* > 缺欠箱號
IF !EMPTY(M_aResult(3,2))
IF VAL(M_cBoxNo) - VAL(M_aResult(3,2)) > 1
M_cStLoseNo = TRANSFORM(VAL(M_aResult(3,2))+1,"@L 999")
M_cEnLoseNo = TRANSFORM(VAL(M_cBoxNo)-1,"@L 999")
IF !EMPTY(M_aResult(3,1))
M_aResult(3,1) = M_aResult(3,1) + ","
ENDIF
M_aResult(3,1) = M_aResult(3,1) + M_cStLoseNo
IF !M_cStLoseNo == M_cEnLoseNo
M_aResult(3,1) = M_aResult(3,1) + "-" + M_cEnLoseNo
ENDIF
ENDIF
ENDIF
M_aResult(3,2) = M_cBoxNo
ENDSCAN
* 補齊
FOR W1_nSUB_A = 1 TO 2
IF RIGHT(M_aResult(W1_nSUB_A,1),1) = "-"
M_aResult(W1_nSUB_A,1) = M_aResult(W1_nSUB_A,1) + M_aResult(W1_nSUB_A,2)
ENDIF
ENDFOR
* 結果
? "箱號 範圍:"+M_aResult(1,1)
? "重疊 箱號:"+M_aResult(2,1)
? "缺欠 箱號:"+M_aResult(3,1)
* 後記
* 我這只是傳統寫法,不知可不可以用 SQL 的方式來找答案?我是找不出該如何用 SQL 寫(功力太淺) |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|