  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		h580920
 
 
  註冊時間: 2005-02-28 文章: 35
 
  第 1 樓
  | 
		
			
				 發表於: 星期六 四月 09, 2011 12:15 pm    文章主題: MySQL 的數值資料, 只要是 8.1 之值的資料, 即過濾不出來 | 
				     | 
			 
			
				
  | 
			 
			
				請教各位, 我最近遇到一個怪問題, 麻煩各位試試
 
1. 請在 mysql 上建立一個 numeric (8,2) 的欄位, 欄位名稱隨意 ex: qty
 
2. 新增一筆或數筆 8.1 之值的資料
 
3. 請下類似下面的 where 條件
 
n1=8.1
 
n2=8.1
 
where qty>=?n1 and qty<=?n2 
 
或
 
where qty BETWEEN n1 and n2 
 
則過濾結果會得空資料
 
 
但是只要是下面的情況之一, 就都可以過濾出資料
 
1. n1<>n2 值時
 
2. 只要 n1、n2 之值不等於8.1 時,  例如:9.1 or 7.1 .. 就都ok
 
3. 下	" where qty BETWEEN " + TRANSFORM(n1) + " AND " + TRANSFORM(n2)
 
4. 先將 n1 和 n2 之值轉換成「字串」ex: n1=tran(8.1) ... 就都 ok
 
 
我的 mysql = 5.0.51b   vfp=9.0  
 
 
不知是何原因? (嘗試過將 qty 欄位型態改成 decimal (8,2) 一樣結果) | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 2 樓
  | 
		
			
				 發表於: 星期六 四月 09, 2011 4:51 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				若方便
 
把您的資料庫傳上來看看 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		h580920
 
 
  註冊時間: 2005-02-28 文章: 35
 
  第 3 樓
  | 
		
			
				 發表於: 星期六 四月 09, 2011 5:33 pm    文章主題: 補上 mysql 的備份檔 .sql 和 測試碼 | 
				     | 
			 
			
				
  | 
			 
			
				測試的 TABLE 只有一個 QTY 的欄位, 欄位結構=decimal(8,2)
 
測試的程式如下
 
N1=8.1
 
N2=8.1
 
A1 = SQLEXEC(SnHAN, "SELECT * FROM TEST1 WHERE QTY>=?n1 AND QTY<=?N2 ", "TMP1") && SnHAN 是我在別支程式中所建立的連線通道
 
MESSAGEBOX(A1) && A1 = 1 (奇怪 A1 =1, 但是 TMP1 卻是無任何資料)
 
SELECT TMP1
 
BROWSE | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 4 樓
  | 
		
			
				 發表於: 星期六 四月 09, 2011 10:40 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				真是玄耶
 
我的測試結果也是一樣
 
 
還好我平常都不使用 ?n1 這種模式
 
不然, Bug 抓不完 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		h580920
 
 
  註冊時間: 2005-02-28 文章: 35
 
  第 5 樓
  | 
		
			
				 發表於: 星期六 四月 09, 2011 11:00 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				請問您不用 ?n1 方式, 那會是使用類似下面的方式嗎? 
 
"WHERE SIZE_D>=" + TRANSFORM(n1) + " AND SIZE_D<="+TRANSFORM(n2) 
 
此方式我測試是可以的
 
只是不曉得此問題是 VFP 還是 Mysql 的 bug
 
 	  | 引言回覆: | 	 		  
 
n1=8.1
 
n2=8.1
 
where qty>=?n1 and qty<=?n2
 
或
 
where qty BETWEEN n1 and n2
 
則過濾結果會得空資料 
 
 | 	  
 
修正 where qty BETWEEN n1 and n2
 
為 where qty BETWEEN ?n1 and ?n2 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		LiuRambo
 
 
  註冊時間: 2007-11-27 文章: 481
 
  第 6 樓
  | 
		
			
				 發表於: 星期六 四月 09, 2011 11:17 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				不好意思 插個話
 
 
用?是可以將外面的變數值 直接帶入到運算式嗎 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 7 樓
  | 
		
			
				 發表於: 星期日 四月 10, 2011 6:21 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				回 h580920 大大
 
我平常用的是如同您的
 
 "WHERE SIZE_D>=" + TRANSFORM(n1) + " AND SIZE_D<="+TRANSFORM(n2)  這個模式
 
 
我一直覺得,兩個系統之間的溝通,
 
越單純越好,直接丟『結果』過去,會比丟『變數』要好
 
 
至於問題是 VFP 還是 Mysql 的 bug?
 
這就很難說了
 
經我測試, vfp 傳給 Mysql 的 ?n1 和 ?n2
 
Mysql 接收到的參數是正確的,它是真真實實接收到 8.1
 
VFP 並沒有傳錯參數
 
 
不過,如果您在 mysql 上寫一段程式
 
 	  | 代碼: | 	 		  
 
CREATE DEFINER=`root`@`marco-desktop` PROCEDURE `proc_t`(in v1 decimal(8,2) , in v2 decimal(8,2))
 
begin
 
select * from test1 where qty between v1 and v2;
 
end;
 
 | 	  
 
 
然後,在vfp 中使用
 
 
 
這倒能正確查到資料
 
 
誰是誰非,真的說不清楚
 
有待高人指點了 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		h580920
 
 
  註冊時間: 2005-02-28 文章: 35
 
  第 8 樓
  | 
		
			
				 發表於: 星期一 四月 11, 2011 12:36 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				ckp6250 佩服您有先見之明, 還好我目前是將 SQLEXEC() 相關函數都包在「自訂函數」中使用, 或許在其中將 ? 傳入之值組合成字串, 應該可解決,否則就頭大了)
 
 
可否請教ckp6250, 關於 DATE 型態的欄位比對時, 您是否是以「日期字串」來比對處理 ex: date1='2010/01/01'
 
 
回 LiuRambo :我覺得應該是說 VFP 會將 ?所接變數內容傳給 SQL Server 
 
 
另外麻煩一下各位有使用 mssql 的人, 以同樣的資料和方法幫我側一下, 是否會有同樣情況
 
 
 
寫了一小段程式, 測試 UPDATE 是否一樣, 又發現不只 8.1 之值,  像 8.2 也一樣 (但是奇怪的是, 在事後對 8.2 之資料使用 ?方式下 UPDATE 又可以, 被搞混了), 目前測試是只有「小數位」的資料才會出錯, 其他「字元」或「日期」或「int」
 
都未發現
 
 
LOCAL M_NUM, M_MSG
 
M_MSG = ""
 
Q_NUM = 0
 
FOR M_I=1 TO 90
 
	Q_NUM = Q_NUM + 0.1
 
	N1=Q_NUM
 
	N2=Q_NUM
 
	M_OK1 = SQLEXEC(SnHAN, "INSERT INTO test.test1 (QTY, NO1) VALUES (?Q_NUM, 'AAA') ")
 
	IF M_OK1>=1
 
		M_OK = SQLEXEC(SnHAN, "UPDATE test.test1 SET NO1='BBB' WHERE QTY>=?N1 AND QTY<=?N2 ")
 
*		M_OK = SQLEXEC(SnHAN, "UPDATE test.test1 SET NO1='BBB' WHERE QTY>="+TRAN(N1)+" AND QTY<="+TRANSFORM(N2))   && 此法可得預期結果
 
		IF M_OK<=0
 
			M_MSG = M_MSG+CHR(13)+CHR(10)+TRANSFORM(Q_NUM)
 
		ENDIF
 
	ENDIF
 
ENDFOR
 
WAIT CLEAR
 
MESSAGEBOX(M_MSG) | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 9 樓
  | 
		
			
				 發表於: 星期一 四月 11, 2011 3:15 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				回 h580920
 
日期比對,就如同您所說的方式。
 
 
至於測試問題,小弟個人覺得,實在毋庸耗廢力氣去測試
 
VFP這種『where qty>=?n1 and qty<=?n2 』的用法,我一直認為很邪門
 
不知道是否為 VFP 或微軟的獨創?
 
不知道 Delphi 或 C 或 java 有沒有類似用法? | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 10 樓
  | 
		
			
				 發表於: 星期一 四月 11, 2011 4:12 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				應該要先找看看 mysql 有沒有類似 mssql 的 profiler 工具,
 
可以監看 mysql 究竟收到怎樣的命令.
 
 
就 mssql 而言,
 
vfp 發出去的是一個參數化查詢(Parameterized Query 或 Parameterized Statement)命令
 
 
http://zh.wikipedia.org/wiki/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2
 
 
 
所以應該要關注在 vfp 是否發出正確的命令.
 
 
 
在delphi/bcb 也可以把sql命令做成參數化,
 
其實這樣可以避免做成字串命令時的型態轉換錯誤,或是遇到單雙引號破壞sql命令的情況. _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 11 樓
  | 
		
			
				 發表於: 星期一 四月 11, 2011 4:23 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				舉一個例子:
 
vfp 中
 
 	  | 代碼: | 	 		  
 
clot_no= '10B03328'
 
STMT = "SELECT  convert(char,DATE_STA,112) AS DATE_STA,convert(char,DATE_END,112) AS DATE_END,PMS_MAO_M.*  "
 
STMT = STMT+" FROM PMS_MAO_M  "
 
STMT = STMT+" WHERE  LOT_NO =  ?cLOT_NO "
 
=SQLEXEC(xConnHandle,STMT,'MAO')
 
 | 	  
 
 
ms sql server 會收到:
 
 	  | 代碼: | 	 		  
 
exec sp_executesql N'SELECT  convert(char,DATE_STA,112) AS DATE_STA,convert(char,DATE_END,112) AS DATE_END,PMS_MAO_M.*   FROM PMS_MAO_M    WHERE  LOT_NO =  @P1  ', N'@P1 varchar(8)', '10B03328'
 
 | 	  
 
 
 
我不知道mysql 會出現什麼,
 
但你可以自己照vfp做出來的參數化命令執行看看,
 
是否也會出現同樣問題 _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 12 樓
  | 
		
			
				 發表於: 星期一 四月 11, 2011 4:33 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				bcb的做法 (與delphi 大同小異)
 
 	  | 代碼: | 	 		  
 
  tempSQL->Close();
 
  tempSQL->SQL->Clear();
 
  tempSQL->SQL->Add("delete tmplist where TRAN_NO='INT'and PRG_NO='WKSB51' and CREA_D=:STIME");   // :表示稍後提供參數內容
 
  tempSQL->ParamByName("STIME")->ParamType = ptInputOutput;
 
  tempSQL->ParamByName("STIME")->DataType = ftDateTime;    // 指定參數型態
 
  tempSQL->ParamByName("STIME")->Value = Now();      // 指定參數值
 
  tempSQL->ExecSQL();
 
 | 	  
 
 
 
ms sql server 收到:
 
 	  | 代碼: | 	 		  
 
exec sp_executesql N'delete tmplist where TRAN_NO=''INT''and PRG_NO=''WKSB51'' and CREA_D=@P1
 
', N'@P1 datetime', '04 11 2011  4:35:15:927PM'
 
 | 	 
  _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 13 樓
  | 
		 | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |