  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		fenton
 
 
  註冊時間: 2003-09-16 文章: 2
 
  第 1 樓
  | 
		
			
				 發表於: 星期四 十月 23, 2003 10:14 am    文章主題: 如何讓表單中的編號自動產生... | 
				     | 
			 
			
				
  | 
			 
			
				請教一下各位先進我如何要在表單中的primary key...編號的數值自動產生
 
 
第二個問題...在設計表單時,測驗表單會輸入記錄,但我希望這筆記錄永久刪除,並且其編號可以讓我再度使用,但我以前在用foxpro4時,記錄刪除在瀏覽時會有一個標記反黑記錄已刪除,表示不存在,但有沒有程式碼或其他設定功能可讓這樣的需求達成....
 
 
謝謝大家.... | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		garfield Site Admin
  
  註冊時間: 2003-01-30 文章: 2160
 
  第 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 文章: 2160
 
  第 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 文章: 477
 
  第 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兄
 
 
之前見諸位先進在探討流水號問題特別擁躍, 尤其是在多人使用的環境下; 
 
覺得目前公司使用的方法不錯用, 既不用使用高深的程式技巧, 又可同時
 
解決諸多的流水號問題, 一時技癢, 隨手寫下幾行重點; 現在再看, 自己都
 
很難了解, 不料你竟能參悟, 我實在服了你,一個好的程式邏輯, 要比高深的
 
程式技巧重要,你我也算有緣, 在此詳述我的作法, 也好讓你的作法作個印證;
 
如有不好之處或有更好的邏輯亦請不吝指教.
 
 
    
 
         
 
好了 ! 上次只描述個作法概述你都能參悟, 現在應該更清楚了
 
想不到為程式註解真的比寫程式累很多, 再強調一次;有更好的
 
方法不要忘記與我分享 | 	  
 
 
小賴大哥您好
 
感謝您的熱情指導,大哥過獎了
 
弟所想到的沒有您周詳,會再做擴充與印證,
 
實際作過一個系統,深深體驗到開發人員的辛苦,
 
也發現許多書上沒有提到的問題點,
 
不過真的學到很多,
 
尤其觀摩版上各位大哥前輩的經驗,
 
更是一種很棒的體驗   | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |