 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
goodnight

註冊時間: 2008-10-13 文章: 473 來自: 台南市
第 1 樓
|
發表於: 星期五 五月 15, 2009 9:32 am 文章主題: 從 LOCAL VIEW UPDATE 到 REMOTE VIEW 發生錯誤 |
|
|
各位大大
末學在進行資料更新, 在做到一個固定的記錄時, 發生更新的錯誤, 狀況說明
1.因為資料集來自兩個 ODBC , 所以創建所需的 REMOTE VIEW
2.再從 REMOTE VIEW 創建要修改的 LOCAL VIEW
3.當在 LOCAL VIEW 完成修改後, 執行 TABLEUPDATE(1, .F.), 在固定筆數就會發生錯誤編號 1585
4.僅從 LOCAL VIEW 更新到 REMOTE VIEW 而已
希望大大能協助一下, 是否我處理資料的方式不正確??還是有其他的特殊原??
以下為 DEBUG 資料
從 AERROR 取得的錯誤資料:
1.1585
2.Update conflict in cursor 'PURDAY_VIEW'.
3.PURDAY_VIEW
4. 0
5.NULL
6.NULL
7.NULL
經查表後 ERR 1585 的狀況是:
發生更新衝突。請使用含有 lForce 參數的 TABLEUPDATE( ) 函數提交該更新,或使用 TABLEREVERT( ) 向後回復更新操作。
說明是:
更新資料集時發現了開放模式鎖定衝突。確保更新鍵值正確。
如果想向基本資料表格提交所做的變更,請呼叫 TABLEUPDATE( ) 函數並帶上 lForce 參數。這將覆寫最後一次取資料集時對基本資料表格所做的變更。
呼叫 TABLEREVERT( ) 函數可以放棄對資料集所做的更改。
以下是程式:
*ON ERROR DO errhand && errhand 是錯誤處理程序
PUBLIC M.PUR_DAY, M.CUST_PNO, M.ERROR_MSG
&& IF INVMB.MB025 = "P", PUR_DAY = 4
&& IF INVMB.MB025 = "S", PUR_DAY = 5
&&
&& CUST_PRODUCT
SET CENTURY ON
SET DATE YMD
SET DECIMALS TO 0
SET FIXED OFF
SET DEFAULT TO d:\foxproapp\util
SET DELETED ON
SET MULTILOCKS ON
SET PATH TO d:\foxproapp additive
SET SAFETY OFF
SET STATUS ON
SET STATUS BAR ON
SET SYSMENU OFF
SET SYSMENU AUTOMATIC
CLOSE TABLES ALL
BAK_DATE = STRTRAN(DTOC(DATE()), "/", "") + "-" + STRTRAN(TIME(), ":", "")
&& 產品主檔 REMOTE VIEW
USE INVMB_VIEW AGAIN IN 0
SELECT INVMB_VIEW
*SET_MODE = CURSORSETPROP("Buffering", 5)
IF REQUERY("INVMB_VIEW") = 0
MESSAGEBOX("資料沒有更新成功或資料沒有異動更新, 繼續備份", 0)
ENDIF
FILENAME = "\FOXPROAPP\UTIL\" + "INVMB_BAK-" + BAK_DATE + ".DBF"
FILENAME = "INVMB_BAK-" + BAK_DATE + ".DBF"
COPY TO (FILENAME)
&& 採購明細檔 REMOTE VIEW
USE HBYBOMD_VIEW AGAIN IN 0
SELECT HBYBOMD_VIEW
M.CUST_PNO = "%" && 全部的資料, 適用 like
IF REQUERY("HBYBOMD_VIEW") = 0
MESSAGEBOX("資料沒有更新成功或資料沒有異動更新, 繼續備份", 0)
ENDIF
FILENAME = "HBYBOMD_BAK-" + BAK_DATE
COPY TO (FILENAME)
&& 客戶品號檔 REMOTE VIEW
USE COPMG_VIEW AGAIN IN 0
SELECT COPMG_VIEW
M.CUST_PNO = "%" && 全部的資料, 適用 like
IF REQUERY("COPMG_VIEW") = 0
MESSAGEBOX("資料沒有更新成功或資料沒有異動更新", 0)
ENDIF
&& 整合來自兩個 DATABASE REMOTE VIEW 的資料 - LOCALVIEW
USE PURDAY_VIEW AGAIN IN 0
SELECT PURDAY_VIEW
SET_MODE = CURSORSETPROP("Buffering", 5)
IF SET_MODE = .T.
SCAN FOR MB025 = "P"
REPLACE MB036 WITH 4
ENDSCAN
BROWSE
UPD_MODE = TABLEUPDATE(1,.F.) <==錯誤的發生源
UPD_MODE = TABLEUPDATE(1,.F.)
IF UPD_MODE = .F.
AERROR(aErrorArray)
ERROR_MSG = "ERROR MSG: "
FOR I = 1 TO 7
DO CASE
CASE VARTYPE(AErrorArray(I)) = "N"
ERR_TEXT = TRANSFORM(AErrorArray(I), "9999")
CASE VARTYPE(AErrorArray(I)) = "X"
ERR_TEXT = "NULL"
CASE VARTYPE(AErrorArray(I)) = "C"
ERR_TEXT = AErrorArray(I)
OTHERWISE
ERR_TEXT = "ERR"
ENDCASE
ERROR_MSG = ERROR_MSG + "/" + ERR_TEXT
ENDFOR
MESSAGEBOX(ERROR_MSG, 0)
TABLEREVERT(.T.)
MESSAGEBOX("取消所有資料的更新", 16, "TABLE 更新")
ENDIF
ELSE
=MESSAGEBOX("操作未成功!",16,"操作狀態")
ENDIF
SET DECIMALS TO 2
SET FIXED ON
*SET_MODE = CURSORSETPROP("Buffering", 1)
*SET MULTILOCKS OFF
ON ERROR && 恢復系統錯誤處理程式
RETURN
ENDPROC
PROCEDURE errhand
= AERROR(aErrorArray) && 最近發生錯誤的資料
CLEAR
? '該錯誤提供了以下資訊' && 顯示訊息
FOR n = 1 TO 7 && 顯示陣列的所有元素
? aErrorArray(n)
ENDFOR |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 2 樓
|
發表於: 星期五 五月 15, 2009 2:33 pm 文章主題: |
|
|
如果改為 TABLEUPDATE(1,.T.) 呢? |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 3 樓
|
發表於: 星期五 五月 15, 2009 8:11 pm 文章主題: |
|
|
通常是那一筆資料的內容有問題,
例如 null 值
或是一些看不到的字元在作怪. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
goodnight

註冊時間: 2008-10-13 文章: 473 來自: 台南市
第 4 樓
|
發表於: 星期五 五月 15, 2009 8:28 pm 文章主題: |
|
|
garfield 寫到: | 通常是那一筆資料的內容有問題,
例如 null 值
或是一些看不到的字元在作怪. |
我懂你的意思, 主檔是primary key 曾經發過重覆的貨號, 結果是含了 chr(9), 不過我換成 SPT 的方式, 暫時是沒問題, 不過我還是得找出原因 |
|
回頂端 |
|
 |
goodnight

註冊時間: 2008-10-13 文章: 473 來自: 台南市
第 5 樓
|
發表於: 星期五 五月 15, 2009 8:28 pm 文章主題: |
|
|
ckp6250 寫到: | 如果改為 TABLEUPDATE(1,.T.) 呢? |
回家沒有環境可以測試, 下週再測試, 然後跟您報告結果 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|