老實說:「以前沒遇過這個問題,覺得沒什麼大不了。」直到今天要用Vfp 來取得資料時,才發現事情真的很嚴重!因為根本就抓不到,上網查了很久,根本就沒答案。
在摸索了二~三小時後,大概知道問題在哪?我把作法分享給大家吧!
在硬碟D槽temp目錄下有一個檔案名為ALL_LOTTO.XLS
直接在Command 視窗下連線指令
lnh=SQLSTRINGCONNECT(" Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};;=XLS;DBQ=D:\TEMP\ALL_LOTTO.XLS")
在除錯視窗檢查lnh,其值大於零,表示連線成功。
再回到Command 視窗下Sql指令
bx=SQLEXEC(lnh,"SELECT * FROM [四星彩$]","vv") && "vv" 是抓取資料後要檢視的表格名稱
往下看狀態列會有1942筆,如下圖。
可是當你要開啟vv,用brows指令來看時,卻發生以下錯誤。
很令人光火,因為你根本不知道問題在哪?如果把錯誤訊息輸入google 尋找,你也找不到答案,感覺很像微軟在嘲笑你:「你還在用Vfp 啊,我們早就不支援啦。」
可是很奇怪哪?如果我抓不到資料,為什麼狀態列會有1942筆資料?
我把DataSession 視窗開啟來看
奇怪的事發生了。
上面的畫面你會看到,名稱為vv的表格存在,但是你若硬去點上面的Browse按鍵,肯定會出現前面說的:「The data source for this object must be a variable reference.」
如果看到這邊,大概會覺得問題無解,很令人火大。
不小心,我去點了Proerties按鍵,出現了以下畫面。
不死心,再去點開Field Filter 按鍵,出現以下畫面
有啊,有欄位,而欄位名稱竟然跟第一筆資料一模一樣,如下圖。
我想了想,既然檔案抓取成功,又有資料,那就沒道理不能看啊!究竟是那個環節出了問題?會不會是因為欄位名稱有問題?
因為欄位名稱是日期型態?(2011/05/31)
不管了,死馬當活馬醫,先把Vfp關掉,再把Excel檔案調出來,在第一行中插入一筆空白,更改內容為「日期」、「編號1」、「編號2」如下畫面
把Excel 檔關閉後,重新開啟Vfp,再次在Command 視窗下連線指令
lnh=SQLSTRINGCONNECT(" Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};;=XLS;DBQ=D:\TEMP\ALL_LOTTO.XLS")
在除錯視窗檢查lnh,其值大於零,表示連線成功。
再回到Command 視窗下Sql指令
bx=SQLEXEC(lnh,"SELECT * FROM [四星彩$]","vv") && "vv" 是抓取資料後要檢視的表格名稱
狀態列一樣有1942筆,先不理會。
在Command 視窗下Brows指令,就看到以下畫面
資料抓取成功,也沒有錯誤訊再出現,雖然說:「資料都是備註型態。」但是比起前面說的:「出現錯誤,不能瀏覽。」已經有很大的進步了。
這部份的心得:「我個人認為是Excel檔的工作表中,第一行資料沒有設定欄位名稱,以致於Vfp在抓檔之後,直接把第一筆資料設定為欄位 ,如果資料中有日期,那麼日期就變成了欄位名稱,如果有空白,那麼空白也成了欄位名稱,讓Vfp在執行時,無法正常運作,就發生了錯誤。」
至於「資料都是備註型態。」這部份,我找了網路上的資料,得到的結果是:「無可避免!」這個結論是來自於微軟的問題說明。
為什麼「資料都是備註型態?」我的看法是,VFP的資料有長度限制,可是Excel的每一欄,並沒有長度設定及限制,所以第一行的欄位資料,和其他欄位的資料不會相同,或是說:「第一欄第一行的資料長度可能只有10,而第一欄第十行的資料長度可能有259。」在長度不確定的狀態下,VFP就自動把它轉為「備註型態。」這是宿命,也是最好的作法,可以保證資料在抓取時絕不遺失。
微軟建議的作法是增加一個欄位(暫稱tcol),再截取備註檔位特定長度的字串,填入tcol,以利抓取資料。
另一個要注意的事情是:「如果你有兩個相同主檔名的檔案放在同一個目錄下,假設一個稱為all_lotto.xls(有加第一行欄名),另一個稱為all_lotto.xlsx(沒有第一行欄名),即使你指名了要抓all_lotto.xls這個檔,VFP仍有可能因為兩者名稱只有副檔名不同,而錯抓了all_lotto.xlsx導致檔案無法正常抓出資料,所以建議兩者不要放在同一目錄,或是把all_lotto.xlsx的檔名改掉,以確保VFP不會抓錯檔,進而讓你以為又是那邊的程式碼出錯。」
我把這個心得放在這邊讓大家參考吧!
最後,如果本文對您有所助益的話,請不要吝嗇幫忙點一下旁邊或是上面的廣告,贊助一下個人吧,感謝您!
留言列表