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

童心未泯的VFP+SQL 編程(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期二 二月 24, 2004 5:13 pm    文章主題: 童心未泯的VFP+SQL 編程(轉貼) 引言回覆

來源:梅子 童心未泯
http://www.meizibbs.3322.org/bbs/dispbbs.asp?boardID=24&ID=6039

VFP+SQL 編程(1)-動態創建數據源
答覆小可及支持她的網友的提問。

謝謝大家對我的信任和支持,我開始學習VFP+SQL Server編程比較晚,大約是VFP6和SQL Server 7.0 出來後才開始的。從學習和實踐中取得了一些經驗。如果大家有興趣,我可以把一些心得介紹給大家。
我將完整介紹VFP+SQL Server C/S結構編程.不清楚的朋友可向小可一樣提出問題,我如果懂的話,可作解答。

1、數據源的建立方式
因為建立數據源是VFP+SQL Server編程的第一步,所以要先講。
一般初次接觸時,都是手工建立ODBC數據源,但這樣做有一些不方便,特別是工作站數量較多或工作站較分散,手工方式就比較麻煩了。你要到每一台工作站上去建立ODBC數據源。

用程序自動建立ODBC數據源的優點有以下幾點:
1、可以方便地用IP地址訪問服務器,不論是在局域網內還是在英特網上,只要知道服務器的IP地址,就能正常訪問服務器。(實踐證明,這種方法在INTERNT上可能順利通過交換機和路由器。)

2、不用麻煩地在每台工作站去設定ODBC。

我將在後面給出用程序調用API函數去建立ODBC數據源。
登錄表單的界面


調用方式:
我是在登錄表單的「確定」按鈕的Click事件中調用這個函數的

* 去掉控格
gcDSN=ALLTRIM(thisform.dsn) && 你輸入的服務器IP地址或服務器名
gcUID=ALLTRIM(thisform.uid) && 用戶登錄名 如:sa
gcPWD=ALLTRIM(thisform.pwd) && 用戶口令
保存用戶的輸入服務器IP和用戶名地(VFP表中)
*IF NOT USED("cfg")
* USE \tmp\cfg.dbf IN 0
*ENDIF

*
SELECT cfg
replace cfg.DSN WITH thisform.dsn
replace cfg.UID WITH thisform.uid


* 創建用戶名數據源
CreateDSN(gcDSN,gcSQLDatabase+"數據源",gcDSN,gcSQLDatabase)

thisform.handle = SQLSTRINGCONNECT("DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=&gcSQLDatabase")

thisform.Release


變量說明:(變量全是全局變量,變量名第1個字母表示全局,第2個字母表示變量類型,如c表示字符型,n表示數值型)
gcDSN-------數據源名,如果你輸入的是IP,就可能是這樣」192.168.0.1「,如果是服務器名可能是這樣」pcsrv「

gcSQLDatabase----SQL Server 的系統數據 "master"或你創建的數據庫

登錄表單的源程序:
http://vfp.sunyear.com.tw/download.php?id=302


在登錄表單login.scx的Unload事件中的內容為:
* 如果登錄失敗 thisform.handle<=0
RETURN thisform.handle

注意:gnMaster是連接SQL Server的系統數據庫Master的連接句柄。

在入口主程序中應輸入下列語句,可避免ODBC對話框的出現:
SQLSETPROP(0,"DispLogin",3)


登錄表單的Init事件內容:

*從VFP表cfg.dbf中取得上次輸入的IP地址和用戶名,結果存入用戶自定義屬性中
thisform.uid=cfg.uid
thisform.dsn=cfg.dsn

登錄表單的UnLoad事件:

* 將登錄結果返回給調用登錄表單的主程序 main.prg
RETURN thisform.handle

* thisform.handle>0 登錄成功
* thisform.handle <0 登錄失敗

*在主程序中調用登錄表單的方法

* 檢查帳號
************************************************************
Do Form gcFormsPath+"login.scx" To gnHandle &&

If gnHandle <= 0 &&口令不正確
Quit
Endif
************************************************************



程序創建數據源程序原碼:
代碼:
*****************************************************************************
* 函數名:CreateDSN
* 功能:用API函數來?#93;置ODBC數據源
* 調用方式:=CreateDSN(c數據源名,c數據源描述,cSQL服務器名,cSQL數據庫名)
* 來源:《談談VFP和SQL SERVER搭配做C/S系統》
* 註:這裡建立的是用戶數據源

*下面的例子是用API函數來?#93;置和刪除ODBC數據源。
*函數名字是 SQLConfigDataSource,其中第二項參數是數字(1-增?#91; 2-修改 3-刪除)
Function CreateDSN
 Parameters c數據源名,c數據源描述,cSQL服務器名,cSQL數據庫名

 Declare Integer SQLConfigDataSource In odbccp32 Integer, Integer, String, String

 lnWindowHandle=0
 lcODBCDriver='SQL Server' && DRIVER類型
 *c數據源名='ZXJ' && 數據源名字
 *c數據源描述='文檔管理數據源' && 數據源描述
 *cSQL服務器名='ZXJ' && SQL SERVER名字
 *cSQL數據庫名='文檔管理' && 要連接的數據庫名字

 **先試圖修改已有的ODBC,如果不存在,返回0。
 lreturn=SQLConfigDataSource(lnWindowHandle, 2, lcODBCDriver, ;
  'DSN=' + c數據源名 + Chr(0) ;
  + 'Description=' + c數據源描述 + Chr(0) ;
  + 'Server=' + cSQL服務器名 + Chr(0) ;
  + 'Database=' + cSQL數據庫名 + Chr(0))
 If lreturn=0 &&不存在

  **添?#91;新的ODBC
  lreturn=SQLConfigDataSource(lnWindowHandle, 1, lcODBCDriver, ;
   'DSN=' + c數據源名 + Chr(0) ;
   + 'Description=' + c數據源描述 + Chr(0) ;
   + 'Server=' + cSQL服務器名 + Chr(0) ;
   + 'Database=' + cSQL數據庫名 + Chr(0))
  If lreturn=0 &&失敗
   Messagebox('添?#91;ODBC數據源失敗',0+16+0,'BUFFER')
  Endif
 Endif
 Return

 *****************************************************************************
Function DelDSN
 Parameters c數據源名,c數據源描述,cSQL服務器名,cSQL數據庫名

 * 功能:用API函數來刪除ODBC數據源
 * 調用方式:=刪除數據源(c數據源名,c數據源描述,cSQL服務器名,cSQL數據庫名)
 * 來源:《談談VFP和SQL SERVER搭配做C/S系統》
 * 註:這裡建立的是用戶數據源

 **用完後,可以在表單DESTROY事件裡刪除ODBC。 如果不想重複?#93;置參數,可以把這些參數?#91;到表單作為屬性。

 Declare Integer SQLConfigDataSource In odbccp32 Integer, Integer, String, String

 lnWindowHandle=0
 lcODBCDriver='SQL Server'
 *c數據源名='SharedData'
 *c數據源描述='Shared Data Source'
 *cSQL服務器名='DEVSQL'
 *cSQL數據庫名='Shared'

 **先修改,或者其是否存在
 lreturn=SQLConfigDataSource(lnWindowHandle, ;
  2, lcODBCDriver, ;
  'DSN=' + c數據源名 + Chr(0) ;
  + 'Description=' + c數據源描述 + Chr(0) ;
  + 'Server=' + cSQL服務器名 + Chr(0) ;
  + 'Database=' + cSQL數據庫名 + Chr(0))
 If lreturn=1 &&ODBC存在,刪除它
  lreturn=SQLConfigDataSource(lnWindowHandle, ;
   3, lcODBCDriver, ;
   'DSN=' + c數據源名 + Chr(0) ;
   + 'Description=' + c數據源描述 + Chr(0) ;
   + 'Server=' + cSQL服務器名 + Chr(0) ;
   + 'Database=' + cSQL數據庫名 + Chr(0))
  If lreturn=0
   Messagebox('刪除ODBC源失敗',0+16+0,'Buffer')

  Endif'
 Endif

 **清除DLL
 Clear Dlls
 * End

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################


Ruey 在 星期四 二月 26, 2004 3:10 pm 作了第 3 次修改
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期二 二月 24, 2004 5:19 pm    文章主題: 引言回覆

VFP+SQL 編程(2)-動態創建遠程視圖
先看源程序
代碼:
LPARAMETERS cSQLDatabaseName,cConnectionName,cSQLTableName,cViewName,cKey,cCondition,cOrder
*cSQLDatabaseName 後端數據庫名
* cConnectionName  連接名
* cSQLTableName        後端表名
* cViewName  視圖名
* cKey  主鍵
* cCondition 視圖條件 
* cOrder 排序

*LOCAL nConnectHandle &&數據庫連接句柄

LOCAL cFieldName &&字段名

***********************************************************************
* 函數名:CreateView
* 作用:* 創建遠{視圖函數
* 參數說明:
*   cOrder---排序方式
*   nHandle---指定的數據庫的連接句柄
*  cSQLDatabaseName---SQL Server數據庫名
*   cConnName---連接名
*   cSQLTableName---SQL Server表名
*   cViewName---要創建的遠{視圖名
*   cKey---主鍵
*   cCondition---條件
* 調用格式:
* =CreateView('數據庫名','連接名','後端表名','視圖名','主鍵名','條件','排序')

* 第一步、創建視圖

* 如果是帶條件的視圖

IF NOT EMPTY(cCondition)   

 CREATE SQL VIEW &cViewName ;
  CONNECTION &cConnectionName SHARE ;
  AS SELECT * FROM &cSQLTableName WHERE &cCondition ;
  ORDER BY &cOrder

ELSE       && 如果是不帶條件的視圖

 CREATE SQL VIEW &cViewName ;
  CONNECTION &cConnectionName SHARE ;
  AS SELECT * FROM &cSQLTableName ;
  ORDER BY &cOrder

ENDIF



* 第二步、]置視圖可更新
* 1).Tables 屬性
DBSETPROP('&cViewName','View','Tables','&cSQLTableName')


* 2).KeyField 屬性(將字段"cKey"]定成關鍵字欄)
DBSETPROP('&cViewName..&cKey','Field','KeyField',.T.)

* 3.UpdateName 屬性
DBSETPROP('&cViewName..&cKey','Field','UpdateName','&cSQLTableName..&cKey')

* 4)Updatable 屬性(指定可更新的字段)

* 取得SQL Server表「cSQLTableName」結構,存放在表「表結構」中
*nConnectHandle=SQLSTRINGCONNECT('DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=&cSQLDatabaseName')

* 參見《Visual FoxPro 6.X 中文版{序]計》p.431
* 11.12 取得後端字段的相關信息
cCursorName='C'+SYS(3)
N=SQLCOLUMNS(gnHandle,"&cSQLTableName","FOXPRO","&cCursorName")
*  n=SQLCOLUMNS(nConnectHandle,"文檔","FOXPRO","基表結構")
* n=0 SQLCOLUMNS還在執行中
* n=1 SQLCOLUMNS執行成功
* n=-1 發生連接層次上的錯誤
* n=-2 發生系統環境上的錯誤


SELECT(cCursorName)
SCAN
 cFieldName=ALLTRIM(&cCursorName..Field_name)
 DBSETPROP('&cViewName..&cFieldName','Field','Updatable',.T.)   && 可更新

 DO CASE

  CASE  Field_type='C' && 如果是Char型字段,默{值是''
   DBSETPROP('&cViewName..&cFieldName','Field','Defaultvalue',' ') && 默{值

  CASE  &cCursorName..Field_type='N' && 如果是Number型字段,默{值是0
   DBSETPROP('&cViewName..&cFieldName','Field','Defaultvalue','0') && 默{值

  CASE  Field_type='T' && 如果是smalldatetime型字段,改變視圖字段類型成日期型
   IF NOT cFieldName='更新時間'
    DBSETPROP('&cViewName..&cFieldName','Field','DataType','d')
   ENDIF
  CASE  Field_type='I' && 如果是int型字段,
   DBSETPROP('&cViewName..&cFieldName','Field','DataType','n(10,0)')

  CASE  Field_type='L' && 如果是bit型字段,改變視圖字段類型為邏輯型
   DBSETPROP('&cViewName..&cFieldName','Field','DataType','l')
   DBSETPROP('&cViewName..&cFieldName','Field','Defaultvalue','.F.') && 默{值

  CASE  Field_type='M' AND ALLTRIM(cFieldName)='TIMESTAMP'&&
 ENDCASE
ENDSCAN
USE IN (cCursorName)

* 5)打} SQL 更新}關
DBSETPROP('&cViewName','View','SendUpdates',.T.)

* 6) ]定更新衝突的解決方式(主鍵和已修改字段)
DBSETPROP('&cViewName','View','WhereType',2)
DBSETPROP("&cViewName","View","ShareConnection",.T.) &&將視圖]置成共享連接

* 7) 更新類型,先刪除,後插入
* DBSETPROP('&cViewName','View','UpdateType',2)

* Endfunc
***********************************************************************************


調用之前應先創建一個本地數據庫和連接:

* 創建連接
代碼:
****************************************************
Create Connection 資料連接 ;
 DATASOURCE '&gcDSN' ;
 USERID '&gcUID' ;
 PASSWORD '&gcPWD' ;
 DATABASE &gcSQLDatabase
****************************************************
其中:gcDSN是數據源名稱
   gcUID 是用戶登錄名
         gcPWD 是用戶口令
         gcSQLDatabase 是後端SQL數據庫(你自己創建的)




例如:
* 創建視圖 "VIEW_視圖屬性" 用以保存和設置系統所用視圖的屬性
createview(gcSQLDatabase,'資料連接','視圖屬性','view_視圖屬性','ID',"",'視圖屬性.ID')
* 後端數據庫名 連接名 後端表名 視圖名 主鍵 條件 排序

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 3 樓

發表發表於: 星期二 二月 24, 2004 5:22 pm    文章主題: 引言回覆

VFP+SQL 編程(3)-用VFP創建SQL數據庫


代碼:
**********************************************
* Copyright (c) 2003,
* All rights reserved.
*
* 文件名稱:CreateSQLDB
* 文件標識:
* 摘    要:創建後端SQL Server 用戶數據庫
*
* 當前版本:1.0
* 完成日期:2003.03
**********************************************
SET TALK OFF
*SET STEP ON
gcDSN='PCSRV'
gcUID='sa'
gcPWD='111'
gcSQLDatabase='資料管理'
* ?#93;定不顯示出ODBC登錄對話框

=SQLSETPROP(0,"DispLogin",3)

gnMaster =SQLSTRINGCONNECT("DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=master")


WAIT CLEAR
WAIT WINDOWS "正在創建數據庫「" + gcSQLDatabase + "」,請稍候..." NOWAIT NOCLEAR

llCreateResult=.F.  && 創建數據庫gcSQLDatabase結果
llDelResult=.T.  && 刪除數據庫gcSQLDatabase結果


* ?#125;始互動交易
=SQLSetProp(gnMaster,'Transactions',2)

* 判斷用戶數據庫「gcSQLDatabase」數據庫存在否A如果存在,gnHandle>0
gnHandle =SQLSTRINGCONNECT("DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=&gcSQLDatabase")

IF gnHandle> 0 &&表明"gcSQLDatabase"數據庫已經存在

 =SQLDISCONNECT(gnHandle) &&切斷與數據庫「gcSQLDatabase」的聯繫,否則不能刪除。

 WAIT CLEAR

 WAIT WINDOWS "「" + gcSQLDatabase+"」數據庫已經存在,正在刪除..." NOWAIT NOCLEAR
 
 IF SQLEXEC(gnMaster,"DROP DATABASE &gcSQLDatabase") > 0 &&刪除

  WAIT CLEAR
  WAIT WINDOWS "刪除「" + gcSQLDatabase +"」庫成功!" NOWAIT NOCLEAR
  llDelResult=.T.
  WAIT CLEAR
  WAIT WINDOWS "繼續創建數據庫「" + gcSQLDatabase +"」..." NOWAIT NOCLEAR

 ELSE
  WAIT CLEAR
  WAIT WINDOWS "刪除「" + gcSQLDatabase +"」庫失敗!" NOWAIT NOCLEAR
  llDelResult=.F.
 ENDIF
ENDIF

IF llDelResult=.T.


 IF SQLEXEC(gnMaster,"CREATE DATABASE &gcSQLDatabase") > 0 && 嘗試實際更新,並且以後寫入為準

  * 結束互動交易
  SQLCOMMIT(gnMaster)
  WAIT CLEAR
  llCreateResult=.T. && 創建成功標誌
  ??CHR(7)
  MESSAGEBOX("創建「"+ gcSQLDatabase + "」庫成功!按任意鍵退出",0,"創建數據庫") 
 ELSE
  * 錯誤處理
  AERROR(la錯誤)

  * 向後恢復
  SQLROLLBACK(gnMaster)
  WAIT CLEAR
  ??CHR(7)
  MESSAGEBOX("創建「"+ gcSQLDatabase + "」庫失敗!按任意鍵退出",0,"創建數據庫")   
  llCreateResult=.F. && 創建成功標誌
 ENDIF
 WAIT CLEAR
ENDIF

RETURN llCreateResult




說明:
1、先要與master數據庫建立連接
gnMaster =SQLSTRINGCONNECT("DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=master")

2、然後創建數據庫
SQLEXEC(gnMaster,"CREATE DATABASE &gcSQLDatabase")

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################


Ruey 在 星期二 二月 24, 2004 5:25 pm 作了第 1 次修改
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 4 樓

發表發表於: 星期二 二月 24, 2004 5:24 pm    文章主題: 引言回覆

VFP+SQL 編程(4)-用VFP創建SQL表

代碼:
**********************************************
* Copyright (c) 2003,成都曉進軟件工作室
* All rights reserved.
*
* 文件名稱:CreateSQLTable
* 文件標識:
* 摘    要:創建後端SQL Server 用戶數據表
*
* 當前版本:1.0
* 完成日期:2003.03
**********************************************


gcDSN='192.168.0.80'
gcUID='sa'
gcPWD=''
gcSQLDatabase='資料管理'

=SQLSETPROP(0,"DispLogin",3)


gnHandle =SQLSTRINGCONNECT("DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=&gcSQLDatabase")

IF NOT USED("cfg")
 USE c:\資料管理\tmp\cfg.dbf
ENDIF
SELECT cfg

IF cfg.codetable=.t. && 代碼表

 SQLEXEC(gnHandle,"CREATE TABLE 代碼表 (ID int not null IDENTITY (1,1) PRIMARY KEY)")
 SQLEXEC(gnHandle,"ALTER TABLE 代碼表 ADD 類型 char (10)  null")
 SQLEXEC(gnHandle,"ALTER TABLE 代碼表 ADD 代碼 char (20) null")
 SQLEXEC(gnHandle,"ALTER TABLE 代碼表 ADD 名稱 char (40) null")

ENDIF

IF cfg.colldata=.T. && 資料收集

 SQLEXEC(gnHandle,"CREATE TABLE 資料收集 (ID int not null IDENTITY (1,1) PRIMARY KEY)")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 接收日期 datetime null") && 默{值:系統日期
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 序號 Int null")   && 自動
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 接收人 char (8) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 送交人 char (8)  null")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 文件號 char (30) null") && 原為「文件編號」

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 標準代號 char (30) null")     && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 標準名稱 varchar (200) null") && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 譯名 varchar (200) null")     && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 實施日期 smalldate null")     && 新增 標準的「實施日期」
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 編製單位 varchar (60) null")  && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 文件編製 varchar (100) null")      && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 文種 char (10) null")        && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 機構代號 varchar (30) null")  && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 標準年份 int null")     && 新增

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 內部編號 char (30) null") && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 文件編碼 char (30) null")   && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 文件名 char (200) null")    && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 文件狀態 char (6) null")   && 新增
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 載體 char (6) null")    && 新增

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 工{代號 char (30) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 工{名稱 varchar (80) null") &&
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 原文號 text null")  &&
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 總帳號 Int null")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD ]計階段 char (20) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 版次 char (2) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 題目 varchar (200) null") &&
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 關鍵詞 char (30) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 密級 char (4) null")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 歸檔份數 Int null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 頁數 Int null") && 原為每冊頁數
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 底圖張數 Int null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 保管期限 char (4) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 責任者 varchar (80) null")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 形成時間 char (22) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 入庫時間 smalldatetime null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 手稿 Int null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 獲獎等級 char (4) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 備註 text null")  &&原為 char(60)

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 資料庫別 char (10) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 電子文件名 char (20) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 全息瀏覽級別 char (8) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 校對 char (20) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 審查 char (14) null")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 審定 char (14) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 歸檔單位 varchar (100) null") &&
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 修改 char (1) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 借閱標識 char (20) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 文件剩餘份數 Smallint (2) null")


 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 歸檔標誌 int null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 歸檔申請人 char (8) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 歸檔申請時間 smalldatetime null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 歸檔接收人 char (8) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 歸檔接收時間 smalldatetime null")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 入庫標誌 char (1) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 入庫申請人 char (8) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 入庫申請時間 smalldatetime null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 入庫接收人 char (8) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 入庫接收時間 smalldatetime null")

 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 專業系統 char (44) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 底圖張數 Int null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 分冊數 Int null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 批准人 char (8) null")

 * 增[的字段
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 資料類型 char (20) null")
 SQLEXEC(gnHandle,"ALTER TABLE 資料收集 ADD 時間戳 timestamp)")
 
ENDIF



說明:
1、為什麼要用多條建立一個表呢?
這是因為創建後端SQL的表的命令是包含在SQLEXEC()函數中的,如果你要建立的表的字段數多,你的命令長度很容易超過255個字符的限制,另外,程序可讀也很差。

2、為什麼要建立ID字段呢?
這是因為ID字段是一個特殊整型字段,它作為關鍵字,用來解決更新衝突的。它的值自動增1,便不會重複,例如,某行的ID=100,如果刪除這行,便永遠不會出現ID=100的值了。

3、為什麼要建立「時間戳」 類型是 timestamp的字段,同樣也是用來解決數據更新的,當一個表的字段較多時,如果增加這個字段,更新速度較快,因為SQL Server 只看這個字段的內容變沒有,如果變了,說明你更改了數據。反之沒有更改。

這個兩個字段都不需要你來管理和維護。你只管在表中加入這兩個字段就行了。

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 5 樓

發表發表於: 星期二 二月 24, 2004 5:27 pm    文章主題: 引言回覆

VFP+SQL 編程(5)-用SPT管理帳號
1、添加一個帳號

gcDSN='PCSRV' && pcsrv是我的主機名
gcUID='sa'
gcPWD='111'
gcSQLDatabase='資料管理'

* 設定不顯示ODBC登錄對話框
=SQLSETPROP(0,"DispLogin",3)
* 建立與數據庫master的連接
gnMaster =SQLSTRINGCONNECT("DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=master")

cNewLoginID='zxj'
添加一個登錄名(在SQL Server上)'zxj'
n1=SQLEXEC(gnMaster,"sp_addlogin '&cNewLoginID'")

2、在你的數據庫中添加一個用戶zxj
建立與你的數據庫的連接

建立與你的數據庫的連接
ghandle = SQLSTRINGCONNECT("DSN=&gcDSN;UID=&gcUID;PWD=&gcPWD;DATABASE=&gcSQLDatabase")

添加一個zxj用戶(在你的數據庫中)
n2=SQLEXEC(gnHandle ,"sp_grantdbaccess '&cNewLoginID','&cNewLoginID'")




如果n1>0 或n2>0 表示建立成功。反之失敗

3、刪除一個數據庫用戶
n1=SQLEXEC(gnHandle ,"sp_revokedbaccess '&cLoginID'")

注意:你操作的是後台的哪個數據庫,要看連接句柄是指向哪個數據庫的。這裡的連接句柄是指向我的數據庫「資料管理」
變量意義同1樓。


4、刪除一個登錄帳號

n2=SQLEXEC(gnMaster ,"sp_droplogin '&cLoginID'")
註:gnMaster 是指向Master數據庫的。


將新增加的用戶加入到securityadmin角色中
n=SQLEXEC(gnMaster,"sp_addsrvrolemember '&cNewLoginID',securityadmin")

說明:如果你不把新增的用戶加入到securityadmin角色中,當你用新用戶登錄時,無權改變自己的口令。

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 6 樓

發表發表於: 星期二 二月 24, 2004 5:29 pm    文章主題: 引言回覆

VFP+SQL 編程(6)-記錄維護
假設你的可更新的遠程視圖是「VIEW_學生基本情況」
首先做一個表單,表單上有四個按鈕:」添加/保存「、「修改/重做」、「刪除」、「退出」如圖1所示(退出按鈕省了)


此主題相關圖片如下:

如圖1

在form的Load事件中打開你的可更新的遠程視圖

* 判斷以前是否打開過
if not used(『學生基本情況』)
use view_學生基本情況 alias 學生基本情況 in 0
endif

select 學生基本情況

* 設置成表緩衝
CURSORSETPROP("Buffering",5)


添加/保存一個記錄
"添加按鈕"的Click事件
IF THISFORM.mode=0 如果當前是查詢記錄的狀態

* thisform.mode 是一個自定義屬性,用來判斷當前的狀態是0-查詢、1-添加、2-修改記錄的狀態用

THISFORM.mode=1 && 表示進入添加記錄的狀態
THISFORM.Recno = RECNO() && 保存當前記錄號到自定義屬性thisform.recno

APPEND BLANK

* 更改按鈕的圖片,「添加按鈕」的圖片由添加變成「保存」,修改按鈕的圖片變成「重做」,如圖2所示

此主題相關圖片如下:

圖2
THISFORM.cmdNew.PICTURE=gcPicsPath+"wzsave.bmp"
THISFORM.cmdEdit.PICTURE=gcPicsPath+"wzundo.bmp"

ELSE && 保存記錄

SELECT 學生基本情況
TABLEUPDATE(1,.T.) && 保存
THISFORM.mode=0 && 改回查詢狀態
* 更改按鈕圖片
THISFORM.cmdNew.PICTURE=gcPicsPath + 'wznew.bmp'
THISFORM.cmdEdit.PICTURE=gcPicsPath + 'wzedit.bmp'

ENDIF
* 刷新表單
THISFORM.REFRESH


說明:
gcPicsPath 是按鈕圖片存放路徑

thisform.mode 是一個自定義屬性,用來判斷當前的狀態是0-查詢、1-添加、2-修改記錄的狀態用




"修改/重做"按鈕的Click事件

SELECT 學生基本情況

* 修改記錄
IF THISFORM.mode=0 && 如果是查詢狀態

* 如果無記錄,不能修改
IF RECCOUNT("學生基本情況")=0
return
ENDIF
THISFORM.mode=2 && 表示進入修改狀態

* 更換相關的按鈕圖標
THISFORM.cmdNew.PICTURE=gcPicsPath+"wzsave.bmp"
THISFORM.cmdEdit.PICTURE=gcPicsPath+"wzundo.bmp"


ELSE && 恢復記錄

SELECT 學生基本情況

IF THISFORM.mode=2 && 修改狀態
IF MESSAGEBOX('確定要放棄修改嗎?',4+32+256,'放棄確認')=6
TABLEREVERT(.T.)
ENDIF
ELSE && 如果是添加記錄時放棄添加記錄
TABLEREVERT(.T.) && 取消所做的修改
ENDIF

* 恢復相關按鈕圖標
THISFORM.cmdNew.PICTURE=gcPicsPath+'wznew.bmp'
THISFORM.cmdEdit.PICTURE=gcPicsPath+'wzedit.bmp'


IF THISFORM.mode=1 &&如果是添加狀態
* 恢復環境
IF THISFORM.RecNo>0 AND RECCOUNT()>=THISFORM.RecNo
GOTO THISFORM.Recno
ENDIF
ENDIF
THISFORM.mode=0 && 表示已回到查詢狀態
ENDIF
THISFORM.REFRESH



這裡說明為什麼要用表單自定義屬性thisform.mode呢?

如果你在表單的每個數據編輯控件如TextBOX,EditBox等的Refresh()中輸入下列代碼:
IF thisform.mode = 0
this.ReadOnly = .T.
this.DisabledBackColor = gnBackColor
ELSE
this.ReadOnly = .F.
this.BackColor =16777215
ENDIF

那麼,這些控件在查詢狀態就是只讀的,不能修改數據,即this.ReadOnly = .T.而在添加或修改狀態時,它們會自動變為可編輯數據狀態,即this.ReadOnly = .F.

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 7 樓

發表發表於: 星期二 二月 24, 2004 5:32 pm    文章主題: 引言回覆

VFP+SQL 編程(6)-主程序編程
這是給初學者推薦一種格式,不一定最好,但它卻實能正常運行


* 程序名:main.prg
* 作用:整個系統的入口
* 路徑:\你的程序目錄\prgs
代碼:


Set Talk off
Set Escap off

* }始,{序錯誤處理
 ON ERROR DO Err.PRG  With Error(),  Message(),  Message(1),  Program(),  Lineno(1)
* 第一步,清理環境*****************************

Close All     && 關閉所有工作區中打}的數據庫、表和索引,並選擇工作區 1。

Clear Menus  &&  從內存中釋放所有的內存變量和數組以及所有用戶自定義菜單欄、
                   && 菜單和窗口的定義。 還從內存中刪除所有用 DECLARE-ALL 註冊
                   && 的外部 Windows 32 位動態鏈接庫 (.DLLS)。
* 關閉系統菜單

* 如果在發出 SET SYSMENU SAVE 命令之後修改了菜單系統,可以通過發出
* SET  SYSMENU TO DEFAULT 命令來恢復前面的]置。
Set Sysmenu Save

* 在{序執行期間廢止 Visual FoxPro 主菜單欄。
Set Sysmenu Off

Set Sysmenu To
 

* 第二步,]置環境

* 退出Read時保存數據緩衝區內容
Set Autosave On 

* 使用 INSERT、APPEND 和 BROWSE 命令創建新記錄時,不將當前記錄數據複製到新記錄中。
Set Carry Off

* 指定是否可以用在文本框中鍵入最後一個字符的方法退出文本框。
Set Confirm Off

*  日期不顯示世紀部分
Set Century Off 

* ]置日期格式為"YY.MM.DD" 格式
Set Date Ansi

* 不顯示已經刪除的記錄
Set Delete On

* 決定能否使用 LOCK ( )或 RLOCK ( ) 鎖定多個記錄。
Set Multilocks On && 網絡編{專用

* 確定 ATLTER TABLE、CREATE TABLE 和 INSERT - SQL 命令如何處理 null 值。
Set Null On         
                 
* 指定當字段是空值(NUll)顯示的文本為
Set NullDisplay To ''

* 改寫已有文件之前不顯示對話框
Set Safety Off

* 移去圖形狀態欄。
Set Status Bar Off


* 第三步,]置你的{序路徑

* ]置{序主目錄
Public gcMainPath
gcMainPath = Sys(5)+Sys(2003)+"\"
Set Default To &gcMainPath

* 數據目錄(本地數據庫和表)
Public gcDataPath
gcDataPath =gcMainPath+"Data\"

* {序目錄
Public gcPrgsPath
gcPrgsPath =gcMainPath+"Prgs\"


* 圖片目錄
Public gcPicsPath
gcPicsPath=gcMainPath + "pics\"

* 表單目錄
Public gcFormsPath
gcFormsPath = gcMainPath+"forms\"

* 菜單目錄
Public gcMenusPath
gcMenusPath = gcMainPath+"menus\"

* 標籤目錄
Public gcLabelsPath
gcLabelsPath = gcMainPath+"labels\

* 報表目錄
Public gcReportsPath
gcReportsPath =gcMainPath+"Reports\"


* 第四步 初始化鍵盤
Capslock(.F.)

IMEStatus(0)

Insmode(.T.)

Numlock(.T.)


* 第五步 打}自定義類庫、過{文件
Set Classlib To gcMainPath+"vcx\MyVCX.vcx"

Set Procedure To gcPrgsPath +"Myproc.prg"

* ]置不顯示ODBC登錄對話框
SQLSETPROP(0,"DispLogin",3)  && 網絡專用

* 第六步 聲明其他全局變量
* 數據源名稱
Public gcDSN
gcDSN  = 『』

* 用戶登錄名
Public gcUID
gcUID = 『』

* 用戶登錄口令
Public gcPWD
gcPWD=『』

* 當前登錄用戶姓名(中文)
PUBLIC gcName
gcName=''

* 前後端數據庫名
Public gcSQLDatabase,gcFoxDatabase
gcSQLDatabase = 『資料管理』 && 後端 SQL 數據庫
gcFoxDatabase = 『資料管理』 && 前端 VFP數據庫

* 連接句柄
Public gnHandleMaster &&與後端 master 系統數據庫的連接句柄
gnHandleMaster = 0   

Public gnHandleUser && 與後端用戶數據庫「gcSQLDatabase 」的連接句柄
gnHandleUser = 0


* 第七步,檢查登錄帳號

* 調用登錄表單"login.scx"
Do Form gcFormsPath+"login.scx" To gnHandleUser 

結果如下圖所示


* 如果登錄成功 gnHandleUser > 0 表示登錄成功,反之,失敗

If  gnHandleUser <= 0 && 登錄失敗
    Quit && 退出
Endif

* 指定當試圖退出VFP時要執行的{序
ON SHUTDOWN DO gcPrgsPath +"FileExit.prg" && 代碼如下樓所示。


* 第八步,調用{序主菜單
Do gcMenusPath+"mainmenu.mpr"

* 第九步,顯示{序封面,桌面
Do Form gcFormsPath+"title.scx" && 封面

Do Form gcFormsPath+"Desktop.scx" && 桌面,]就是你的{序背景(圖片略)



* 第十步 打}或創建本地數據庫
cFoxDb=gcDataPath+ gcFoxDatabase + ".dbc"

If Not Files(cFoxDb) && 如果指定的數據庫不存在

    Create Database &cFoxDb && 創建它

Endif


* 啟動事件處理
Read Events

* 將釋放當前的 ON SHUTDOWN 命令
ON SHUTDOWN

----------- 全------------------------------------
該程序還將不斷完善。


* 程序:FileExit
* 作用:解決程序運行後,點擊主窗口關閉按鈕[X]不能退出VFP的問題

代碼:
If Messagebox('您真要退出本系統嗎?',4+32+256,'退出確{')<>6 AND gnHandleUser > 0
 Return
Endif

*Do While Txnlevel()>0
* Rollback
*Enddo
Clear Events
ON SHUTDOWN

* 恢復環境
Set Sysmenu To Default


With _Screen
 .WindowState=2 &&最大化
 .BackColor=Rgb(255,255,255)
 .Caption="Microsoft Visual FoxPro"
 .Icon =''
Endwith


* 關閉數據庫及表
If Used("cfg")
 Use In cfg
Endif

If Used("dsn")
 Use In dsn
Endif

If Used("uid")
 Use In uid
Endif


Close Database All    &&關閉所有數據庫
Close All      &&關閉各種類型的文件,但不關閉命令窗口、調試窗口、幫助、跟蹤窗口。
Clear Menus     &&釋放內存中所有的菜單定義。
Clear Popups     &&釋放內存中所有用DEFINE POPUP命令創建的菜單定義。
Clear Windows    &&釋放內存中所有用戶自定義窗口的定義,並從VFP主窗口或活動的用戶自定義窗口中清除窗口。
Clear      &&清屏
Set Safe On
_Screen.Picture=""


=SQLDISCONNECT(0)

Quit




* 程序:錯誤處理,由梅子提供,未驗證。
代碼:
*****************
err.prg
*****************
PARAMETER NERROR , CMESSAGE , CMESSAGE1 , CPROGRAM , NLINENO
 SET TEXTMERGE DELIMITERS  to
 SET TEXTMERGE ON
 SET TEXTMERGE TO ErrorLog.txt ADDITIVE NOSHOW
 \---------------------------------------------------------------------
 \<<DATE( )>> <<TIME( )>> 錯誤記錄
 \{序標題: <<_Screen.Caption>>
 \{序}發版本: <<VERSION(1)>>
 DO CASE
 CASE _SCREEN.WINDOWSTATE = 0
    \窗口狀態: 普通
 CASE _SCREEN.WINDOWSTATE = 1
    \窗口狀態: 最小化
 CASE _SCREEN.WINDOWSTATE = 2
    \窗口狀態: 最大化
 ENDCASE
 \窗口可視: <<IIF(_Screen.Visible= .T.  , "可見" , "不可見")>>
 \窗口集合數: <<_Screen.FormCount>>
 \網絡機器信息: <<SYS(0)>>
  \執行{序: <<JUSTFNAME(SYS(16,1))>>
 \執行{序所在目錄: <<JUSTPATH(SYS(16,1))>>
 \執行{序所在目錄磁盤空間: <<DISKSPACE(JUSTDRIVE(SYS(16,1)))>>
  \默{目錄: <<SYS(5)>><<SYS(2003)>>
 \默{目錄磁盤空間: <<DISKSPACE(SYS(5))>>
 \文件搜尋路徑: <<SET("PATH")>>
  \系統{時目錄: <<SYS(2023)>>
 \虛擬內存池大小: <<SYS(1001)>>
  \正在使用的工作區: <<Alias()>>
 \活動字段: <<VARREAD()>>
  IF TYPE('_Screen.ActiveForm.Name') = 'C'
    \活動表單: <<_Screen.ActiveForm.Name>>
    \表單標題: <<_Screen.ActiveForm.Caption>>
    \表單基類: <<_Screen.ActiveForm.BaseClass>>
    \表單派生: <<_Screen.ActiveForm.Class>>
    \表單派生庫: <<_Screen.ActiveForm.ClassLibrary>>
    \表單位置: <<SYS(1271, _Screen.ActiveForm)>>
 ELSE
    \無活動表單   
 ENDIF
 IF TYPE('_Screen.ActiveForm.ActiveControl') = 'O'
    \活動控制: <<_Screen.ActiveForm.ActiveControl.Name>>
    IF TYPE('_Screen.ActiveForm.ActiveControl.Caption') = 'C'
       \控制標題: <<_Screen.ActiveForm.ActiveControl.Caption>>
    ENDIF
    \控件基類: <<_Screen.ActiveForm.ActiveControl.BaseClass>>
    \控件派生: <<_Screen.ActiveForm.ActiveControl.Class>>
    \控件派生庫: <<_Screen.ActiveForm.ActiveControl.ClassLibrary>>
    \控件位置: <<SYS(1271, _Screen.ActiveForm.ActiveControl)>>
 ELSE
    \無活動控制   
 ENDIF
  \錯誤代號: <<nError>>
 \錯誤信息: <<cMessage>>
 \產生錯誤的位置: <<cProgram>>
 \所在行號: <<nLineno>>
 \產生錯誤的代碼: <<cMessage1>>
  \輸出內存使用情況 -> MemoryLog.txt
 \輸出工作環境到 -> StatusLog.txt
 SET SAFETY OFF
 DISPLAY MEMORY TO File MemoryLog.txt NOCONSOLE
 DISPLAY STATUS TO File StatusLog.txt NOCONSOLE
  \---------------------------------------------------------------------
 SET TEXTMERGE TO
 Nvalue =  ;
      MESSAGEBOX('{序發生錯誤!詳細信息如下:' + CHR(13) + CHR(13) + '錯誤代號: ' +  ;
LTRIM(STR(NERROR)) +  ;
CHR(13) +  ;
'錯誤行號: ' +  ;
LTRIM(STR(NLINENO)) +  ;
CHR(13) +  ;
'錯誤信息: ' +  ;
CMESSAGE +  ;
CHR(13) +  ;
'錯誤代碼: ' +  ;
CMESSAGE1 +  ;
CHR(13) +  ;
'錯誤位置: ' +  ;
CPROGRAM +  ;
CHR(13) +  ;
CHR(13) +  ;
'該錯誤已經記錄到文件:Errorlog.txt,Memorylog.txt,Statuslog.txt。',50,'信息')
 DO CASE
 CASE Nvalue = 3
    QUIT
 CASE Nvalue = 4
    RETRY 
 CASE Nvalue = 5
    RETURN
 ENDCASE

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
童心未泯



註冊時間: 2003-10-04
文章: 3


第 8 樓

發表發表於: 星期五 十二月 10, 2004 11:56 pm    文章主題: 引言回覆

今天无意中用google搜索,发现此文在该处转贴。
_________________
http://www.vfp80.com
http://www.vfp80.net
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
bin1x



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


第 9 樓

發表發表於: 星期六 十二月 11, 2004 8:26 pm    文章主題: 引言回覆

哇塞,好驚人的供獻
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
rv2231



註冊時間: 2003-12-15
文章: 1


第 10 樓

發表發表於: 星期二 十二月 14, 2004 3:05 pm    文章主題: 引言回覆

源碼缺 myvcx.vcx
可否說明此類別程式之相關內容
回頂端
檢視會員個人資料 發送私人訊息
ERIC



註冊時間: 2006-11-27
文章: 45


第 11 樓

發表發表於: 星期五 三月 09, 2007 9:36 pm    文章主題: 引言回覆

要寫成

代碼:
* 調用登錄表單"login.scx"
Do Form gcFormsPath+"login.scx" To gnHandleUser 

結果如下圖所示


* 如果登錄成功 gnHandleUser > 0 表示登錄成功,反之,失敗

If  gnHandleUser <= 0 && 登錄失敗
    Quit && 退出
Endif


不能寫成
代碼:
* 調用登錄表單"login.scx"

Do Form gcFormsPath+"login.scx" To gnHandleUser 

結果如下圖所示


* 如果登錄成功 gnHandleUser > 0 表示登錄成功,反之,失敗

If  gnHandleUser > 0 && 登錄失敗
   do Login.scx

Endif


否則 程式 會跳不出

_________________
學無止境!互相勉勵吧∼

有需要學習VFP的新手.可以找我!!
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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