分享

VFP9的10件酷事--David Stevenson著

 Alkaid2015 2013-11-25
VFP9的10件酷事
 
David Stevenson著
RMH譯

我寫這篇文章的時候,是在VFP測試版發佈前的幾個星期,VFP文檔有些地方跟不上VFP軟件的更新,這就意味著你拿到的測試版拷貝會和文檔有些出入,所以很自然,嘗試測試版軟件總要帶點探險精神的,呵呵。
正式的官方文檔還在繼續完善,不過其中「What's New」的一部分現在已經展現在我面前了。花了4頁紙用以赤裸裸地展示了 數據增強 部分,IDE增強 用了2頁,語言增強 用了10頁 等等…… 實際上提供給官方內部測試者的 版本聲明 和 開發文檔 有1英吋多厚,就這還不包括新的報表設計部分!

報表設計器煥然一新

與報表編輯器的大幅度改動相比,其它所有的改進和新功能都變得黯然失色。儘管保持了向後兼容,VFP 開發組還是從底層完全重寫了 VFP 的報表編輯器,給了它一個新的引擎,該引擎能夠讓你從外部用自己的代碼來與它提供的 GDI+ 表現界面進行交互,並為你自己的代碼提供了鉤子(hook)。
按照VFP慣例,幾個以下劃線開頭的系統變量將粉墨登場(_ReportBuilder, _ReportOutput, 和 _ReportPreview),這些都是外掛的報表模塊,你可以用自己的模塊來代替他們。你還可以使用一個名叫「ReportListener」的基類,可以直接使用它,可以在預覽/打印行為中使用它,或者把它提供給其它的用戶反饋表單。你甚至可以把幾個「ReportListener」連在一起,控制多個輸出和反饋。
FOXTALK雜誌將會在接下來的幾個月講述VFP9報表系統改良的優越性,期間你會碰到一些新概念,比如ReportListener,一開始完全掌握它們會有點難度,你得呆在這兒連續閱讀,最好跟著試驗下。一旦這些概念注入你的大腦,我想你會吃驚、感歎的。

讓我們來看看這十件酷事

老實說要在這個文檔中挑選10個新特徵來舉例真不容易,因為這裡有上百個新特性供選,我眼花花,比如,也許我該選這個?:如何在BROWSE窗口顯示MEMO提示(移動鼠標到MEMO字段上面顯示4095個字符);如何禁止打開表對話框並返回一個錯誤(SET TABLEPROMPT OFF);如何用 SET REFRESH 指定更快的刷新率;如何在 命令按鈕/選項按鈕/檢查框 中隱藏CAPTION後還能使用熱鍵/圖像(通過設置一個新的屬性PicturePosition=14-No Text)。嗯……或者我應該介紹這個?:為CURSOR對像提供的新屬性 OrderDirection ,在數據環境中將它設為 升序 或 降序;工具欄縱橫向改變時動態調整分隔對像;用 Listbox.AutoHideScrollBar 屬性來隱藏滾動條。
我苦思冥想,因為我要從這個萬眾矚目的VFP9.0中選出10個典型的特性來闡述。


註:因為這篇文章基於VFP9的一個早期測試版,所以有的特徵可能和現在有點出入。

1、文本框自動完成

你是否曾夢想過給文本框添加一種看起來更流行的「輸入常用的單詞或短語就出現一個下拉列表」的外觀?通過使用 VFP 智能感知的核心引擎,VFP 開發組給了我們這樣一種很酷的新功能,並且不但令人驚訝的易於使用,而且完全可以擴充。

讓我們來嘗試一下,將一個文本框拖放到表單上(或者打開一個有文本框的任何一個表單),將文本框新的 AutoComplete 屬性設置為一個非零值,這樣就搞定了!運行幾次這個表單,在文本框裡輸入一些內容,然後就看魔術表演吧!你也可以用下面這樣的代碼來讓表格中的文本框支持 AutoComplete:

THISFORM.Grid1.Column1.Text1.AutoComplete = 1

AutoComplete 屬性控制著自動完成的行為表現,可用的值如下:

※ 0 —— 不使用自動完成;
※ 1 —— 按字母順序;
※ 2 —— 最常用的;
※ 3 —— 最近使用的;
※ 4 —— 用戶自定義的加權排序(Weighted Order);

這些選項中的最後一個需要特別注意一下。當 AutoComplete 的值在 1-3 之間的時候,自動完成的功能是系統自維護的,而用戶自定義加權排序的值4則讓你可以通過給 AutoComp.DBF 表中的 Weight 字段賦以一個數值型值來指定各個數據項的顯示順序(最大的 Weight值顯示在下拉列表的頂部)。

默認的 AutoComp.DBF 表位於 HOME(7) 目錄下(譯者註:使用參數7,該函數返回用戶應用程序的數據目錄。),但你可以通過在全局的層次上設置 _SCREEN.AutoCompTable、或者在單個文本框的層次上設置 Text1.AutoCompTable來覆蓋默認的設置。不管你在哪個屬性中指定一個表,如果這個表不存在,則系統會自動為你新建一個。你可以同時擁有多個AutoComp表,而每個表也可以服務於一個或多個文本框,VFP會管理這些在一個隱藏的數據工作期內的表的打開和關閉。

在 AutoComp 表中,除非你給文本框設置了 AutoCompSource 屬性,否則這個文本框的 Name 將作為決定顯示哪些數據項的查詢關鍵字,反之,則使用 AutoCompSource 屬性指定的值。要想讓多個文本框共享自動完成提供的值的話,只要簡單的把這些文本框的 AutoCompSouce 屬性設置為相同的值就可以裡,例如設置為 NameAutoComp或者Cities。

通過在運行時將 AutoCompSource 動態的設置為一個代表某個用戶的特定代碼的字符串、或者在屬性表中設置如下的代碼,你甚至可以為你所在組織中的每個人啟用獨特的自動完成列表:

= "Custs_" + LoginName

不過,如果採用了這種辦法,你需要注意的是在 AutoComp 表中作為搜索關鍵字的 Source 字段只有 20個字符大小。當然,你可以自己建一個有著更大長度的 Source 字段的表作為 AutoComp 表,可是如果在為一個特定的文本框初次使用AutoComplete功能的時候你讓 VFP 自動為你建立這個表,那麼這個表中的 Source 字段的長度默認就是 20個字符。

要在測試的時候看看 AutoComp 表中發生了什麼事情,你可以從 VFP 的另一個數據工作期內共享打開這個表來瀏覽它的內容,或者也可以在命令窗口中執行如下代碼:

USE HOME(7) + "autocomp.dbf" SHARED IN 0
SELECT autocomp
BROWSE

2、使用新的報表引擎來建立 HTML 或者 XML

由於新設計的報表編輯器引擎使用了一個 GDI+ 輸出接口而不是舊的 GDI 技術,並且由於該引擎的那些表現部分的徹底改變,當使用新樣式的報表輸出的時候,你會發現在那些報表數據項的位置上的細微區別。你還將發現在輸出質量的增強。但這一切首先有個前提,你必須執行一個命令來啟用新樣式輸出,因為 VFP 開發組為了向後兼容的目的默認使用的是老樣式的輸出。

這意味著你不需要對已有的報表做任何改動就可以在 VFP 9.0 中照樣使用它們,或者你也可以通過這行下面的命令來切換到使用新樣式的輸出:

SET REPORTBEHAVIOR 90

用下面的命令可以切換回使用舊的樣式:

SET REPROTBEHAVIOR 80

此外,當你在 REPORT 命令中使用了象 OBJECT TYPE 4 或者 OBJECT ox 這樣的需要新行為特性的任何一個命令行選項參數的時候,系統會動態切換到使用新樣式的報表。這裡是一個示例,你可以試一下它來把你的報表內容輸出到一個 HTML 文件:

REPORT FROM (HOME(1)+ "tools\filespec\90frx.frx") ;
OBJECT TYPE 5

當這個命令運行的時候,VFP 將切換為使用 90 樣式的報表引擎,並使用由 ReportOutput.app 提供的 HTMLListener 類來將你的報表輸出為一個位於你的個人 Temp 目錄中的 HTML 文件,並提示你文件名。單擊 Yes 將文件名保存在 _CLIPTEXT 系統變量中,然後打開瀏覽器,按下 CTRL + V 將這個文件名粘貼到 URL 文本框中取,按下回車就會看到 9.0 版 FRX 表定義的上佳 HTML 表現。

你可以通過首先要求 VFP 將一個對 HTMLListener 的對象引用放入到一個你已經初始化的變量中去來獲得對 HTMLListener 的更多控制權。然後就可以設置它的各種屬性了,如下所示:

LOCAL olistener

** 取得一個對 HTMLListener 類的引用
DO (_reportoutput) WITH 5, olistener

** 在執行下面的命令後會關閉用戶界面的返回和提示
olistener.quietmode = .T.

** 指定自己的文件名和目錄
olistener.targetfilename = "c:\htmltest.htm"

** 運行一個將會引用我們已經設置好了的 listener 的報表
REPORT FROM (_samples + "solution\reports\ledger.frx") ;
OBJECT olistener

** 在瀏覽器中顯示結果
RUN /n Explorer.exe c:\htmltest.htm

你可以用類似的途徑來使用 XMLListener 以建立一個帶有所有數據的 XML 文件。

注意:由於 _reportoutput 也許並非總是指向默認的 ReportOutput.app,所以,更安全的辦法是從FFC基礎類庫中新的 _reportlistener.vcx 類庫來建立 XMLListener 或者 HTMLListener 的實例,入下面的示例所示:

** 在我手裡的 Beta 版需要 Set safety off
SET SAFETY OFF
LOCAL olistener

** 獲得對 FFC 基礎類庫中的 _Reportlistener.vcx
** 類庫中的 XMLListener 類的一個引用
olistener = NEWOBJECT("XMLListener", ;
HOME(0) + "ffc\_reportlistener.vcx")

** 在執行下面的命令後會關閉用戶界面的返回和提示
olistener.quietmode = .T.

** 只包含數據,不帶佈局信息
olistener.xmlmode = 0 && 只包含數據

** 指定自己的文件名和路徑
olistener.targetfilename = "c:\xmltest.xml"

** 運行一個將會引用我們已經設置好了的 listener 的報表

REPORT FROM (_samples + "solution\reports\ledger.frx") ;
OBJECT olistener

** 在瀏覽器中顯示結果
RUN /n Explorer.exe c:\xmltest.xml

當 XML 數據彈出在瀏覽器中的時候,注意它的 <Data>段,其中包含著許多表示報表中原有的帶區的標誌,例如<PH>表示頁標頭,<D>表示細節帶區,而<PF>則表示頁註腳。這些東西會很有用的,例如可以將你自己的 XSLT 樣式表應用給這個 XML 文件,以通過高度自定義的佈局來展示數據。

此外,你還可以通過在前面的代碼中改變這一行來獲得與報表佈局一樣的 XML 表現:

olistener.xmlmode = 1 && 只用報表佈局

報表佈局的信息在一個名為 <VFP-RDL> 的 XML 段中,也許你已經猜到了這個名字所代表的意思:「Visual FoxPro 報表定義語言」。這一段的 XML 包含大量的 <VFPFRXLayoutObject>標記,它描述了定義在報表的 FRX 中的所有顯示元素,並可以通過如下設置來選擇包含關於數據來源的信息:

olistener.IncludeDataSourceInVFPRDL = .T.

下面這行代碼可以一次就返回同時包含了 <VFP-RDL>報表佈局段和 <Data> 段的一個XML文件:

olistener.xmlmode = 2 && 報表佈局和數據

還要等一段時間才會知道微軟是否會提供某種能夠將 VFP-RDL 定義轉換為SQL Server新的報表服務使用的RDL格式的轉換工具。不過,即使沒有,VFP 9.0 也已經給了你足夠讓你自己實現它的資料和工具!

這兩個演示 VFP 報表新的輸出能力的示例只是冰山的一角。我希望你明白,你完全可以使用自己的 ReportListener 子類來超越 VFP 自帶的 listener 類的能力,並通過在報表引擎中使用鉤子(hook)來驅動你自己的輸出、預覽以及用戶返回的行為特性。是的,它仍然可以運行你已有的報表。驚訝吧?但這是真的。

3、組合多個 ReportListener 以提供多種輸出

從前面的例子上再走遠一點,讓我們來看看你可以怎樣通過組合多個 ReportListener 來實現在同一個運行中的報表上提供多種輸出方案。在默認的 ReportOutput.app(以及在新的 _reportListerer.vcx FFC 基礎類庫中)提供的 ReportListener 的子類有一個屬性叫 Successor,可以用這個屬性記錄下對另一個個 ReportListener 實例的引用,而個被引用的實例將被掛鉤到報表生成引擎上,因而是起著主導作用的「主控 Listener」。

在下面的示例中,我通過執行 DO (_reportoutput) 兩次來建立兩個 listener,每次執行的時候都傳遞給它一個變量,以返回一個對帶有正確的輸出類型的Listener的對象引用,輸出類型是 (_reportoutput)程序決定的。在下面的代碼中,olistener 接收到一個對一個輸出類型為 0 (打印輸出)的 listener 的對象引用,而 olistener2 則接收到一個輸出類型為4的 XMLListener對象的引用。

現在,我們有一個全局的集合(_oReportOutput),該集合中擁有對緩存中的打印和XML兩個Listener的引用,而我們則將這兩個 Listener 引用為 olistener 和 olistener2。現在,為了演示從 ReportOutput.app 來取得一個 ReportListener 的引用的另一種辦法,我們像這樣給集合添加另一個將被放入緩存中的 HTMLListener 的實例:DO (_reportoutput) WITH 5

注意,現在我們可以通過集合引用的辦法來操作 HTMLListener 的屬性,像這樣:

_ReportOutput("5").targetfilename = "c:\htmltest2.htm"

現在剩下的活是將這三個 Listener 象鏈條一樣的串連起來,輸出類型為0的打印Listener放在鏈條的最前面。這個 Listener 將是我們在使用 REPORT FROM 命令的時候放在 OBJECT 子句裡面去的那個,這樣一來,它就變成了一個「驅動,或者主控」listener,而它會與另外兩個與它在一條鏈條上的 listener 進行通訊。將它們鏈接起來的代碼是:

olistener.successor = olistener2
olistener2.successor = _oReportOutput("5")

就是這樣。現在,運行這個報表,從同一次運行你就會獲得三種類型的輸出——在默認打印機上的一個報表、一個只帶著數據的 XML 文件、以及一個顯示著報表的 HTML 頁面。

LOCAL olistener, olistener2

* 獲得一個對打印類的引用
DO (_reportoutput) WITH 0, olistener

* 獲得一個對 XMLListener 類的引用
DO (_reportoutput) WITH 4, olistener2

* 關閉用戶界面的返回和提示
olistener2.quietmode=.T.

* 只包含數據,不帶佈局信息
olistener2.xmlmode=0

* 指定文件名和路徑,並關閉文件名提示
olistener2.targetfilename = "c:\xmltest2.xml"
olistener2.quietmode=.T.

* 現在為 HTML 輸出做準備,但使用另一種辦法來從全局的
* _oreportoutput 集合中獲得一個對listener 的引用
DO (_reportoutput) WITH 5

* 通過集合引用來設置 HTMLListener 的屬性
_oReportOutput("5").targetfilename = "c:\htmltest2.htm"
_oReportOutput("5").quietmode=.T.

* 把三個 listeners 象鏈條一樣的鏈接在一起
* 其中,用打印 listener 作為驅動
olistener.successor = olistener2
olistener2.successor = _oReportOutput("5")

* 運行一個僱員電話號碼列表,引用在列表中的第一個 listener
REPORT FORM (_samples+"solution\reports\ledger.frx") ;
OBJECT olistener

* 在瀏覽器中顯示 XML 和 HTML 結果
* 並在打印機上打印報表
RUN /n Explorer.exe c:\xmltest2.xml
RUN /n Explorer.exe c:\htmltest2.htm

4、將報表保存為圖形文件

ReportListener 的另一種很大的用途是通過在你專門的子類中覆蓋 OutputPage 方法來將一個報表保存為圖形文件。可以保存的圖形文件格式包括 EMF、JPEG、GIF、PNG、BMP、TIFF、以及多頁的 TIFF(這種格式對於用傳真發送報表來說特別有用)。

注意,在這個示例的代碼中,我將 ListenerType 屬性設置為了2,這意味著讓你自己來控制輸出,每次用參數 nDeviceType = -1 調用 OutputPage 方法就打印一頁,但並不將輸出發送到一個打印設備。MyReportListener 有一個自定義的 OutputPage 方法,它先檢查 nDeviceType 的參數是否為 -1,然後再次調用 OutputPage 方法(給方法傳遞一個文件名和圖形文件類型),再執行一個 NODEFAULT。這個示例在生成第一頁的時候建立一個 TIFF 文件,然後將其它的頁添加到同一個圖形文件中去。

LOCAL olistener

* 建立一個 ReportListener 的實例
olistener = CREATEOBJECT("MyTiffListener")
olistener.tifffilename = "c:\tifftest.tif"

* 運行一個將會引用我們設置好了的 Listener的 報表
REPORT FORM (_samples+"solution\reports\invoice.frx") ;
OBJECT olistener RANGE 1,2

* 在瀏覽器中顯示結果
RUN /n Explorer.exe c:\tifftest.tif

DEFINE CLASS MyTiffListener AS ReportListener
tifffilename = []
listenertype = 2 && 一次一頁,不輸出

FUNCTION OutputPage(nPageNo, eDevice, nDeviceType)
* 由於 ListenerType 指定了 "不打印輸出"
* 在報表引擎調用這個方法的時候,nDeviceType 將會是 -1
* 而我們現在則捕捉這個條件,然後自己來調用
* OutputPage 方法,調用時帶上文件名和圖形類型參數
IF nDeviceType = -1 ;
AND NOT EMPTY(THIS.tifffilename)
IF nPageNo = 1
* 如果是第一頁,則建立TIFF文件
THIS.OutputPage(nPageNo, THIS.tifffilename, 101)
ELSE
* 否則,則向 TIFF 文件添加剩下的頁
* (這段代碼要運行,首先 TIFF 文件必須已經存在)
THIS.OutputPage(nPageNo, THIS.tifffilename, 201)
ENDIF
* 我們已經用需要的設置調用過 OutputPage 方法了
NODEFAULT
ENDIF
ENDDEFINE


5、使用新的超小型二進制索引

VFP9引進了一個新的索引類型---二進制索引,它可以在任何邏輯表達式中被使用。據一些測試者講,這種新型索引的訪問速度和一般索引差不多,但是它的大小比一般索引要小90%,插入記錄時要快80%。
要建二進制索引標誌,你要在表設計器中設置索引類型為二進制,或者在Index命令中加入關鍵字BINARY:

INDEX ON MyNonNullableLogicalExpression ;
TAG MyBinary BINARY
INDEX ON DELETED() TAG DELETED BINARY

要注意的是,你建二進制索引或索引TAG的時候,不要 包含FOR子句 或 INDEX ON一個會得出NULL值的表達式。你也不能在SEEK或SET ORDER TO語句中使用二進制索引。不過你可以在優化的FILTER條件和SQL SELECT的WHERE子句中使用並得到好處。
為了配合新的二進制索引,VFP9.0在SET DELETED ON環境中優化了DELETED()。因為二進制索引已經是「位」級了,VFP可以在內存中更快地建立Rushmore,並且使用更少的局域網數據流量,從而大大提高了查詢的性能。現在你可以拿幾個變量和別人討論下在索引中使用DELETED()究竟會降低還是提高性能了。

6、用新的ICASE()函數一行搞定

當一個判斷點出現在你的程序中(特別是SQL SELECT命令),你以前只能用一連串的IIF()來解決。
新的ICASE()函數可以讓你建立更可靠更優雅的代碼,它允許你使用包括OTHERWISE在內的100個條件。比如,在你的SQL SELECT查詢中要用到一個字符串,這個字符串是根據銷售員的業績得出的一系列結果,代碼如下:

CREATE TABLE lineitems (custcode I, purchases N)
FOR i = 1 TO 10
INSERT INTO lineitems VALUES (i,800*(i-2))
ENDFOR
SELECT li.custcode, li.purchases, ;
PADR( ;
ICASE( li.purchases <= 0, "Drag on Profits", ;
li.purchases < 500, "Bread and Butter", ;
li.purchases < 2000, "Send Gift Box", ;
li.purchases < 5000, "Take to Ballgame", ;
"Trip to Hawaii" ;
), 20) AS CustStatus ;
FROM lineitems li

我指定了4個條件組,最後的那個"Trip to Hawaii"是OTHERWISE段。而且我把返回值用空格填充到固定的20個字符,因為在SQL SELECT中有時需要這麼做。另外,不管你有偶數個參數還是奇數個參數,每個CASE段的最後一個參數就是OTHERWISE的值。

7、停靠你的表單

你現在可以用新的表單Dockable屬性把停靠行為加入到你的程序中。默認的Dockable值是0,跟以前版本的行為一致。然而,如果你把Dockable設為1或2,表單的標題欄高度就會變成原來的一半,這時表單就支持停靠了(設為1表示表單已停靠)。
表單支持停靠(Dockable設為1或2)後,你可以用WINDOWS菜單的Dockable項或在表單的標題欄點擊鼠標右鍵來切換這2種設置。當Dockable=1時,你可以將表單拖放到可停靠的位置,你也可以用以下代碼實現停靠:

* 1=top, 2=left, 3=right, 4=bottom
THISFORM.Dock(nPosition)
* tab-dock to another form
THISFORM.Dock(4, oFormTarget)
* tab-dock to a window
DOCK NAME oFormRef POSITION 4 WINDOW WindowName

一個已停靠的表單也可以通過WINDOWS菜單的Dockable項或在表單的標題欄點擊鼠標右鍵來終止停靠,或用以下的代碼:

* set form to "supports docking, but not docked"
THISFORM.Dockable = 2
* or call the form's dock method
THISFORM.Dock(-1)

你可以運行下面的代碼看看停靠的過程。這些代碼建了3個表單,並設定了TOP/LEFT,然後把它們停靠到COMMAND窗口上。你可以用上面的Dock/Undock按鈕來實現表單的停靠/不停靠,點擊3個中任一一個表單的X按鈕會關閉演示。
選中一個表單後,你可以用菜單來切換它的Dockable屬性,當表單處於可停靠狀態時,你可以把它拖放到屏幕上的任一個可停靠的位置。圖2顯示了3個可互相切換的已停靠表單。

LOCAL oform1 as Myform
oform1=CREATEOBJECT("Myform")
oform1.Caption="Customers"
oform1.lblName.Caption = "Customers"
oform1.top = 100
oform1.left = 0
LOCAL oform2 as Myform
oform2=CREATEOBJECT("Myform")
oform2.Caption="Employees"
oform2.lblName.Caption = "Employees"
oform2.top = 100
oform2.left = 325
LOCAL oform3 as Myform
oform3=CREATEOBJECT("Myform")
oform3.Caption="Invoices"
oform3.lblName.Caption = "Invoices"
oform3.top = 275
oform3.left = 0
DOCK NAME oform1 POSITION 4 WINDOW Command
DOCK NAME oform2 POSITION 4 WINDOW Command
DOCK NAME oform3 POSITION 4 WINDOW Command
oform1.show()
oform2.show()
oform3.Show()
READ EVENTS
DEFINE CLASS MyForm AS Form
Dockable = 1 && supports docking and is dockable
Height = 150
Width = 300
ADD OBJECT lblName AS MyLabel
ADD OBJECT btnUndock AS MyUndockButton
FUNCTION Destroy()
CLEAR EVENTS
ENDDEFINE

DEFINE CLASS MyUndockButton AS CommandButton
Height = 25
Width = 100
Left = 180
Top = 100
Anchor = 12 && fixed distance bottom/right
Caption = "Dock/Undock"
FUNCTION Click()
IF THISFORM.Docked
THISFORM.Dock(-1)
ELSE
IF THISFORM.Dockable = 1
* error if not dockable
DOCK NAME THISFORM POSITION 4 WINDOW Command
ENDIF
ENDIF
ENDDEFINE
DEFINE CLASS MyLabel AS Label
FontSize= 18
Height = 50
Width = 150
Top = 50
Left = 75
Alignment = 2
Anchor = 240 && relative on all sides
Caption = []
FontSize = 14
FontBold = .T.
FontName = "Verdana"
ENDDEFINE

8、使用新的數據瀏覽面板

VFP9增加了一個新的而且非常有用的數據瀏覽面板(如圖3),通過這個面板,你就可以來配置一些你常用的VFP數據庫、自由表以及SQL SEVER數據庫.你可以很容易的找到這一項,點擊[TOOLS]菜單裡的[Task Pane],然後選擇[Data Explorer](也許你必須通過點擊">>"按鈕才能看到)。點擊[Add Connection]按鈕,然後指定數據源,完後就可以瀏覽了。右鍵點擊每個數據庫或表,在彈出菜單中包含一個[RUN QUERY]項,點擊這一項會出現查詢界面,這樣就可以進行數據查詢及瀏覽了。

圖表3說明:
數據瀏覽面板顯示了VFP的[Tastrade]數據庫的細節信息,同時右邊的查詢界面部分(通過右鍵點擊Northwind數據庫可以調出)則顯示了SQL SERVER數據庫Northwind的查詢結果。


9、在事務處理中可以包含自由表和cursors

現在通過使用心得MAKETRANSACTABLE()函數,你可以在一個具有完善回滾能力的事務處理中包含自有表和CURSOR,運行下列代碼,在每一個等待窗口後按回 鍵,注意事務處理在最後一步從cursor完全恢復期間的記錄插入。
如果已經調用 MAKETRANSACTABLE()對表進行事務處理,那麼使得這個表不被處理的唯一方法就是在所有的數據工作器中關閉並重新打開這個表,當在一個數據工作期中開始事務處理以後,這個表就會變得在所有的工作期中都可以進行處理,直到關閉。

CREATE CURSOR MyCursor (id i, name c(20))
WAIT WINDOW "Table is "+ ;
IIF(ISTRANS (),[],[not ])+"transactable. " +;
TRANSFORM(RECCOUNT())+" records."
MAKETRANSACTABLE()
BEGIN TRANSACTION
INSERT INTO MyCursor VALUES (1, "Fox")
WAIT WINDOW "Table is "+ ;
IIF(ISTRANS (),[],[not ])+"transactable. " +;
TRANSFORM(RECCOUNT())+" records."
ROLLBACK
WAIT WINDOW "Table is "+ ;
IIF(ISTRANS (),[],[not ])+"transactable. " +;
TRANSFORM(RECCOUNT())+" records."

10、為了能使用戶更好的對數據類型進行控制 VFP增加了CAST()函數

無論是作為單獨的函數使用還是內嵌入SQL語句中他都可以對不同的數據類型進行轉換,他很簡單,這似乎難以置信,不過在應用情況下它卻是非常的強大。

SELECT unit_price, ;
CAST(unit_price AS Integer) AS IntPrice, ;
CAST(unit_price AS N(12,6)) AS NumPrice ;
FROM (_samples+"tastrade\data\products
")

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多