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

如何讓表單中的編號自動產生...
前往頁面 1, 2  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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! Smile
回頂端
檢視會員個人資料 發送私人訊息
tintin0311



註冊時間: 2003-12-05
文章: 2


第 6 樓

發表發表於: 星期五 十二月 05, 2003 9:34 pm    文章主題: 引言回覆

對於大家的回應我很感謝~~~
可是因為我是個新手,對於foxpro我不熟悉,所以不知道是不是可以麻煩在旁幫我註解每一行動作的中文意思~~~~

非常感謝大家~~~
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
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的做法
如何做
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
bigear



註冊時間: 2004-12-19
文章: 162
來自: 網路的另一端

第 11 樓

發表發表於: 星期四 二月 03, 2005 3:36 pm    文章主題: 引言回覆

bin1x 寫到:
插句話一下
如果想有前置0的做法
如何做


http://vfp.sunyear.com.tw/viewtopic.php?t=2159&highlight=

_________________
以上淺見,歡迎批評指教
________________________________________________
山不轉路轉,路不轉人轉,人不轉頭轉,頭不轉眼睛轉,眼睛不轉眼珠轉
眼珠再不轉就去睡覺,睡起來繼續轉
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
bin1x



註冊時間: 2004-08-27
文章: 462


第 12 樓

發表發表於: 星期四 二月 03, 2005 5:50 pm    文章主題: 引言回覆

會問這個問題的原因
是因為最近是寫informix
結果它的資料型態字元和數字分不清
可以字元可運算成數字
而數字卻無法以字串相加來運算
所以前置0的問題就出來了,小問題而已啦
提出來玩玩
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
小賴



註冊時間: 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 來做的
也許在這邊可看到各種不同的作法
有趣
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
jms7275



註冊時間: 2005-01-08
文章: 65


第 15 樓

發表發表於: 星期五 二月 04, 2005 10:12 am    文章主題: 引言回覆

小賴 寫到:
TO Jms7275兄

之前見諸位先進在探討流水號問題特別擁躍, 尤其是在多人使用的環境下;
覺得目前公司使用的方法不錯用, 既不用使用高深的程式技巧, 又可同時
解決諸多的流水號問題, 一時技癢, 隨手寫下幾行重點; 現在再看, 自己都
很難了解, 不料你竟能參悟, 我實在服了你,一個好的程式邏輯, 要比高深的
程式技巧重要,你我也算有緣, 在此詳述我的作法, 也好讓你的作法作個印證;
如有不好之處或有更好的邏輯亦請不吝指教.



好了 ! 上次只描述個作法概述你都能參悟, 現在應該更清楚了
想不到為程式註解真的比寫程式累很多, 再強調一次;有更好的
方法不要忘記與我分享


小賴大哥您好
感謝您的熱情指導,大哥過獎了
弟所想到的沒有您周詳,會再做擴充與印證,
實際作過一個系統,深深體驗到開發人員的辛苦,
也發現許多書上沒有提到的問題點,
不過真的學到很多,
尤其觀摩版上各位大哥前輩的經驗,
更是一種很棒的體驗 Wink
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2  下一頁
1頁(共2頁)

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


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