VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

請教有關spt 建立cursor 的問題

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
bin1x



註冊時間: 2004-08-27
文章: 462


第 8 樓

發表發表於: 星期一 四月 04, 2005 9:54 am    文章主題: 引言回覆

syntech 寫到:
ALIAS() 有的時候會有非預期的情況出現,
我也有發現,
你的疑問是這個嗎?

所以我現在不太使用 ALIAS() 取回目前的工作區,
還是以自己指定的方式處理.

select() 可能來的好
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
syntech



註冊時間: 2003-05-16
文章: 4212
來自: Taipei,Taiwan

第 9 樓

發表發表於: 星期一 四月 04, 2005 9:58 am    文章主題: 引言回覆

兩個函式的機制不知道一不一樣.....

ALIAS() 傳回目前工作區的名稱(字串),
SELECT() 傳回目前工作區的編號(整數),
因為公司的習慣是以名稱當是識別基礎,所以代號就暫時不考慮.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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的問題不一樣. Shocked

一開始是 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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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_出貨表身,讓我的心不安且迷惘,
如果前輩如果知道,煩請告之,謝謝
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作