 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 16 樓
|
發表於: 星期五 十二月 18, 2009 10:35 pm 文章主題: |
|
|
goodnight 寫到: |
謝謝, 改天三柱香跟您拜師 |
還要再加上鮮花和素果。
經濟若是許可,不妨加碼豬肉、雞、魚各一。
茶酒更是不可或缺。 |
|
回頂端 |
|
 |
chilin

註冊時間: 2003-10-01 文章: 79 來自: Taipei,Taiwan
第 17 樓
|
發表於: 星期六 十二月 19, 2009 12:48 am 文章主題: |
|
|
ckp6250 說得好
引言回覆: | 忘掉原有的 dbc , dbf ,cdx。 |
以SPT的方式,只要會使用基本的SQL語法即可
SELECT
INSERT
UPDATE
DELETE
即可完全使用SQL語法去操控後端資料庫。
INSERT & UPDATE 必較麻煩可寫成FUNCTION
Mysql 可參考下列FUCNTION
引言回覆: |
PUBLIC MYSQL_IP,MYSQL_DB,SQL_LINK
MYSQL_IP="localhost"
MYSQL_DB="test"
SQL_LINK=sqlstringconnect([DRIVER=MySQL ODBC 3.51 Driver;SERVER=]+MYSQL_IP+[;UID=root;PWD=1234;DATABASE=]+MYSQL_DB)
SQL_STR=[CREATE TABLE T1 (ID int(5) NOT NULL auto_increment,F1 CHAR(10) NOT NULL default '',PRIMARY KEY (ID)) ENGINE=MyISAM]
SQLEXEC(SQL_LINK,SQL_STR)
SQL_USE([T1],[T1]) &&建立一個無資料的MYSQL資料表成為一個CURSOR
APPEND BLANK
REPLACE F1 WITH [INSERT1]
APPEND BLANK
REPLACE F1 WITH [INSERT2]
APPEND BLANK
REPLACE F1 WITH [INSERT3]
SQL_INSERT([T1],[T1])
USE IN T1
SQL_STR=[SELECT * FROM T1]
SQLEXEC(SQL_LINK,SQL_STR,[T1])
BROW
REPLACE ALL F1 WITH STRTRAN(F1,[INSERT],[UPDATE])
SQL_UPDATE([T1],[ID=?ID])
SQL_STR=[SELECT * FROM T1]
SQLEXEC(SQL_LINK,SQL_STR,[T1])
BROW
USE IN T1
SQL_DELETE([T1],[ID=2])
SQL_STR=[SELECT * FROM T1]
SQLEXEC(SQL_LINK,SQL_STR,[T1])
BROW
CLEAR ALL
*******************
FUNCTION SQL_USE
*******************
PARAMETER F_TABLE,F_ALIAS
LOCAL CREATE_STR
SQLCOLUMNS(SQL_LINK,F_TABLE,'NATIVE','T')
CREATE_STR='CREATE CURSOR '+F_ALIAS+' ('
SCAN
DO CASE
CASE INLIST(T.TYPE_NAME,'varchar','char')
CREATE_STR=CREATE_STR+T.COLUMN_NAME+' C('+ALLTRIM(STR(T.COLUMN_SIZE))+'),'
CASE INLIST(T.TYPE_NAME,'int','float','double')
CREATE_STR=CREATE_STR+T.COLUMN_NAME+' N('+ALLTRIM(STR(T.COLUMN_SIZE))+','+ALLTRIM(STR(DECIMAL_DIGITS))+'),'
CASE T.TYPE_NAME='date'
CREATE_STR=CREATE_STR+T.COLUMN_NAME+' D( ,'
CASE T.TYPE_NAME='text'
CREATE_STR=CREATE_STR+T.COLUMN_NAME+' M,'
ENDCASE
ENDSCAN
USE IN T
SELECT 0
CREATE_STR=LEFT(CREATE_STR,LEN(CREATE_STR)-1)+')'
&CREATE_STR
SELECT &F_ALIAS
ENDFUNC
***********************
FUNCTION SQL_INSERT
***********************
PARAMETER F_TABLE,F_CURSOR
LOCAL VARALL,VAR1,VAR2,I,J,F_VAL,FTYPE,OK
SELECT (F_CURSOR)
VAR1=""
FOR I=1 TO FCOUNT()
VAR2=FIELD(I)
IF EMPTY(VAR1)
VAR1=ALLTRIM(VAR2)
ELSE
VAR1=VAR1+","+ALLTRIM(VAR2)
ENDIF
ENDFOR
VARALL="INSERT INTO "+F_TABLE+"("+VAR1+") VALUES "
GOTO TOP
SQL_STR=[]
SCAN
SQL_STR=VARALL
SQL_STR=SQL_STR+[(]
FOR J=1 TO FCOUNT()
F_VAL=F_CURSOR+[.]+FIELD(J)
FTYPE=TYPE(FIELD(J))
DO CASE
CASE INLIST(FTYPE,"C","M")
SQL_STR=SQL_STR+[?ALLTRIM(&F_VAL),]
CASE FTYPE="L"
IF &F_VAL=.T.
SQL_STR=SQL_STR+['1',]
ELSE
SQL_STR=SQL_STR+['0',]
ENDIF
CASE FTYPE="D"
TD1=DTOS(&F_VAL)
IF EMPTY(TD1)
TD1="00000000"
ENDIF
SQL_STR=SQL_STR+TD1+[,]
OTHERWISE
SQL_STR=SQL_STR+[?&F_VAL,]
ENDCASE
ENDFOR
SQL_STR=LEFT(SQL_STR,LEN(SQL_STR)-1)
SQL_STR=SQL_STR+[)]
OK=SQLEXEC(SQL_LINK,SQL_STR)
ENDSCAN
GOTO TOP
RETURN OK
ENDFUNC
***********************
FUNCTION SQL_UPDATE
***********************
PARAMETER F_TABLE,F_WHERE
LOCAL VARALL,J,F_VAL,FTYPE,OK
SELECT (F_TABLE)
VARALL=[UPDATE ]+F_TABLE+[ SET ]
GOTO TOP
SCAN
SQL_STR=VARALL
FOR J=1 TO FCOUNT()
F_VAL=F_TABLE+[.]+FIELD(J)
FTYPE=TYPE(FIELD(J))
DO CASE
CASE INLIST(FTYPE,"C","M")
SQL_STR=SQL_STR+ALLTRIM(FIELD(J))+[=?ALLTRIM(&F_VAL),]
CASE FTYPE="L"
IF &F_VAL=.T.
SQL_STR=SQL_STR+ALLTRIM(FIELD(J))+[='1',]
ELSE
SQL_STR=SQL_STR+ALLTRIM(FIELD(J))+[='0',]
ENDIF
CASE FTYPE="D"
TD1=DTOS(&F_VAL)
IF EMPTY(TD1)
TD1="00000000"
ENDIF
SQL_STR=SQL_STR+ALLTRIM(FIELD(J))+[=]+TD1+[,]
OTHERWISE
SQL_STR=SQL_STR+ALLTRIM(FIELD(J))+[=?&F_VAL,]
ENDCASE
ENDFOR
SQL_STR=LEFT(SQL_STR,LEN(SQL_STR)-1)
SQL_STR=SQL_STR+[ WHERE ]+F_WHERE
OK=SQLEXEC(SQL_LINK,SQL_STR)
ENDSCAN
GOTO TOP
RETURN OK
ENDFUNC
************************
FUNCTION SQL_DELETE
************************
PARAMETER F_TABLE,F_WHERE
LOCAL OK
OK=SQLEXEC(SQL_LINK,[DELETE FROM ]+F_TABLE+[ WHERE ]+F_WHERE)
RETURN OK
ENDFUNC |
_________________ 一個喜愛Latte的男人 |
|
回頂端 |
|
 |
tinwhang
註冊時間: 2009-11-08 文章: 104
第 18 樓
|
發表於: 星期六 十二月 19, 2009 5:07 pm 文章主題: |
|
|
非常感激您,雖然我不是看的很懂,但 相信一定是很好用的FUNCTION |
|
回頂端 |
|
 |
LiuRambo
註冊時間: 2007-11-27 文章: 481
第 19 樓
|
發表於: 星期六 十二月 19, 2009 11:01 pm 文章主題: |
|
|
我們公司也是建議我們把sql的幾個常用指令寫成function
這樣省得每次都得重寫一串 |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 20 樓
|
發表於: 星期日 十二月 20, 2009 12:19 am 文章主題: |
|
|
令狐沖在學會吸星大法之後,
短時間之內的確是功力大增,
不過實際上卻是功力越高反噬越大.
如果沒有學會易筋經,
下場如何看看任我行知道了.
給那些覺得去社群求救就好的人做個參考. ^_^b _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 21 樓
|
發表於: 星期日 十二月 20, 2009 6:47 am 文章主題: |
|
|
LiuRambo 寫到: | 我們公司也是建議我們把sql的幾個常用指令寫成function
這樣省得每次都得重寫一串 |
同意這個看法。
不過,我傾向建議把這些 Function 寫在 SQL Servre 的 Stored Procedure 中,而非寫在 VFP 的 prg 中。
不知怎麼搞的,近幾年來對於『可攜性』的問題,變得關注起來。 |
|
回頂端 |
|
 |
tinwhang
註冊時間: 2009-11-08 文章: 104
第 22 樓
|
發表於: 星期日 十二月 20, 2009 9:44 am 文章主題: |
|
|
其實經我測試以後是可以接的,謝謝大家 |
|
回頂端 |
|
 |
tinwhang
註冊時間: 2009-11-08 文章: 104
第 23 樓
|
發表於: 星期日 十二月 20, 2009 10:13 am 文章主題: |
|
|
ckp6250 寫到: | LiuRambo 寫到: | 我們公司也是建議我們把sql的幾個常用指令寫成function
這樣省得每次都得重寫一串 |
同意這個看法。
不過,我傾向建議把這些 Function 寫在 SQL Servre 的 Stored Procedure 中,而非寫在 VFP 的 prg 中。
不知怎麼搞的,近幾年來對於『可攜性』的問題,變得關注起來。 |
呵呵師兄您真的好厲害 ,一語驚醒夢中人 ,
不過我的SPT 整合方案,整個快測試完了,真是謝謝您的幫助,下次如果有寫小程式的地方,小弟願為代勞
其實 可攜性真的很重要 ,因為您寫完的程式以後,下次要再整合的時候就不用那麼累了, 比如說這一次我們的公司的VFP .DBF 本來是要做廢的,但後來 經我的測試以後不但效能可以增加,並而且可以與我們的網站連結資料 , 那何樂不為呢? |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 24 樓
|
發表於: 星期一 十二月 21, 2009 9:32 am 文章主題: |
|
|
tinwhang 寫到: |
其實經我測試以後是可以接的,謝謝大家 |
你可能得說一下什麼叫"可以接".
話說,接不接,也沒關係,
可以動作就好. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
tinwhang
註冊時間: 2009-11-08 文章: 104
第 25 樓
|
發表於: 星期一 十二月 21, 2009 6:10 pm 文章主題: |
|
|
tinwhang 寫到: | syntech 寫到: | SQLEXEC() 取回的資料為 LOCAL CURSOR,
地位與 TABLE 相當,資料操作也幾乎等於一般的TABLE,
只是你如果沒有作適當處理,
LOCAL CURSOR的資料異動不會更新到後端資料庫
才會查對你的資料操作方式. |
非常感謝您的解說,
但這套系統原本就已經有設 .cdx ,那我應該下什麼指令,才可以讓
cursor來承接原本的 .cdx ?
謝謝 |
CURSOR 可以來承接原本的 .CDX |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 26 樓
|
發表於: 星期一 十二月 21, 2009 8:30 pm 文章主題: |
|
|
tinwhang 寫到: |
CURSOR 可以來承接原本的 .CDX |
寒流來了,
好冷哦! |
|
回頂端 |
|
 |
tinwhang
註冊時間: 2009-11-08 文章: 104
第 27 樓
|
發表於: 星期一 十二月 21, 2009 11:13 pm 文章主題: |
|
|
ckp6250 寫到: | tinwhang 寫到: |
CURSOR 可以來承接原本的 .CDX |
寒流來了,
好冷哦! |
師兄,那就請您多穿衣服吧 !!! 多保重丫,免得看到美女一直流鼻涕,那就不好了
哇哈哈 |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 28 樓
|
發表於: 星期二 十二月 22, 2009 8:57 am 文章主題: |
|
|
用"承接",還不如說"沿用".
但是其實還是差很多.
使用了原先的CDX,
這個說法不太通,
大多是直接對取回來的CURSOR重新下INDEX ON 的命令,產生新的CDX,
不太會拿原先的CDX再作REINDEX的動作.
此時下的INDEX ON 命令就純粹只為了加速本地端CURSOR的存取速度而已,
索引鍵值不必與原先的相同.
在本地端不管怎麼下INDEX,REINDEX,
對遠端DB主機上的原始TABLE一點作用都沒有,
在遠端DB主機執行CREATE INDEX,ALTER TABLE命令,也不會對本地端CURSOR有任何作用,
所以稱為"沒得接,各玩各的". _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
tinwhang
註冊時間: 2009-11-08 文章: 104
第 29 樓
|
發表於: 星期二 十二月 22, 2009 6:08 pm 文章主題: |
|
|
syntech 寫到: | 用"承接",還不如說"沿用".
但是其實還是差很多.
使用了原先的CDX,
這個說法不太通,
大多是直接對取回來的CURSOR重新下INDEX ON 的命令,產生新的CDX,
不太會拿原先的CDX再作REINDEX的動作.
此時下的INDEX ON 命令就純粹只為了加速本地端CURSOR的存取速度而已,
索引鍵值不必與原先的相同.
在本地端不管怎麼下INDEX,REINDEX,
對遠端DB主機上的原始TABLE一點作用都沒有,
在遠端DB主機執行CREATE INDEX,ALTER TABLE命令,也不會對本地端CURSOR有任何作用,
所以稱為"沒得接,各玩各的". |
嗯了解, 那真的是我的語意不明,我的前題是CURSOR 可否接原本的 .CDX
呵
雖然這樣處理對別人來說可能無意義,但我這套系統卻起了不小的作用 ...
因為原本的 .CDX 有好幾百個 ,那我就不用再一一下去下 INDEX ON 的指令
也不用下去測試每一個.CDX , 那我是不是可以享受一下 短暫的快樂 .... 呵呵
真是感激您們 .... |
|
回頂端 |
|
 |
ckp6250
註冊時間: 2004-07-30 文章: 1645
第 30 樓
|
發表於: 星期二 十二月 22, 2009 7:21 pm 文章主題: |
|
|
tinwhang 寫到: |
雖然這樣處理對別人來說可能無意義,但我這套系統卻起了不小的作用 ...
因為原本的 .CDX 有好幾百個 ,那我就不用再一一下去下 INDEX ON 的指令
也不用下去測試每一個.CDX , 那我是不是可以享受一下 短暫的快樂 .... 呵呵
|
怎麼越聽腳底越冷? |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|