上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
LiChingLin
註冊時間: 2006-04-19 文章: 59
第 1 樓
|
發表於: 星期六 五月 30, 2015 4:46 pm 文章主題: APPEND FROM 問題 |
|
|
A.DBF
F_COID C(5), F_TYPE N(1), F_VALUE N(10)
B.DBF
F_COID C(5), F_TYPE N(1), F_VALUE N(10), F_RECNO N(10)
SELECT A
SET FILTER TO F_COID='CA123'
GO TOP
SELECT B
ZAP
APPEND FROM A FOR F_TYPE=1
請問一下B.DBF的F_RECNO欄位如何透過APPEND FROM存入A.DBF對應的RECNO() |
|
回頂端 |
|
 |
LiChingLin
註冊時間: 2006-04-19 文章: 59
第 2 樓
|
發表於: 星期六 五月 30, 2015 4:55 pm 文章主題: |
|
|
因為DBF過於龐大
200多個欄位 10多萬筆紀錄
之前用
SELECT RECNO() AS F_RECNO ......... INTO CURSOR ....
沒問題 但是非常慢
用了 APPEND FROM 快很多 約需1/3 - 1/4 時間就可以
但是 最重要的 RECNO() 怎麼寫入呢 ... |
|
回頂端 |
|
 |
bx1166
註冊時間: 2011-12-06 文章: 273
第 3 樓
|
發表於: 星期六 五月 30, 2015 10:22 pm 文章主題: |
|
|
把A也增加Recno的欗位,如同B,譲這個f_recno一樣的資料,
Select b
Repl all f_recno with recno()
Select a
Append from b
Sorry ab 弄顚倒了 |
|
回頂端 |
|
 |
lygcw9603
註冊時間: 2011-12-25 文章: 130
第 4 樓
|
發表於: 星期一 六月 01, 2015 12:54 am 文章主題: |
|
|
桎建立獥系SET RELATION TO ………… |
|
回頂端 |
|
 |
LiChingLin
註冊時間: 2006-04-19 文章: 59
第 5 樓
|
發表於: 星期一 六月 01, 2015 2:12 am 文章主題: |
|
|
來源DBF是隔壁公司的
只給讀不給改 有權限問題 設計者已經不可考
重點是 至少有46個是超大的 是要每天經常性讀取
每日還要回傳資料
使用者快 起笑了
很想讓使用者改善工作效率提早下班
前幾年都很快 但是資料累計過大
目前是想說有沒有更好的演算方式或是指令能改改善現況
先謝謝大家的關心 |
|
回頂端 |
|
 |
bx1166
註冊時間: 2011-12-06 文章: 273
第 6 樓
|
發表於: 星期一 六月 01, 2015 10:44 am 文章主題: |
|
|
既然可以讀就建立一份拷貝,每天只要update有異動的部分,拷貝的自己加上需要的欗位。 |
|
回頂端 |
|
 |
goodnight

註冊時間: 2008-10-13 文章: 473 來自: 台南市
第 7 樓
|
發表於: 星期四 六月 04, 2015 12:17 pm 文章主題: |
|
|
如果 A.DBF 的結構不能改, 那就只能慢了
你直接下這樣比較快吧?
SELECT A.*, RECNO() AS F_RECNO FROM A WHERE A.F_COID='CA123' AND A.F_TYPE = 1 INTO DBF B
然後重建 B.DBF 的索引
正常來說 SELECT SQL 語法不應該慢的
試試這樣會不會快一點, 但電腦記憶體要大一才好
SELECT A.*, RECNO() AS F_RECNO FROM A WHERE A.F_COID='CA123' AND A.F_TYPE = 1 INTO ARRAY ARY_A
INSERT INTO B FROM ARRAY ARY_A _________________ 希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ |
|
回頂端 |
|
 |
bx1166
註冊時間: 2011-12-06 文章: 273
第 8 樓
|
發表於: 星期四 六月 04, 2015 9:44 pm 文章主題: |
|
|
資料應該不是每日都會產生十多萬筆的吧?
要處理的應該只是每日增加的或是修改的吧?
我認為你們的處理方式有些改善的必要。 |
|
回頂端 |
|
 |
LiChingLin
註冊時間: 2006-04-19 文章: 59
第 9 樓
|
發表於: 星期五 六月 05, 2015 1:20 am 文章主題: |
|
|
回 bx1166
你的論點也是個辦法.但是可能套用在讀取隔壁公司DBF上.可能不好搞.
我觀察出
有些資料庫dbf每月約增加8000-20000筆
有些資料庫dbf每月約增加3000-7000筆
...
更奇怪的是recno()還常常會變
有些資料庫DBF有時20多萬會變10多萬
有些資料庫DBF有時5萬多會變7萬多
我看不明白這是在幹麻 ...
我猜測隔壁公司下班後有delete()跟pack.還外加[備份回存]的套餐吧
回 goodnight
SELECT A.*, RECNO() AS F_RECNO FROM A ... INTO ARRAY 可以用
但是有些大DBF(欄位多.筆數多)會錯誤
我猜是ARRAY(MEMORY)的限制 ...
先謝謝大家關心 |
|
回頂端 |
|
 |
bx1166
註冊時間: 2011-12-06 文章: 273
第 10 樓
|
發表於: 星期五 六月 05, 2015 6:08 am 文章主題: |
|
|
記錄每天最後一筆的內容,隔天找到那一筆,就只讀取那後來所有新增的,那些就是每天
要處理的,至於delete pack的沒差。因為一般刪掉的都是過時的,除非有另外不可預料的
sele 1
use a
copy to mydrive\mtemp
*** use mtemp to do other prg
** will be overwrited next day
***next day
sele 1
use mydrive\mtemp
go bott
mid=A.F_coid
mvalue=A.f_value
mtype=a.f_type
use a
locate for f_coid=mid .and. f_value=mvalue .and. F_type=mtype
if .not. eof()
mno=a.recno()
copy to mydrive\mtemp for recno()>mno
Else
? "Error reading data"
endif
use |
|
回頂端 |
|
 |
goodnight

註冊時間: 2008-10-13 文章: 473 來自: 台南市
第 11 樓
|
發表於: 星期五 六月 05, 2015 2:20 pm 文章主題: |
|
|
LiChingLin 寫到: | 回 bx1166
你的論點也是個辦法.但是可能套用在讀取隔壁公司DBF上.可能不好搞.
我觀察出
有些資料庫dbf每月約增加8000-20000筆
有些資料庫dbf每月約增加3000-7000筆
...
更奇怪的是recno()還常常會變
有些資料庫DBF有時20多萬會變10多萬
有些資料庫DBF有時5萬多會變7萬多
我看不明白這是在幹麻 ...
我猜測隔壁公司下班後有delete()跟pack.還外加[備份回存]的套餐吧
回 goodnight
SELECT A.*, RECNO() AS F_RECNO FROM A ... INTO ARRAY 可以用
但是有些大DBF(欄位多.筆數多)會錯誤
我猜是ARRAY(MEMORY)的限制 ...
先謝謝大家關心 |
是的, 有可能是記憶體的問題, 所以我才註明記憶體要大些
其實處理方法很多, 看哪一種適合,
我想問一下, 記錄 recno() 有什麼特別含意??
如果要快, 準備一個 128G 的 ssd 應該會讓你有神速的速度吧 _________________ 希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ |
|
回頂端 |
|
 |
LiChingLin
註冊時間: 2006-04-19 文章: 59
第 12 樓
|
發表於: 星期五 六月 05, 2015 6:12 pm 文章主題: |
|
|
主要因素就是
先讀取隔壁公司的資料
匯入部份資料於我方資料庫
排工作->製造加工->紀錄進度->回傳資料(新yymmdd.dbf)
工作下班前回傳資料給隔壁公司
因為隔壁公司dbf沒有onlykey可識別.僅靠recno()及部分欄位區分資料
回傳當日dbf對應recno()及幾項欄位做對應檢查比對用
當日下班前會比對資料才算完成作業
有限於隔壁公司電腦系統的關係
目前只有慢慢想辦法了 |
|
回頂端 |
|
 |
bx1166
註冊時間: 2011-12-06 文章: 273
第 13 樓
|
發表於: 星期五 六月 05, 2015 8:18 pm 文章主題: |
|
|
Recno()既然可以找到,當然可以寫回去,多加一兩行在locate後面即可,問題不大 |
|
回頂端 |
|
 |
goodnight

註冊時間: 2008-10-13 文章: 473 來自: 台南市
第 14 樓
|
發表於: 星期六 六月 06, 2015 10:38 am 文章主題: |
|
|
LiChingLin 寫到: | 主要因素就是
先讀取隔壁公司的資料
匯入部份資料於我方資料庫
排工作->製造加工->紀錄進度->回傳資料(新yymmdd.dbf)
工作下班前回傳資料給隔壁公司
因為隔壁公司dbf沒有onlykey可識別.僅靠recno()及部分欄位區分資料
回傳當日dbf對應recno()及幾項欄位做對應檢查比對用
當日下班前會比對資料才算完成作業
有限於隔壁公司電腦系統的關係
目前只有慢慢想辦法了 |
如果只單純以你的 A.dbf 的結構來看, 我會先建議你多觀察這資料庫的使用狀況, 以及多分析一下資料庫結構
假設 F_COID 是工作代號, 只要他不會重覆, 就不是問題, 就不需要去記錄它的 RECNO(), 如果它會重覆, 那就得去分析它的程式如何去運作, 假設它真的會有 DELETE/PACK/RESTORE 的動作, 那你去記錄 RECNO() 就沒有用處了
如果能找到原始程式會更好 _________________ 希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ |
|
回頂端 |
|
 |
|