|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
fenton
註冊時間: 2003-09-16 文章: 2
第 1 樓
|
發表於: 星期四 十月 23, 2003 10:14 am 文章主題: 如何讓表單中的編號自動產生... |
|
|
請教一下各位先進我如何要在表單中的primary key...編號的數值自動產生
第二個問題...在設計表單時,測驗表單會輸入記錄,但我希望這筆記錄永久刪除,並且其編號可以讓我再度使用,但我以前在用foxpro4時,記錄刪除在瀏覽時會有一個標記反黑記錄已刪除,表示不存在,但有沒有程式碼或其他設定功能可讓這樣的需求達成....
謝謝大家.... |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2157
第 2 樓
|
發表於: 星期四 十月 23, 2003 11:25 am 文章主題: |
|
|
set dele on &&--不顯示已刪除的記錄
sele myfile
mprimary = lastnumber( 'myfile' , 'keyfield' )
appe blank
repl keyfield with mprimary + 1 &&--主鍵值
return
***************************
func lastnumber
lpara mfile, mprimarykeyfield &&--傳來查詢的檔名,及要查詢最大值的欄位
local mold_alias, mret
mold_alias = alias()
select max(&mprimarykeyfield) as mmaxnumber from &myfile into cursor zlastnumber
mret = mmaxnumber
use
select (mold_alias)
return mret _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
Bill Chen
註冊時間: 2003-06-09 文章: 30
第 3 樓
|
發表於: 星期四 十月 23, 2003 9:21 pm 文章主題: |
|
|
Q1. 我的做法是在stored procedure中加入以下function
function getSeqId(strtablename,strfieldname)
select max(&strfieldname)+1 as intMaxid from &strtablename into cursor maxtable
go top
if maxtable.intmaxid = null
return 1
else
return intMaxid
endif
endfun
然後在primary key field 的default value 設定為 getSeqId("tablename","fieldname)
Q2. 我認為不要delete 記錄, 因table must be exclusive mode 才可卌除, 在primary key index setting 的 filter 加上 .not. delete(), 這樣便可再使用該number. |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2157
第 4 樓
|
發表於: 星期五 十月 24, 2003 11:50 am 文章主題: |
|
|
Bill Chen 所用的程式算是高級做法, 也是不錯的方法. ^^ _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
juliana
註冊時間: 2003-11-04 文章: 2
第 5 樓
|
發表於: 星期二 十一月 04, 2003 4:54 pm 文章主題: |
|
|
雖然問題不是我po的,但我也正在為它煩惱,
感謝garfield及Bill Chen的回覆,讓我找到解答!
Thanks a lot! |
|
回頂端 |
|
|
tintin0311
註冊時間: 2003-12-05 文章: 2
第 6 樓
|
發表於: 星期五 十二月 05, 2003 9:34 pm 文章主題: |
|
|
對於大家的回應我很感謝~~~
可是因為我是個新手,對於foxpro我不熟悉,所以不知道是不是可以麻煩在旁幫我註解每一行動作的中文意思~~~~
非常感謝大家~~~ |
|
回頂端 |
|
|
elleryq
註冊時間: 2007-06-21 文章: 768
第 7 樓
|
發表於: 星期一 十二月 08, 2003 9:06 am 文章主題: |
|
|
可否先自行查閱 Help, 若有不明白的地方再上來問??
這樣學習上會比較快~ |
|
回頂端 |
|
|
jms7275
註冊時間: 2005-01-08 文章: 65
第 8 樓
|
發表於: 星期三 二月 02, 2005 4:02 pm 文章主題: |
|
|
想請教garfield ,Bill兩位大大
寫在觸發中的自動產生序號function
如果同一時間有n位使用者剛剛好同時按下新增資料
是否會有序號衝突現象,還是會自動避掉
雖然這種情況很少見
感謝 |
|
回頂端 |
|
|
jms7275
註冊時間: 2005-01-08 文章: 65
第 9 樓
|
發表於: 星期四 二月 03, 2005 1:47 pm 文章主題: |
|
|
jms7275 寫到: | 想請教garfield ,Bill兩位大大
寫在觸發中的自動產生序號function
如果同一時間有n位使用者剛剛好同時按下新增資料
是否會有序號衝突現象,還是會自動避掉
雖然這種情況很少見
感謝 |
自答一下
弟試過Bill大的作法,BufferMode=3,如果放在欄位的預設值
會發生不同使用者若先後各新增一筆資料,均尚未存檔,會得到相同的序號
而讓比較後儲存的資料,儲存失敗
放在table新增時的觸發,則沒有試過,弟對觸發式程序的語法不太熟
搜尋到這篇,弟試過小賴大的做法,問題解決了
http://vfp.sunyear.com.tw/viewtopic.php?t=2164&highlight=%B9J%A8%EC%C0Y%B5h%AA%BA%B0%DD%C3D%7E%A6h%A4H%A8%CF%A5%CE%A4%40%AEM%B3n%C5%E9%7E
jms7275 在 星期四 二月 03, 2005 3:50 pm 作了第 2 次修改 |
|
回頂端 |
|
|
bin1x
註冊時間: 2004-08-27 文章: 462
第 10 樓
|
發表於: 星期四 二月 03, 2005 2:24 pm 文章主題: |
|
|
插句話一下
如果想有前置0的做法
如何做 |
|
回頂端 |
|
|
bigear
註冊時間: 2004-12-19 文章: 162 來自: 網路的另一端
第 11 樓
|
|
回頂端 |
|
|
bin1x
註冊時間: 2004-08-27 文章: 462
第 12 樓
|
發表於: 星期四 二月 03, 2005 5:50 pm 文章主題: |
|
|
會問這個問題的原因
是因為最近是寫informix
結果它的資料型態字元和數字分不清
可以字元可運算成數字
而數字卻無法以字串相加來運算
所以前置0的問題就出來了,小問題而已啦
提出來玩玩 |
|
回頂端 |
|
|
小賴
註冊時間: 2004-12-27 文章: 470
第 13 樓
|
發表於: 星期五 二月 04, 2005 1:25 am 文章主題: |
|
|
TO Jms7275兄
之前見諸位先進在探討流水號問題特別擁躍, 尤其是在多人使用的環境下;
覺得目前公司使用的方法不錯用, 既不用使用高深的程式技巧, 又可同時
解決諸多的流水號問題, 一時技癢, 隨手寫下幾行重點; 現在再看, 自己都
很難了解, 不料你竟能參悟, 我實在服了你,一個好的程式邏輯, 要比高深的
程式技巧重要,你我也算有緣, 在此詳述我的作法, 也好讓你的作法作個印證;
如有不好之處或有更好的邏輯亦請不吝指教.
1. 首先需有一個資料表格記錄所有需要流水號的資料表格
Table Name : AutoNo Order By ProNo
資料表格代號 資料表格名稱 目前流水號 位數 是否依日期 最後日期
ProNo ProName NO Num IfDate DATE1
========================================
A01 出貨單 325 7 0
A02 採購單 754 6 1 01/09/2005
A03 客戶訂單 356 7 0
B01 製令單 456 5 0
.
.
.
2. 寫一自訂函數ZeroStr() 依AutoNo.Num 位數處理前罝 0
例如 A01 出貨單 之Num欄位為7 必須傳回 0000325
即 ZeroStr(AutoNo.NO, AutoNo.Num) = "0000325"
********************************************************
* ZeroStr 傳回指定位數含前置 0 之文數值資料 *
* *
* 參數: *
* NUMA 要傳進之數字 N *
* NUMB 要傳進之位數 N *
* 返回值: STR *
********************************************************
FUNCTION ZEROSTR
PARAMETER NUMA, NUMB
LOCAL NUMC
NUMC = LTRIM(STR(NUMA))
RETURN REPLICATE("0", NUMB - LEN(NUMC)) + NUMC
3. 接下來就是本法之重點
你必須自訂一函數 GetAutoNo(), 並利用AutoNo資料表格在多人環境下
取得你要的流水號 ; 以下請容僅述重點
FUNCTION GetAutoNo
PARAMETER ProNo && 傳進你想取得流水號之
LOCAL GoBackAlias, ReturnNoStr && 資料表格編號
ReturnNoStr = "" && 如 A03 代表客戶訂單
GoBackAlias = ALLTRIM(STR(SELECT())) &&先記住目前工作區
IF SELECT("AutoNo") != 0 && AutoNo 己開啟
SELECT AutoNo
SET ORDER TO TAG PRONO
ELSE
USE AutoNo && 開啟AutoNo
SET ORDER TO TAG PRONO
ENDIF
SEEK ProNo && 移動AutoNo之指標至你欲取得流水號筆數
IF ! FOUND() && 如 ProNo = "A03" 將移至第3筆客戶訂單
SELECT &GoBackAlias && 失敗時反回原工作區並傳回 ""
RETURN ReturnNoStr
ENDIF
DO WHILE ! RLOCK() &&&&&&&& 這裡是重點
INKEY(1) && 進行記錄鎖定, 成功者才有權取走客戶訂單356
ENDDO && 否則表示其他人正在取得編號, 此時每秒再
. && 進行鎖定直到成功為止
.
.
IF IfDate = 1 AND (Date1 != DATE())
REPLACE Date1 WITH DATE()
REPLACE NO WITH 1
ENDIF
. && AutoNo 之IfDate = 1 代表流水號每日將從1開始
. && IfDate1 = 2 則代表 流水號每月初將從1開始
. && IfDate1 = 3 則代表 流水號每年一月一日將從1開始. && Date1則記錄最後一次取得日期; 因為有些單據
. && 號碼希望是 年月+流水號 或年月日+流水號.......
. && 程序中只列 日期+流水號, 其他請自行Codeing
.
.
REPLACE NO WITH IIF(EMPTY(NO), 1, NO) && 開始時序號從 1 開始
ReturnNoStr = ZeroStr(NO, NUM) && 取得流水號後依Auto.Num位數
REPLACE NO WITH NO + 1 && 進行前置0處理
. && 並將 No+1 待下次或他人取用
.
.
UNLOCK && 最後記得解除鎖定別人才可取得下一流水號
SELECT &GoBackAlias && 並反回原先工程區
RETURN ReturnNoStr
4. 此方式之好處
A. GetAutoNo() 函數不論你是使用存檔前決定流水號
或是先決定單據流水號使用者再進行輸入都可用
B. 整個系統不論有多少單據或新增單據只影響AutoNo
之筆數, 並無其他程序碼, 程式可攜性高
C. 可多人同時取走不同單據流水號( 因為只作記錄鎖定)
想像AutoNo為流水號服務中心,有N筆資料代表N條等侯
服務線, 每條服務線, 同一時間只能服務一個客人, 但
是同一時間卻有多人在不同等侯線接受服務
D. 只要作一個 Form 與 Grid 便可管理所有單據的流水號
當然 Grid.RecordSource = "AutoNo"
好了 ! 上次只描述個作法概述你都能參悟, 現在應該更清楚了
想不到為程式註解真的比寫程式累很多, 再強調一次;有更好的
方法不要忘記與我分享 |
|
回頂端 |
|
|
bin1x
註冊時間: 2004-08-27 文章: 462
第 14 樓
|
發表於: 星期五 二月 04, 2005 9:45 am 文章主題: |
|
|
哈
第一次看到用ltrim和replicate 函數作的
我看到的是用alltrim+padl 來做的
也許在這邊可看到各種不同的作法
有趣 |
|
回頂端 |
|
|
jms7275
註冊時間: 2005-01-08 文章: 65
第 15 樓
|
發表於: 星期五 二月 04, 2005 10:12 am 文章主題: |
|
|
小賴 寫到: | TO Jms7275兄
之前見諸位先進在探討流水號問題特別擁躍, 尤其是在多人使用的環境下;
覺得目前公司使用的方法不錯用, 既不用使用高深的程式技巧, 又可同時
解決諸多的流水號問題, 一時技癢, 隨手寫下幾行重點; 現在再看, 自己都
很難了解, 不料你竟能參悟, 我實在服了你,一個好的程式邏輯, 要比高深的
程式技巧重要,你我也算有緣, 在此詳述我的作法, 也好讓你的作法作個印證;
如有不好之處或有更好的邏輯亦請不吝指教.
好了 ! 上次只描述個作法概述你都能參悟, 現在應該更清楚了
想不到為程式註解真的比寫程式累很多, 再強調一次;有更好的
方法不要忘記與我分享 |
小賴大哥您好
感謝您的熱情指導,大哥過獎了
弟所想到的沒有您周詳,會再做擴充與印證,
實際作過一個系統,深深體驗到開發人員的辛苦,
也發現許多書上沒有提到的問題點,
不過真的學到很多,
尤其觀摩版上各位大哥前輩的經驗,
更是一種很棒的體驗 |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|