|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
ms0800
註冊時間: 2004-07-23 文章: 65
第 1 樓
|
發表於: 星期五 三月 25, 2005 9:19 pm 文章主題: 請教有關spt 建立cursor 的問題 |
|
|
XKEYFIELDLIST = '出貨單號'
XTABLES = 'c:\出貨表頭'
MYVIEW = 'V_出貨表頭'
*
M_COMM = "SELECT * FROM " + XTABLES
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
*
IF RESULT<0
?? CHR(7)
=MESSAGEBOX("執行SPT語法不成功!")
ELSE
SELECT (MYVIEW)
m_fields=''
m_sqlfields=''
for i=1 to fcount(alias())
m_fields=m_fields+alltrim(proper(fields[i]))+','
m_sqlfields=m_sqlfields+alltrim(proper(fields[i]))+' '+ XTABLES +'.'+alltrim(proper(fields[i]))+','
endfor
m_fields=left(m_fields,len(m_fields)-1)
m_sqlfields=left(m_sqlfields,len(m_sqlfields)-1)
=SQLSETPROP(THISFORM.CONNECTID,'Asynchronous',.T.)
=CURSORSETPROP("BUFFERING",5)
=CURSORSETPROP("TABLES",XTABLES)
=CURSORSETPROP("KEYFIELDLIST",XKEYFIELDLIST)
=CURSORSETPROP('UpdatableFieldList',m_fields)
=CURSORSETPROP("UpdateNameList",m_sqlfields,(MyView))
=CURSORSETPROP("WHERETYPE",3)
=CURSORSETPROP("SENDUPDATES",.T.)
*
=CURSORSETPROP("BatchUpdateCount",1)
=CURSORSETPROP("CompareMemo",.T.)
=CURSORSETPROP("FetchAsNeeded",.F.)
=CURSORSETPROP("FetchMemo",.T.)
=CURSORSETPROP("FetchSize",100)
=CURSORSETPROP("MaxRecords",-1)
=CURSORSETPROP("Prepared",.F.)
=CURSORSETPROP("UpdateType",1)
=CURSORSETPROP("UseMemoSize",255)
ENDIF
*
************
*
XKEYFIELDLIST = '出貨單號,SEQ'
XTABLES = 'c:\出貨表身'
MYVIEW = 'V_出貨表身'
*
M_COMM = "SELECT * FROM " + XTABLES + " WHERE 出貨單號 = ?V_出貨表頭.出貨單號"
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
*
IF RESULT<0
?? CHR(7)
=MESSAGEBOX("執行SPT語法不成功!")
ELSE
SELECT (MYVIEW)
m_fields=''
m_sqlfields=''
for i=1 to fcount(alias())
m_fields=m_fields+alltrim(proper(fields[i]))+','
m_sqlfields=m_sqlfields+alltrim(proper(fields[i]))+' '+ XTABLES +'.'+alltrim(proper(fields[i]))+','
endfor
m_fields=left(m_fields,len(m_fields)-1)
m_sqlfields=left(m_sqlfields,len(m_sqlfields)-1)
=SQLSETPROP(THISFORM.CONNECTID,'Asynchronous',.T.)
=CURSORSETPROP("BUFFERING",5)
=CURSORSETPROP("TABLES",XTABLES)
=CURSORSETPROP("KEYFIELDLIST",XKEYFIELDLIST)
=CURSORSETPROP('UpdatableFieldList',m_fields)
=CURSORSETPROP("UpdateNameList",m_sqlfields,(MyView))
=CURSORSETPROP("WHERETYPE",3)
=CURSORSETPROP("SENDUPDATES",.T.)
*
=CURSORSETPROP("BatchUpdateCount",1)
=CURSORSETPROP("CompareMemo",.T.)
=CURSORSETPROP("FetchAsNeeded",.F.)
=CURSORSETPROP("FetchMemo",.T.)
=CURSORSETPROP("FetchSize",100)
=CURSORSETPROP("MaxRecords",-1)
=CURSORSETPROP("Prepared",.F.)
=CURSORSETPROP("UpdateType",1)
=CURSORSETPROP("UseMemoSize",255)
ENDIF
*
以下有幾個疑問想請教
1.上述程式寫在 FORM 的Dataenvironment 的 BeforeOpenTables 裡,這樣對嗎 ?好嗎 ?
2.建立 'V_出貨表頭'
XKEYFIELDLIST = '出貨單號'
XTABLES = 'c:\出貨表頭'
MYVIEW = 'V_出貨表頭'
*
M_COMM = "SELECT * FROM " + XTABLES
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
*
如 c:\出貨表頭 檔很大,SQLEXEC() 的時間會很久,請問各位前輩都用什麼方式來解決
LOCAL VIEW 有一個 NODATAONLOAD 的屬性,那用 SPT 如何解決
3.建立 'V_出貨表身'
XKEYFIELDLIST = '出貨單號,SEQ'
XTABLES = 'c:\出貨表身'
MYVIEW = 'V_出貨表身'
*
M_COMM = "SELECT * FROM " + XTABLES + " WHERE 出貨單號 = ?V_出貨表頭.出貨單號"
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
*
有一條件 WHERE 出貨單號 = ?V_出貨表頭.出貨單號
出貨表頭 SKIP 時 V_出貨表身 重顯示
LOCAL VIEW 寫法
SELECT V_出貨表頭
SKIP
= REQUERY('V_出貨表身')
SPT 應如何處理 ?
= REQUERY('V_出貨表身') 出現
此函數不支援 SQL pass-through 暫存資料表格
請問各位前輩,萬分感謝,謝謝 |
|
回頂端 |
|
|
cchvfp
註冊時間: 2003-07-05 文章: 18
第 2 樓
|
發表於: 星期五 三月 25, 2005 9:34 pm 文章主題: |
|
|
1.寫在load就可以了
2.可用where 1=2,如此就沒有資料了
3.spt的cursor無法用requery()
需要重新sqlexec,然後重新設定cursorsetprop() |
|
回頂端 |
|
|
ms0800
註冊時間: 2004-07-23 文章: 65
第 3 樓
|
發表於: 星期五 三月 25, 2005 10:46 pm 文章主題: |
|
|
感謝 CCHVFP 大哥的回答
需要重新sqlexec,然後重新設定cursorsetprop()
您的意思
=SQLSETPROP(THISFORM.CONNECTID,'Asynchronous',.T.)
=CURSORSETPROP("BUFFERING",5)
=CURSORSETPROP("TABLES",XTABLES)
=CURSORSETPROP("KEYFIELDLIST",XKEYFIELDLIST)
=CURSORSETPROP('UpdatableFieldList',m_fields)
=CURSORSETPROP("UpdateNameList",m_sqlfields,(MyView))
=CURSORSETPROP("WHERETYPE",3)
=CURSORSETPROP("SENDUPDATES",.T.)
*
=CURSORSETPROP("BatchUpdateCount",1)
=CURSORSETPROP("CompareMemo",.T.)
=CURSORSETPROP("FetchAsNeeded",.F.)
=CURSORSETPROP("FetchMemo",.T.)
=CURSORSETPROP("FetchSize",100)
=CURSORSETPROP("MaxRecords",-1)
=CURSORSETPROP("Prepared",.F.)
=CURSORSETPROP("UpdateType",1)
=CURSORSETPROP("UseMemoSize",255)
都要重新做一次喔?! |
|
回頂端 |
|
|
ms0800
註冊時間: 2004-07-23 文章: 65
第 4 樓
|
發表於: 星期六 四月 02, 2005 2:42 am 文章主題: |
|
|
因為出現很多問題,煩請各位前輩,如知道煩請回應一下,拜託
SELECT 出貨表頭
SKIP
*
XKEYFIELDLIST = '出貨單號,SEQ'
XTABLES = 'c:\出貨表身'
MYVIEW = 'V_出貨表身'
*
M_COMM = "SELECT * FROM " + XTABLES + " WHERE 出貨單號 = ?V_出貨表頭.出貨單號"
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
*
IF RESULT<0
?? CHR(7)
=MESSAGEBOX("執行SPT語法不成功!")
ELSE
SELECT (MYVIEW)
m_fields=''
m_sqlfields=''
for i=1 to fcount(alias())
m_fields=m_fields+alltrim(proper(fields[i]))+','
m_sqlfields=m_sqlfields+alltrim(proper(fields[i]))+' '+ XTABLES +'.'+alltrim(proper(fields[i]))+','
endfor
m_fields=left(m_fields,len(m_fields)-1)
m_sqlfields=left(m_sqlfields,len(m_sqlfields)-1)
=SQLSETPROP(THISFORM.CONNECTID,'Asynchronous',.T.)
=CURSORSETPROP("BUFFERING",5)
=CURSORSETPROP("TABLES",XTABLES)
=CURSORSETPROP("KEYFIELDLIST",XKEYFIELDLIST)
=CURSORSETPROP('UpdatableFieldList',m_fields)
=CURSORSETPROP("UpdateNameList",m_sqlfields,(MyView))
=CURSORSETPROP("WHERETYPE",3)
=CURSORSETPROP("SENDUPDATES",.T.)
*
=CURSORSETPROP("BatchUpdateCount",1)
=CURSORSETPROP("CompareMemo",.T.)
=CURSORSETPROP("FetchAsNeeded",.F.)
=CURSORSETPROP("FetchMemo",.T.)
=CURSORSETPROP("FetchSize",100)
=CURSORSETPROP("MaxRecords",-1)
=CURSORSETPROP("Prepared",.F.)
=CURSORSETPROP("UpdateType",1)
=CURSORSETPROP("UseMemoSize",255)
ENDIF
上列的程式碼,是否表頭SKIP 一筆, 就要重新執行一次
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
每次執行 SQLEXEC() 會產生 MYVIEW ,那在執行前要不要先 USE IN MYVIEW ,還是不用關檔,產生MYVIEW 直接覆蓋
*
SELECT V_出貨表頭
.....
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW) && 這一行執行的結果應會產生 MYVIEW
? ALIAS() 結果是 V_出貨表頭,為何不是 MYVIEW
已困擾很久,請各位前輩幫忙 |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4212 來自: Taipei,Taiwan
第 5 樓
|
發表於: 星期日 四月 03, 2005 3:05 am 文章主題: |
|
|
"MYVIEW = 'V_出貨表身' "
"RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW) "
很明顯的,
MYVIEW 的值是 'V_出貨表身' ,
所以? ALIAS() 結果是 V_出貨表頭,
應該是"RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,"MYVIEW") "
其中差異你能體會嗎?
傳一個字串與傳一個字串變數是不同的. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
ms0800
註冊時間: 2004-07-23 文章: 65
第 6 樓
|
發表於: 星期日 四月 03, 2005 11:08 pm 文章主題: |
|
|
感謝 syntech 前輩的回答
但不懂前輩 MYVIEW = 'V_出貨表身'
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,"MYVIEW")
? alias() 應為 MYVIEW , 還是 V_出貨表身,還是V_出貨表頭
*
我現在的問題
SELECT V_出貨表頭
MYVIEW = 'V_出貨表身'
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
? ALIAS() 結果是 V_出貨表頭 ,我覺得應為 V_出貨表身 |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4212 來自: Taipei,Taiwan
第 7 樓
|
發表於: 星期一 四月 04, 2005 9:23 am 文章主題: |
|
|
ALIAS() 有的時候會有非預期的情況出現,
我也有發現,
你的疑問是這個嗎?
所以我現在不太使用 ALIAS() 取回目前的工作區,
還是以自己指定的方式處理. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
bin1x
註冊時間: 2004-08-27 文章: 462
第 8 樓
|
發表於: 星期一 四月 04, 2005 9:54 am 文章主題: |
|
|
syntech 寫到: | ALIAS() 有的時候會有非預期的情況出現,
我也有發現,
你的疑問是這個嗎?
所以我現在不太使用 ALIAS() 取回目前的工作區,
還是以自己指定的方式處理. |
select() 可能來的好 |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4212 來自: Taipei,Taiwan
第 9 樓
|
發表於: 星期一 四月 04, 2005 9:58 am 文章主題: |
|
|
兩個函式的機制不知道一不一樣.....
ALIAS() 傳回目前工作區的名稱(字串),
SELECT() 傳回目前工作區的編號(整數),
因為公司的習慣是以名稱當是識別基礎,所以代號就暫時不考慮. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
ms0800
註冊時間: 2004-07-23 文章: 65
第 10 樓
|
發表於: 星期三 四月 06, 2005 6:11 pm 文章主題: |
|
|
感謝 bin1x 及 syntech 的回答, 我的問題不在 select() 及 alias()
我的問題在
SQLEXEC(THISFORM.CONNECTID,"SELECT * FROM CUSTOMER","MYVIEW")
為何找不到 MYVIEW 這個 CURSOR ,但發現用 VFP6.0 及 VFP8.0 SP1 有問題,用 VFP8.0 是正常
也不知是我的問題還是VFP的問題,想用 VFP 9.0 跑跑看,目前 VFP 9.0 還沒有出貨,程式不能不寫,
暫時用 VFP 8.0 來寫了,還是感謝前輩的回答 |
|
回頂端 |
|
|
syntech
註冊時間: 2003-05-16 文章: 4212 來自: Taipei,Taiwan
第 11 樓
|
發表於: 星期三 四月 06, 2005 9:06 pm 文章主題: |
|
|
奇怪,
你一開始的問題,和你最後一次POST的問題不一樣.
一開始是 RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
因為 MYVIEW 是一個變數,其值為 'V_出貨表身'
所以傳回的 CURSOR 應該叫做 'V_出貨表身' (我前面好像剪刀漿糊貼錯了)
如果你要讓傳回的CURSOR 叫 "MYVIEW",
應該是 RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,"MYVIEW")
加上 " 或 ' .
不過,後面的問題似乎變成沒有傳回 result cursor,
你應該要用 利用 AERROR() 查看命令是否正確執行,
及 利用 SELECT ("MYVIEW") 驗證是否確實產生一個CURSOR (若傳回值 >0 ,則傳回值為其工作區編號)
因為你沒有作驗證的動作,
也許 M_COMM 中包含的SQL 命令是錯的(中途更動過也說不一定),也許 THISFORM.CONNECTID 連線已經中斷 ,
而你還是以為命令正常執行,而會產生CURSOR
我說的異常情況是指VFP 會偷偷摸摸切換工作區,
造成 ALIAS()傳回的工作區名稱在沒有人為切換工作區 (SELECT alias)的情況下,
得到不同的結果. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
|
ms0800
註冊時間: 2004-07-23 文章: 65
第 12 樓
|
發表於: 星期四 四月 07, 2005 12:35 am 文章主題: |
|
|
不好意思,讓syntech 前輩費心了,
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,"MYVIEW")
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
我知道上兩行不一樣,如果正常執行 第一行 CURSOR 叫 "MYVIEW"
第二 行 CURSOR 叫 'V_出貨表身'
對不起,前後所舉的例子不一樣,讓您誤解了,
那我重新再闡述我的問題
為何執行RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW)
這行後不會產生 &myview ->V_出貨表身 這個 cursor ,而且有時可以 ,有時不可以,我並沒有懷疑 thisform.connectid 有沒有斷線
也沒有用 aerror 來檢查命令是否正確執行,但讓我很奇怪的 vfp6.0 及 vfp8.0 SP1
RESULT=SQLEXEC(THISFORM.CONNECTID,M_COMM,MYVIEW) 無法正確產生 &myview ->V_出貨表身, VFP8.0 就正常
因為第一次用 SPT 語法,也不知道寫法對不對,如果前輩還願意聴我說,還望前輩給予指導,
表單的 LOAD 寫
RESULT=SQLEXEC(THISFORM.CONNECTID,'SELECT * FROM 表頭 WHERE 1 = 2','V_出貨表頭')
*
USER 查詢 '表頭'符合條件後開始秀資料,這時'表頭'的RECNO()一定停在符合條件的第一筆 所以 USER
下查詢指令後 RESULT=SQLEXEC(THISFORM.CONNECTID,'SELECT * FROM 表頭 WHERE 出貨日期 = DATE()','V_出貨表頭')
查詢表身 RESULT=SQLEXEC(THISFORM.CONNECTID,'SELECT * FROM 表身 WHERE 出貨單號 =?V_出貨表頭.出貨單號,'V_出貨表身')
這時應可秀出第一筆符合條件的出貨單,要查詢第二張出貨單,我寫的程序是
SELECT V_出貨表頭
SKIP
RESULT=SQLEXEC(THISFORM.CONNECTID,'SELECT * FROM 表身 WHERE 出貨單號 =?V_出貨表頭.出貨單號,'V_出貨表身')
*
如果再查下一張出貨單,一樣
SELECT V_出貨表頭
SKIP
RESULT=SQLEXEC(THISFORM.CONNECTID,'SELECT * FROM 表身 WHERE 出貨單號 =?V_出貨表頭.出貨單號,'V_出貨表身')
我很想知道我這個方法對不對,目前為止,好像沒有人正面囋聲可以,還是不好,因為自已沒有把握這種寫法,又碰到完全沒有修改程式
VFP 6.0 會找不到 V_出貨表身,VFP 8.0 又可以正常,VFP 8.0 SP1 一樣會找不到 V_出貨表身,讓我的心不安且迷惘,
如果前輩如果知道,煩請告之,謝謝 |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|