台灣最大程式設計社群網站
線上人數
990
 
會員總數:244689
討論主題:188779
歡迎您免費加入會員
討論區列表 >> 其他DB >> 有關visual foxpro的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
有關visual foxpro的問題
價值 : 170 QP  點閱數:10678 回應數:9

樓主

鹿
門外漢
0 4
72 16
發送站內信

小的對FOXPRO的問題不太熟識...現在弄壞了一個程式...希望各位能幫幫忙
這是個圖書館模式的資料庫(FOXPRO)...我用EXCEL開了這個程式的資料夾(名為"FILE")中的"L_BOOK.DBF"檔(這個是輸入了圖書的資料的...),我本想把一些資料複製到這個DBF檔,當SAVE時保留了格式...,結果,再運作系統時,(不論是借還圖書或是輸入資料...,到顯示了"PROGRAM ERROR, THE TABLE IS NOT ORDERED"...
我該怎麼辨......希望各位能指點指點,不勝感淚﹗

本篇文章發表於2006-02-12 11:44
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

nobo
捐贈 VP 給 nobo 檢舉此回應
能把資料的欄位寫出來討論看看嗎
本篇文章回覆於2006-02-12 12:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

nobo
捐贈 VP 給 nobo 檢舉此回應
我想想說是不是欄位名稱用到了關鍵字
本篇文章回覆於2006-02-12 12:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

bestlong
捐贈 VP 給 bestlong 檢舉此回應
是否還可以用 FoxPRO 開發環境開啟該資料檔?
本篇文章回覆於2006-02-12 13:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

LION
捐贈 VP 給 Jelly Fish 檢舉此回應
Foxpro的dbf和一般的格式不同,您用Excel更改就會有問題.
請用Forpro重新建立Table,再將資料匯入(應該可以由Excel讀入原資料,
另存其它格式),或是檢查一下,是不是您將其Index給刪除了.
本篇文章回覆於2006-02-12 13:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

LION
捐贈 VP 給 Jelly Fish 檢舉此回應
Forpro更改成Foxpro
本篇文章回覆於2006-02-12 13:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

sph
檢舉此回應
在 excel中可以另存新檔,檔案格式為*.DBF, 也就是說先將那個檔案先在Excel開啟之後,再存成 *.DBF,便可順利在 foxpro 中呼叫
本篇文章回覆於2006-03-14 05:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

小凱
捐贈 VP 給 小凱 檢舉此回應
foxpro的檔案(.dbf)會有索引檔,當你用excel編輯後,就算是存成.dbf檔,

在程式運作時也會有問題,所以,現在我建議你:

1.先用excell開啓檔案後存成(.txt),以","分隔。

2.再用foxpro新建一個table後將此(.txt)匯入。

3.重新建立索引檔。
本篇文章回覆於2006-08-23 23:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

lcj0831
檢舉此回應
這是用函數方式處理 DBF 的:

代碼:

WAIT WIND LTRIM(STR(UFIXDBF(GETFILE())))

FUNCTION UFIXDBF
* ------------------------------------------------------------------------------------------------------------ *
* 說明:資料表格檔的表頭修復程式。
* ------------------------------------------------------------------------------------------------------------ *
* 參數名稱 型態 說明
* ------------------------------------------------------------------------------------------------------------ *
* Input:
* L_cDBFFileName C 要修復的資料表格名稱(可包含完整路徑)。
* Output:
* M_nProcessNum N -2 = 檔案找不到。
* -4 = 開啟太多的檔案,沒有足夠的檔案控制碼。
* -5 = 檔案存取失敗。
* -6 = 指定的檔案控制碼不正確。
* -8 = 記憶體不足。
* -11 = 檔案長度太小,不是資料表格檔,不能被修復。
* -12 = 不是 FoxPro/FoxBase 資料表格,不能被修復。
* -13 = 資料表格的表頭資訊被破壞或不是資料庫檔案, 不能被修復。
* -25 = 搜尋錯誤 (無法從檔案的開頭處之前開始搜尋)。
* -29 = 磁碟空間不足。
* -31 = 開啟檔案時出現錯誤。
* 0 = 資料表格的表頭資訊正確,不需要修復。
* 2 = 0x02 FoxBASE
* 3 = 0x03 FoxBASE+/dBASE III PLUS,無附註欄位。
* 48 = 0x30 Visual FoxPro。
* 49 = 0x31 Visual FoxPro,有自動增量欄位。
* 50 = 0x32 Visual FoxPro,有可變長度字元欄位、可變長度二進位欄位或二進位大型物件欄位。
* 67 = 0x43 dBASE IV SQL 資料表格檔案,無附註欄位。
* 99 = 0x63 dBASE IV SQL 系統檔案,無附註欄位。
* 131 = 0x83 FoxBASE+/dBASE III PLUS,有附註欄位。
* 139 = 0x8B dBASE IV 有附註欄位。
* 203 = 0xCB dBASE IV SQL 表檔案,有附註欄位。
* 245 = 0xF5 FoxPro 2.x (或更早版本) 有附註欄位。
* 251 = 0xFB FoxBASE。
* ------------------------------------------------------------------------------------------------------------ *
* 注意:M_nProcessNum > 0,除了表示其為何種 DBF 類型外,也代表該 DBF 被修復成功。
* ------------------------------------------------------------------------------------------------------------ *
LPARAMETERS L_cDBFFileName AS String
LOCAL M_nProcessNum AS Number
LOCAL W1_nFileSize AS Number,W1_nHandleOfDBFFile AS Number
LOCAL W1_cHead_Filetype AS Character,W1_cHead_Reccount AS Character,W1_cHead_1stLocation AS Character,W1_cHead_RecordLength AS Character
LOCAL W1_nHead_Filetype AS Number ,W1_nHead_Reccount AS Number ,W1_nHead_1stLocation AS Number ,W1_nHead_RecordLength AS Number
LOCAL W1_nCorrectRecs AS Number ,W1_cCorrectRecs AS Character
M_nProcessNum = 0
W1_nFileSize = 0
W1_nHandleOfDBFFile = FOPEN(L_cDBFFileName, 2) && 以讀寫方式開啟資料表格檔

* 1.檔案是否能開啟
IF W1_nHandleOfDBFFile = -1
M_nProcessNum = FERROR() * -1
ENDIF
* 2.檔案長度是否太小
IF M_nProcessNum = 0
W1_nFileSize = FSEEK(W1_nHandleOfDBFFile,0,2)
=FSEEK(W1_nHandleOfDBFFile, 0, 0)
IF W1_nFileSize <= 64
=FCLOSE(W1_nHandleOfDBFFile)
M_nProcessNum = -11
ENDIF
ENDIF
* 3.判斷是否為 FoxPro/FoxBase 資料表格
IF M_nProcessNum = 0
* > 截取檔頭記錄
W1_cHeaderRecords = FREAD(W1_nHandleOfDBFFile,32)
* > 原始值
W1_cHead_Filetype = SUBSTR(W1_cHeaderRecords,01,01) && 檔案類型
W1_cHead_Reccount = SUBSTR(W1_cHeaderRecords,05,04) && 檔案中的資料記錄數目
W1_cHead_1stLocation = SUBSTR(W1_cHeaderRecords,09,02) && 第一筆資料記錄的位置
W1_cHead_RecordLength = SUBSTR(W1_cHeaderRecords,11,02) && 每筆資料記錄的長度 (包括刪除記號)
W1_cHead_Tableflags = SUBSTR(W1_cHeaderRecords,29,01) && 資料表格旗標
* > 轉換為 10 進位制數
W1_nHead_Filetype = Word2Dec(W1_cHead_Filetype)
W1_nHead_Reccount = Word2Dec(LEFT(W1_cHead_Reccount, 2)) + Word2Dec(RIGHT(W1_cHead_Reccount, 2)) * 65535
W1_nHead_1stLocation = Word2Dec(W1_cHead_1stLocation)
W1_nHead_RecordLength = Word2Dec(W1_cHead_RecordLength)
W1_nHead_Tableflags = Word2Dec(W1_cHead_Tableflags)
* > 判斷
IF INLIST(RIGHT(TRANSFORM(W1_nHead_Filetype,"@0"),2),"02","03","30","31","32","43","63","83","8B","CB","F5","FB")
M_nProcessNum = W1_nHead_Filetype
ELSE
=FCLOSE(W1_nHandleOfDBFFile)
M_nProcessNum = -12
ENDIF
ENDIF
* 4.資料表格是否被破壞
IF M_nProcessNum > 0
IF W1_nFileSize < W1_nHead_1stLocation OR W1_nHead_1stLocation <= 64
=FCLOSE(W1_nHandleOfDBFFile)
M_nProcessNum = -13
ENDIF
ENDIF
* 5.判斷是否需要修復
IF M_nProcessNum > 0
IF W1_nHead_Reccount = INT((W1_nFileSize-W1_nHead_1stLocation)/W1_nHead_RecordLength)
=FCLOSE(W1_nHandleOfDBFFile)
M_nProcessNum = 0
ENDIF
ENDIF
* 6.將受損的 DBF 修復
IF M_nProcessNum > 0
* > 計算檔案中的資料記錄數目
W1_nCorrectRecs = (W1_nFileSize - W1_nHead_1stLocation) / W1_nHead_RecordLength
* > 修正後轉換為雙位元組(WORD)二進制字串
W1_cCorrectRecs = Dec2Word(W1_nCorrectRecs-INT(W1_nCorrectRecs/65535)*65535) + Dec2Word(INT(W1_nCorrectRecs/65535))
* > 寫入正確資訊
=FSEEK(W1_nHandleOfDBFFile,4,0)
=FWRITE(W1_nHandleOfDBFFile,W1_cCorrectRecs,4)
=FCLOSE(W1_nHandleOfDBFFile)
ENDIF
RETURN M_nProcessNum

FUNCTION Dec2Word
* 這是別人提供的,是誰就不知了
******************************************************************************
* 名稱 : Dec2Word.PRG
* 用途 : 轉換 10 進制數到雙位元組(WORD)二進制字串
* 編寫 :
* 日期 : 1997.08.26
* 版本 : 1.0.0
******************************************************************************
* 用法 :
* cRetuVal = Dec2Word(<十進制數>)
******************************************************************************
* 參數:
*
* lnDecNum : 十進制數
*
******************************************************************************
* 傳回值:
*
* 傳回字元型雙位元組(WORD)二進制字串
*
******************************************************************************
* 參見:
* Word2Dec.PRG : 轉換雙位元組(WORD)二進制字串到 10 進制數
*
******************************************************************************

LPARAMETERS lnDecNum
LOCAL lcByte1, lcByte2
lcByte1 = CHR(MOD(lnDecNum,256))
lcByte2 = CHR(INT(lnDecNum/256))

RETURN lcByte1 + lcByte2


FUNCTION Word2Dec
* 這是別人提供的,是誰就不知了
******************************************************************************
* 名稱 : Word2Dec.PRG
* 用途 : 轉換雙位元組(WORD)二進制字串到 10 進制數
* 編寫 :
* 日期 : 1997.08.26
* 版本 : 1.0.0
******************************************************************************
* 用法 :
* cRetuVal = Word2Dec(<二進制字串>)
******************************************************************************
* 參數:
*
* lcBinNum : 二進制字串
*
******************************************************************************
* 傳回值:
*
* 傳回十進制數
*
******************************************************************************
* 參見:
* Dec2Word.PRG : 轉換 10 進制數到雙位元組(WORD)二進制字串
*
******************************************************************************

LPARAMETERS lcBinNum
LOCAL lnNum1, lnNum2
lcBinNum = PADR(lcBinNum, 2, CHR(0))
lnNum1 = ASC(LEFT(lcBinNum,1))
lnNum2 = ASC(RIGHT(lcBinNum,1)) * 256
RETURN lnNum1 + lnNum2

本篇文章回覆於2006-08-30 17:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

lcj0831
檢舉此回應
這是用函數方式處理 FPT 的:

代碼:

WAIT WIND LTRIM(STR(UFIXFPT(GETFILE())))

FUNCTION UFIXFPT
* ------------------------------------------------------------------------------------------------------------ *
* 說明:附註檔的表頭修復程式。
* ------------------------------------------------------------------------------------------------------------ *
* 參數名稱 型態 說明
* ------------------------------------------------------------------------------------------------------------ *
* Input:
* L_cDBFFileName C 要修復的附註檔案名稱(可包含完整路徑)。
* Output:
* M_nProcessNum N -2 = 檔案找不到。
* -4 = 開啟太多的檔案,沒有足夠的檔案控制碼。
* -5 = 檔案存取失敗。
* -6 = 指定的檔案控制碼不正確。
* -8 = 記憶體不足。
* -25 = 搜尋錯誤 (無法從檔案的開頭處之前開始搜尋)。
* -29 = 磁碟空間不足。
* -31 = 開啟檔案時出現錯誤。
* 0 = 附註檔的表頭資訊正確,不需要修復。
* ------------------------------------------------------------------------------------------------------------ *
LPARAMETERS L_cFPTFileName AS String
LOCAL M_nProcessNum AS Number
LOCAL W1_nFileSize AS Number,W1_nHandleOfFPTFile AS Number

M_nProcessNum = 0
W1_nFileSize = 0

W1_nHandleOfFPTFile = FOPEN(L_cFPTFileName, 2) && 以讀寫方式開啟資料表格檔
* 1.檔案是否能開啟
IF W1_nHandleOfFPTFile = -1
M_nProcessNum = FERROR() * -1
ENDIF
* 2.檔案長度是否太小
IF M_nProcessNum = 0
* > 檔案大小
W1_nFileSize = FSEEK(W1_nHandleOfFPTFile,0,2)
=FSEEK(W1_nHandleOfFPTFile, 0, 0)
* > 截取檔頭記錄
W1_cHeaderRecords = FREAD(W1_nHandleOfFPTFile,8)
* > 原始值
W1_cHead_LocationOfNextFreeBlock = SUBSTR(W1_cHeaderRecords,1,4) && 下一個自由區塊的位置
W1_cHead_BlockSize = SUBSTR(W1_cHeaderRecords,7,2) && 區塊大小
* > 轉換為 10 進位制數
W1_nHead_LocationOfNextFreeBlock = UnMSBLSB(W1_cHead_LocationOfNextFreeBlock)
W1_nHead_BlockSize = UnMSBLSB(W1_cHead_BlockSize)
DO CASE
CASE W1_nHead_BlockSize = 0
W1_nHead_BlockSize = 1
CASE W1_nHead_BlockSize = 33
W1_nHead_BlockSize = 512 * W1_nHead_BlockSize
ENDCASE
W1_cFixHeaderRecords = ToMSBLSB(INT(W1_nFileSize/W1_nHead_BlockSize),4) + ;
CHR(0) + CHR(0) + W1_cHead_BlockSize
=FSEEK(W1_nHandleOfFPTFile,0,0) && 回到檔案開始處
=FWRITE(W1_nHandleOfFPTFile,W1_cFixHeaderRecords)
=FCLOSE(W1_nHandleOfFPTFile)
ENDIF
RETURN M_nProcessNum

FUNCTION UnMSBLSB
* 這是別人提供的,是誰就不知了
* ------------------------------------------------------------- *
* 說明:。
* ------------------------------------------------------------- *
* 參數名稱 型態 說明
* ------------------------------------------------------------- *
* Input:
* L_cSomeBytes C 是由 0 到 255 的 ASCII 字元所組成的字串。
* Output:
* Mo_cRetVal N 。
* ------------------------------------------------------------- *
* 範例:
* L_cSomeBytes = "戎譚" && ascii characters from 0 to 255
*
* Mo_cRetVal = ASC(SUBSTR(L_cSomeBytes,4,1)) + ;
* ASC(SUBSTR(L_cSomeBytes,3,1)) * 256 + ;
* ASC(SUBSTR(L_cSomeBytes,2,1)) * 256 * 256 + ;
* ASC(SUBSTR(L_cSomeBytes,1,1)) * 256 * 256 * 256
* ------------------------------------------------------------- *
LPARAMETERS L_cSomeBytes
LOCAL Mo_nRetVal AS Number
LOCAL W1_nSUB_A AS Integer
Mo_nRetVal = 0
FOR W1_nSUB_A = 1 TO Len(L_cSomeBytes)
Mo_nRetVal = Mo_nRetVal * 256 + ASC(SUBSTR(L_cSomeBytes,W1_nSUB_A,1))
ENDFOR
RETURN Mo_nRetVal

FUNCTION ToMSBLSB
* 這是別人提供的,是誰就不知了
* ------------------------------------------------------ *
* 說明:。
* ------------------------------------------------------ *
* 參數名稱 型態 說明
* ------------------------------------------------------ *
* Input:
* L_nSomeNum N 。
* (L_nCount) N 預設值 = 1。
* Output:
* Mo_cRetVal C 。
* ------------------------------------------------------ *
LPARAMETERS L_nSomeNum, L_nCount
LOCAL Mo_cRetVal AS Character
LOCAL W1_nSUB_A AS Integer
Mo_cRetVal = ""
IF Type("L_nCount") != "N"
L_nCount = 1
ELSE
L_nCount = INT(L_nCount)
ENDIF
FOR W1_nSUB_A = 1 TO L_nCount
Mo_cRetVal = CHR(MOD(L_nSomeNum,256)) + Mo_cRetVal
L_nSomeNum = INT(L_nSomeNum/256)
ENDFOR
RETURN Mo_cRetVal

本篇文章回覆於2006-08-30 17:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.