簡介
由於PowerBuilder採用了面向對象和可視化技術,提供可視化的套用開發環境,使得我們利用PowerBuilder,可以方便快捷地開發出利用後台伺服器中的數據和資料庫管理系統的資料庫應用程式。 在當前,網路技術迅速發展,隨之發展的還有OLE,OCX,跨平台等技術,而在PowerBuilder的最新版中提供了對這些技術的全面支持。在資料庫開發工具領域,PowerBuilder是其中非常優秀的一個,利用它我們可以開發出功能強大的資料庫應用程式。
PowerBuilder提供了對目前流行的大多數關係資料庫管理系統的支持,由於在PowerBuilder的應用程式中對資料庫訪問的部分一般採用國際化標準資料庫查詢語言SQL,使得用PowerBuilder開發的應用程式可以不做修改或者只做少量的修改就可以在不同的後台資料庫管理系統上使用。也就是說用PowerBuilder開發的應用程式是獨立於伺服器上的資料庫。
特點
PowerBuilder提供了對目前流行的大多數關係資料庫管理系統的支持,由於在PowerBuilder的應用程式中對資料庫訪問的部分一般採用國際化標準資料庫查詢語言SQL,使得用PowerBuilder開發的應用程式可以不做修改或者只做少量的修改就可以在不同的後台資料庫管理系統上使用。也就是說用PowerBuilder開發的應用程式是獨立於伺服器上的資料庫管理系統的。
和大多數的WINDOWS應用程式一樣,PowerBuilder也是事件驅動工作方式。在這種工作方式中,程式的運行沒有固定的流程,程式中的代碼也是為各種可能發生的事件編寫的,當程式開始運行之後,它就可以接受來自系統,用戶或者其它應用程式觸發的事件,然後執行相應的事件代碼。事件驅動的工作方式與面向對象技術是緊密相關的,在PowerBuilder應用程式中,接受發生的事件的往往就是程式界面中的各種可視化對象。
PowerBuilder是一種面向對象的開發工具,各種WINDOWS應用程式中常見的視窗、選單、控制項等在PowerBuilder中都是一個個的對象。在PowerBuilder中我們還可以創建自己的用戶對象。特別要指出的是PowerBuilder提供了對面向對象方法中的各種技術的全面支持,我們可以利用面向對象方法中的對象的封裝性、繼承性、多態性等特點使得我們開發的應用程式具有極大的可重用性和可擴展性,而這一點正是軟體工程中對應用程式所提出的重要目標。
在當前,由於網路技術的發展,許多種不同的作業系統平台在INTERNET網上同時被使用,這對開發的應用程式的跨平台性提出了更高的要求,而PowerBuilder就提供了良好的跨平台性,比如在PowerBuilder中,利用WINDOWS平台開發的各種對象可以方便地套用到UNIX平台中,因為PowerBuilder支持對象的跨平台性。這樣使得把應用程式從一個平台移到另一個平台變得並不複雜。
為了給用戶提供各個方面的支持,PowerBuilder具有自己的程式語言POWERSCRIPT,這個語言除了提供基本的流程控制語句,還提供了幾百個函式來操縱各種對象和提供諸如DDE,OLE等方面的支持。此外我們還可以定義自己的函式,處理特定的事件。學習PowerBuilder時相當一部分的時間就是用來了解和熟悉PowerBuilder提供的各種函式。
PowerBuilder一個很大的特點就是提出了數據視窗對象的概念。數據視窗對象也是PowerBuilder中的一種對象類型,與其它對象不同的是數據視窗對象是專門為了訪問後台的資料庫服務的,在數據視窗對象中我們定義了數據的來源和數據的顯示風格,這樣在應用程式中我們就可以把精力完全放在程式的??為我們在數據視窗對象中已經定義好了數據的來源。如果需要使用資料庫中不同的數據也只要對數據視窗對象進行修改就可以了。特別要指出的是PowerBuilder在數據視窗對象中提供了豐富的數據顯示方式,可以滿足各種不同的需要。
在PowerBuilder較新的版本中提供了基礎類庫PFC,它為應用程式的開發提供了許多可重用的預定義類和對象,利用基本類庫PFC可以快速開發出高質量重用性好的應用程式。真正發揮面向對象編程的巨大威力。
最後要指出的是PowerBuilder有三個不同的版本,分別為DESKTOP型,PROFESSIONAL型,和ENTERPRISE型,DESKTOP型是為個人使用的桌面型應用程式,在這裡可以利用PowerBuilder內置的資料庫管理系統SYBASE SQL ANYWHERE來創建和使用本地資料庫,為個人的套用服務;PROFESSIONAL型的PowerBuilder最重要的一點就是提供了對MICROSOFT ODBC(資料庫標準連線接口)的支持,在PROFESSIONAL版本中我們就可以使用PowerBuilder的繼承,多態等絕大多數特性;在ENTERPRISE版本中最重要的一點就是提供了對開發大型的資料庫應用程式的全面的支持,提供了開發大型應用程式的許多輔助的工具,比如C++ CLASS BUILDER等。
編程技巧
數據的轉儲和調入功能的實現
一個數據處理系統的安全性部分是整個系統的關鍵部分,對於一些需要長期保存的歷史數據來說更是必不可少。對於現代的大型資料庫管理系統來說,數據的安全性獨立交給DBA來專門管理,一般的系統較少涉及數據的備份工作。為了減少計算機專業人員的負擔,一個好的MIS系統應該提供數據的轉儲和調入功能,這樣對資料庫管理系統不太了解的用戶也可以進行數據安全方面的處理。PowerBuilder中SaveAs()、ImportFile()兩函式可以實現這方面的操作,dwcontrol.SaveAs()提供了多種數據的存儲格式,如dBase的DBF格式、以TAB作為分隔設定的文本TXT格式、Excel格式、SQLInsert格式、CSV格式。dwcontrol.ImportFile()將數據從各種格式的文本檔案中調入數據視窗控制里。
簡潔美觀的數據報表的創建
一個系統里的報表應該具有一致的風格,報表至少應該具有如下幾種項目:報表的標題、報表的日期和時間、報表的頁序、報表涉及的對象和條件。PowerBuilder提供了各種類型的數據視窗,報表中主要用到如下幾種類型: Free風格,該數據視窗的數據排列,用戶可以任意調整,有最大的自由性。Grid風格,以表格的方式顯示數據,外觀比較工整,美觀明了。Graph風格,以圖形方式顯示數據,有直方格、圓餅圖、曲線圖、三維立體柱圖。Group風格的數據視窗提供了一種對數據進行分組的簡便途徑,它生成了一個具有分組屬性的Tabular風格的數據視窗對象。
Mdi窗體技術的套用
隨著Windows系統的出現,圖形互動界面得到了用戶的喜愛,已成為一種潮流,其中Mdi窗體技術更是吸引人。Mdi窗體,即是多文檔互動式窗體,亦叫無模式窗體。這種窗體包括一個Mdi主視窗及多個Mdi子視窗,子視窗只能在框架之內出現和移動,可以同時打開多個Mdi子視窗,但同一時刻只能有一個視窗處於被激活狀態,當主視窗關閉時,同時關閉所有子視窗。
SQL語句的使用
在用PowerBuilder編程時經常要使用SQL語句對資料庫進行操作,而SQL語言語句在使用中格式要求比較嚴格。此外,在使用SQL語句之前,要用Connect與資料庫相連,並且每一條SQL語句必須以“;”結尾。
Datawindow數據視窗
數據視窗的處理機制首先是根據所需的顯示方式將數據源表中的域設計好,在運行時將所要的數據從資料庫伺服器上下載到客戶機上處理,然後將更改後的數據進行提交(Commit)或回滾(Rollback)。這種處理機制大大降低了數據的傳輸量,減輕了網路的負擔,也提高了數據的處理速度。充分利用數據視窗的特點,可達到事半功倍的效果,但是如果有些問題不加注意就會出現意想不到的錯誤。 (1). AcceptText()函式
AcceptText()函式的功能是將數據視窗當前編輯的數據轉移到數據視窗的緩衝區中。程式通常在關閉視窗及其他情況下判斷是否改變了當前數據。如果已改變數據,應提示用戶保存。這就杜絕了用戶在偶然的情況下丟失更改數據的現象。一般用ModifiedCount和DeletedCount函式判斷數據是否改變。
PB在處理數據視窗時,對應開闢了四個數據緩衝區,分別為Primary Buffer、Deleted Buffer、Filter Buffer、SortBuffer,其中Deleted Buffer存放被刪除的記錄,Filter Buffer存放被過濾的記錄,Sort Buffer存放排序的記錄,Primary Buffer存放其他記錄。函式ModifiedCount從Primary and Filter Buffers中取數據進行判斷,DeletedCount則從Deleted Buffer中取數據進行判斷。
PB在接受用戶輸入時設定了一個浮動編輯框,用戶輸入或更改的內容並不直接進入Primary Buffer,而是在用戶輸入完後進入下一個域時,PB首先對它進行有效性檢測,通過後轉入Primary Buffer。如果只改變一項數據就關閉視窗則相關數據並沒有進入Primary Buffer,系統判斷ModifiedCount()為0,所以不會提示保存數據。用AcceptText()函式就可以將浮動編輯框中的數據轉入緩衝區中,在相應的程式段前加上Accepttext(),問題就解決了。
(2).messagebox()函式
messagebox()是Powerscript中用得最多的函式之一,常用於向用戶顯示出錯、警告及其它信息,並且在開發過程中常用它顯示程式狀態和重要變數的取值,它在程式運行過程中,在螢幕上顯示一個視窗,只有用戶在回響該視窗後,程式才能繼續運行下去,因此,這個函式在程式的開發調試過程中非常有用,可以用來判斷程式在哪個地方出錯。
數據的突出顯示
程式運行中,用戶希望顯示的數據具有明顯的區分,數據視窗應該能使用戶很快找到他們想要的信息,以顏色區分既滿足用戶的習慣,又不占系統資源,實現起來也很簡單。以學生管理為例,要求成績低於60分的以紅色顯示,其他不變。方法是:在數據視窗中對應成績的列(例如‘/cj’)上雙擊滑鼠左鍵或單擊滑鼠右鍵,彈出Column Object對話框,選取Expressions頁,在Color後的框中輸入:if(cj<60,rgb(255,0,0),rgb(192,192,192))此句表示當成績小於60則顯紅色,否則灰色顯示。
IF語句只可能有兩種選擇,如果要更多的條件判斷則必須用CASE語句,例如成績大於等於90用藍色,小於60用紅色,其他用綠色則應該用以下語句:Case(cj WHEN IS >=90 THEN RGB(0,0,255) WHEN IS < 60 THEN RGB(255,0,0) ELSE RGB(0,255,0))。
圖形是最好的說明語言,為了更好體現數據的直觀性,可以採用條件點陣圖的方法。之所以稱為條件點陣圖,是因為它隨數據的性質而決定是否顯示,用可以在上述的成績管理數據視窗的前面加上一個圖片。雙擊點陣圖,彈出Picture Object對話框,選Expressions頁,在Visible編輯框寫入if(xb=”0”,1,0),此句的意義為當性別為0(女)時蝴蝶出現,否則蝴蝶消失,程式運行起來相當直觀,充分利用列的屬性使用戶的界面更加友善、漂亮。
數據的保護
有很多情況需要對數據進行保護(即只能顯示而不允許修改),學生查詢成績時就是這種情況。進行數據保護的方法有很多,第一種是雙擊要保護的列,彈出Column Object,選取Edit頁,將Display Only框選中;第二種將要保護的列的TabOrder置0,則此列得不到焦點,當然就無從修改;第三種是從根本作起,選取Rows選單,再選取Update Properties,彈出Specify Update Properties對話框,將Allow Updates設為空,這樣即使用戶更改了也無法更新資料庫,使更改毫無意義。
數據視窗的多表更新
在處理數據時,經常需要將幾個表中的數據放入一個數據視窗中進行處理。一般情況下多表數據源的數據視窗只能用於數據的檢索,而不能更新。想要更新數據則採用的方法為:創建數據視窗(將各個表的主鍵包括進去),修改Taborder使數據能被更改,然後對應各個表創建相應的隱含數據視窗,隱含數據視窗的數據項和主數據視窗中對應表的數據項應完全一致。存檔時將主數據視窗中的數據拷貝到相應的隱含數據視窗中去,逐個保存各隱含數據視窗中的數據即可。由此看來,第二種方法更容易理解和接受,實現起來也很簡單。
PowerBuilder 入門
創建新的資料庫
為了使您儘快了解PowerBuilder的基本工作原理和編程環境,我們以一個完整的資料庫應用程式的開發為例,通過對其開發過程的詳細介紹,讓您對PowerBuilder有一個基本的認識,為以後的深入學習打基礎。
資料庫應用程式的操作對象是資料庫里的數據,應用程式的目的就是給用戶提供一個良好的界面,使得用戶能夠方便有效地使用資料庫中的數據,可見資料庫是應用程式工作的基礎,所以我們就先了解資料庫的創建。
PowerBuilder作為一種資料庫應用程式的開發工具,一般訪問的是後台伺服器上的大型資料庫。但是PowerBuilder自身也帶有本地的資料庫管理系統SYBASE SQL ANYWHERE,利用它我們可以創建本地的資料庫,由於利用ODBC接口來實現應用程式和遠程資料庫或本地資料庫的連線在操作上並沒有太大的區別,下面我們利用PowerBuilder自帶的資料庫管理系統SYBASE SQL ANYWHERE來創建本地資料庫。
雙擊螢幕上的PowerBuilder 5.0圖示,就可以啟動PowerBuilder,圖2-1顯示的就是PowerBuilder的初始界面,可以看出,PowerBuilder的界面同其它WINDOWS 應用程式的界面是類似的,也是由選單、工具條、工作區和狀態條等部件組成。PowerBuilder工具條上的一個個圖示被稱為畫板按鈕,按下這些按鈕可以打開相應的畫板。利用這些畫板我們可以創建各種對象,套用到PowerBuilder開發的應用程式中去。如果你對某個畫板按鈕的功能不太清楚,將滑鼠放在這個按鈕上不動,系統會在畫板按鈕的旁邊顯示一條簡短的語句,說明此畫板按鈕的功能,另外也可以從按鈕上的圖示來識別它的功能。
2.1.1 創建新的資料庫
創建一個新的資料庫的過程如下:
1) 單擊工具條上的DATABASE畫板按鈕,利用它來創建新的資料庫,單擊後螢幕上彈出一個標題為SELECT TABLES的對話框(圖2-2),讓我們選擇表,這些表是系統當前所連線的資料庫中的表,因為我們現在是要創建新的資料庫,所以單擊對話框的CANCEL按鈕關閉這個對話框,接著螢幕上顯示的是一個完整的資料庫畫板視窗,視窗的標題顯示的是系統當前所連線的資料庫的名字。
2) 單擊FILE選單,選擇其中的CREATE DATABASE選單項,螢幕上彈出了CREATE LOCAL DATABASE對話框,利用這個對話框我們就可以創建本地資料庫。首先單擊BROWSE按鈕彈出一個對話框,用於選擇資料庫存放的目錄和資料庫的名字,這裡不妨設定D:\DATABASE目錄為資料庫的存放路徑。我們要創建的是一個通訊錄管理程式,所以在對話框的檔案名稱一欄中給它起名為TELEBOOK,然後單擊保存按鈕關閉BROWSE命令所彈出的對話框。注意到現在的對話框的DATABASE NAME一欄中顯示的就是我們剛剛設定的資料庫的完整路徑(圖2-3)。對話框中還有很重要的USER ID、PASSWORD等項,它們是用來設定訪問此資料庫所需要的帳號、口令等信息,以防止對資料庫的非法訪問,維護資料庫的安全性。
3)單擊OK按鈕,PowerBuilder的本地資料庫管理系統就會自動生成SQL語句,在指定的目錄D:\DATABASE下生成一個名為TELEBOOK的本地資料庫,並以檔案名稱TELEBOOK.DB保存在磁碟上。觀察一下資料庫視窗的標題,可以發現系統已經自動把新創建的TELEBOOK資料庫作為系統當前所連線的資料庫(圖2-4)。
圖 2-3
圖 2-4
2.1.2 向資料庫中添加表
資料庫是一個容器,其中存放的是一個個的表。接下來我們就來為剛建的TELEBOOK資料庫創建表,創建表的過程如下:
1) 單擊工具條上的CREATE TABLE畫板按鈕,就彈出了標題為CREATE TABLE的對話框(圖2-5),利用這個視窗我們就可以生成定義一張表所需要的各項信息
2) 一個表是由很多的欄位組成的,接下來開始定義表的各個欄位了。注意COLUMN NAME一項,它是用來輸入表的欄位的名字。這裡輸入第一個欄位的名字為NUMBER,代表一個人在通訊錄中的編號。單擊DATA TYPE一欄的下拉箭頭,從中選擇當前欄位的數據類型,不妨把NUMBER欄位設定為INTEGER整型。這時WIDTH和DEC兩項是灰色的,這表示對於整型欄位,數據寬度和小數點後的數據寬度兩項是不可操作的。單擊NULL一欄的下拉列表框,彈出YES 和NO兩項,是用來選擇當前的欄位是否可以取空值,也就是在以後的實際記錄中這一個欄位是否可以不往裡面輸入數據,因為通訊錄中的每一條記錄都必須有一個編號,所以在NULL項中選擇NO,表示這個欄位不能取空值。注意到對話框的下部還有很多項用來設定當前欄位的擴展信息,要指出的是,對於具體的某個欄位,只要對確實需要定義和修改的屬性進行修改,其它的屬性採用系統所給定的預設值就可以了。此外有些屬性我們等到表建立好以後再重新定義。注意擴展屬性中的HEADER項,系統已經設定了預設值NUMBER,這裡把它修改為“編號”,同樣地把LABEL項中的預設值修改為“編號”,上面定義的這兩項是設定這個表將來通過數據視窗等途徑顯示出來時的欄位題頭和標籤。這樣就定義好了NUMBER欄位的一些基本屬性(圖2-6)。
3) 單擊視窗上部中NUMBER欄位的最後一項DEFAULT激活它,然後按TAB鍵,視窗中又出現一行讓我們定義表的第二個欄位的有關屬性,這裡定義第二個欄位的欄位名為NAME,代表記錄中一個人的名字,數據類型選擇為CHAR字元型。最大寬度WIDTH不妨設定為20,顯然這個欄位也應該是非空的,然後把這個欄位的題頭和標籤都設定為“名字”。
圖( 2-6 )
4) 用類似的方法接著定義第三個欄位的名字為HOME-ADDRESS,代表家庭地址。它的數據類型為CHAR型,寬度為50,因為在通訊錄中可能暫時不知道某個人的家庭地址,所以這個欄位可以是空的,即NULL欄選擇為YES,欄位的題頭和標籤都定義為“家庭地址”。接著定義第四個欄位的名字為POSTCODE,代表郵政編碼,它的數據類型設為NUMERIC,即數值型,寬度為6,DEC一欄為數值的小數點後的位數,這裡設為0,NULL設項為YES,題頭和標籤設定為“郵政編碼”,第五個欄位的名字定義為WORK-ADDRESS,代表工作單位的地址,數據類型也為CHAR型,寬度為50,NULL項為YES,題頭和標籤設定為“工作單位”,第六個欄位的名字設定為TELEPHONE,代表電話號碼,數據類型設定為CHAR 型,數據寬度為15,NULL項為YES,題頭和標籤定為“電話號碼”,最後一個欄位給它起名為STATUS,代表一個人的目前狀況,這個欄位的值可能會因為人的不同,有時很長,有時很短,有時甚至可以為空值,所以定義它的數據類型為VARCHAR型,即變寬字元型,它的最大長度設定為256,NULL項為YES,題頭和標籤設為“目前狀況”,這樣我們就完成了對一個表的基本結構的設定工作(圖2-7)。
圖 2-7
5)下一步把表起個名字保存起來,單擊工具條上的SAVE CHANGES按鈕,系統彈出一個對話框讓我們輸入表的名字,在TABLE NAME一欄中給它起名為MYTELEBOOK,單擊OK按鈕關閉對話框。注意到這時視窗的標題已經從UNTITLED變成了MYTELEBOOK,表示名為MYTELEBOOK的表已經成功地創建了。
2.1.3 定義表的關鍵字
對於一個表來說,一般總需要定義關鍵字,關鍵字所在欄位的值對於表中不同的記錄一定是不相同的,關鍵字是維護資料庫的完整性和正確性的重要手段。
定義表MYTELEBOOK的關鍵字的過程如下:
1) 單擊工具條上的PROPERTIES按鈕,系統彈出一個對話框用來選擇和設定表的各種屬性,在對話框中單擊PRIMARY KEY標籤,來為表定義關鍵字,單擊對話框下部所顯示的表的NUMBER欄位,可以發現NUMBER欄位出現在對話框上部的KEY COLUMNS一欄中(圖2-9),表示欄位NUMBER已經成為關鍵字的組成部分,這裡僅選擇NUMBER欄位作為表的關鍵字,單擊OK按鈕關閉對話框,MYTELEBOOK的關鍵字已經成功地設定為NUMBER欄位。
圖 2-9
2) 單擊工具條上的CLOSE按鈕,系統彈出一個對話框詢問是否保存對表的修改,選擇“是”後對話框和CREATE TABLE視窗都被關閉,一個標題為MYTELEBOOK的表出現在DATABASE視窗中,注意到有一個上面畫有鑰匙圖形的小圖示指向NUMBER欄位,表明NUMBER是當前這個表的關鍵欄位。
2.1.4 定義欄位的擴展屬性
接下來我們根據需要來定義表MYTELEBOOK中的一些欄位的某些擴展屬性。定義NUMBER欄位擴展屬性的過程如下:
1) 滑鼠放在NUMBER欄位上,單擊滑鼠右鍵,然後單擊彈出的選單的PROPERTIES選單項,螢幕上彈出一個用來定義欄位的擴展屬性的對話框,對於NUMBER欄位,我們想要設定的擴展屬性是VALIDATION屬性,也就是設定NUMBER欄位的有效性檢查規則,有效性檢查規則的作用是,如果輸入記錄的NUMBER欄位的值通不過這個有效性規則檢查時,就拒絕把這條記錄放進表中。
2) 單擊VALIDATION標籤,VALIDATION RULE一欄用來選擇一條有效性規則,因為目前還沒有可用的規則,所以這一欄目前是空的。單擊NEW按鈕,螢幕上彈出一個對話框用來創建一條新規則,在NAME框中輸入新規則的名字為NUMBER-VALID,單擊@NUMBER按鈕,可以發現“@NUMBER”出現在RULE DEFINITION文本框中,它代表欄位NUMBER的值,我們接著在這個文本框中輸入文本“>0 and @NUMBER<1000”(圖2-10)。
圖 2-10
3) 單擊OK按鈕關閉創建規則對話框,可以發現欄位屬性定義對話框的VALIDATION RULE一欄中已經有了我們剛剛定義的規則NUMBER-VALID,選中這條規則,單擊APPLY按鈕後這條規則就成為NUMBER欄位的有效性檢查規則。單擊OK按鈕關閉對話框。NUMBER欄位的有效性檢查規則就建立好了。可以用滑鼠右鍵單擊NUMBER欄位,選擇DEFINITION選單,觀察彈出的對話框中的VALIDATION一欄,可以看到其中出現的就是剛剛定義的規則(圖2-11)。
圖 2-11
定義POSTCODE欄位擴展屬性的過程如下:
1) 用滑鼠右鍵單擊POSTCODE欄位,單擊PROPERTIES選單後打開定義POSTCODE欄位擴展屬性的對話框。單擊DISPLAY標籤就可以為POSTCODE欄位定義顯示樣式,也就是通過數據視窗等方式進行操作時數據的顯示風格,
2) 單擊NEW按鈕開始定義一個新的顯示風格,在彈出的對話框中給這個顯示樣式起名為POSTCODE-DISPLAY,在格式FORMAT 一欄中輸入“000000”,格式中的“0”是有特殊含義的,它表示不可缺少的一個數字,如果沒有輸入這個數字的話,就會以“0”來補充,因為郵政編碼是固定的六位數,所以這裡定義顯示格式為六個零,這樣就可以規範化地顯示數據。TEST VALUE 欄用來對顯示格式進行測試,例如輸入28後單擊TEST按鈕,可以發現顯示出來的測試值為“000028”,系統自動補充了四個零(圖2-12)
圖 2-12
3) 單擊OK按鈕關閉創建顯示風格對話框。可以發現這時定義擴展屬性對話框中的DISPLAY FORMAT一欄中多了一個我們剛剛定義的顯示風格POSTCODE-DISPLAY,選中它,單擊APPLY按鈕把它套用到POSTCODE欄位上,最後單擊OK按鈕關閉對話框,就完成了POSTCODE欄位顯示風格的設定。
編輯樣式就是用戶編輯數據時數據的顯示格式,對輸入時有特殊格式要求的數據定義編輯樣式是一種好的習慣。定義TELEPHONE欄位的擴展屬性的過程如下:
1 ) 右鍵單擊TELEPHONE欄位後選擇PROPERTIES選單,在彈出的對話框中選擇EDIT STYLE標籤,
2) 單擊NEW按鈕開始定義編輯樣式,在彈出的對話框的NAME欄中輸入編輯樣式的名字為TELEPHONE-EDIT,STYLE欄中選擇樣式為EDITMASK,即編輯禁止風格,利用這種樣式中的特殊字元可以決定在編輯的時候以什麼樣的格式顯示什麼樣的字元,以及什麼樣的輸入可以被接受。電話號碼的樣式一般都是前面是區號,然後是一條短橫線,然後是具體的本地號碼,所以在MASK一欄中輸入如下字元串作為編輯格式“(####)-########”,格式中的括弧和短橫線都會事先顯示在要輸入記錄的相應欄位中,事實上觀察對話框的TEST一欄就可以發現已經顯示了括弧和橫線。格式中的“#”代表一個數字,在括弧中有四個“#”,表示最多可以輸入四個數字作為區號。類似地,格式最後的八個“#”表示本地號碼最多可以有八位。作為試驗,在TEST欄的括弧中輸入這樣的一個南京地區的電話號碼是可以的
(3) 單擊OK按鈕關閉創建編輯風格對話框,可以看出在原來的設定擴展屬性對話框中多了我們剛剛創建的編輯樣式TELEPHONE-EDIT,選中它後單擊APPLY按鈕把它套用到TELEPHONE欄位上,最後單擊OK按鈕關閉對話框,就完成了TELEPHONE欄位編輯樣式的設定。
2.1.5 向表中添加記錄
通過上面的操作我們已經成功地創建了資料庫TELEBOOK和資料庫中的一張表MYTELEBOOK,並且定義了表的欄位的基本屬性和一些欄位的擴展屬性。這時候的表還只是一個有了結構的空表,接下來要做的事情是往這個剛創建的表中加入一些數據,也就是記錄,以後應用程式操作的對象一般都是表中的數據。
往一個表中加入數據有兩種基本的方法,先介紹第一種方法,添加記錄的過程如下:
1) 單擊工具條上的DATA MANIPULATION(GRID)畫板按鈕,系統彈出了DATA MANIPULATION視窗,注意到在視窗的上部顯示的就是記錄的格式,但每個欄位不是用欄位本身的名字,而是用欄位擴展屬性中的HEADER項,也就是題頭來代表這個欄位,這樣做的好處是記錄格式看起來比較直觀清楚。通過DATA MANIPULATION視窗就可以輸入數據到表中。
2) 單擊工具條上的INSER ROW按鈕,視窗上出現一個空行用來輸入一條記錄,回憶前面我們定義了NUMBER欄位的有效性檢查規則,要求數據必須在1和1000之間,試著在編號欄中輸入2000,然後用滑鼠單擊其它的欄位,這時系統會彈出一個對話框告訴我們剛才輸入到編號欄中的數據沒有通過有效性檢查單擊確定後系統把輸入焦點仍舊放在編號欄中讓我們重新輸入一個有效的數據。
3) 輸入編號為1,然後用TAB切換到姓名欄位,輸入姓名為“馮飛”,家庭地址輸入為“南京市鳳凰西街220號”,郵政編碼輸入為“210019”,工作單位輸入為“南京市新街口百貨商場”,7984684,目前狀況輸入為“目前在複習英語,準備參加托福考試”,這樣我們就輸入了一條完整的記錄到表中。
4)再次單擊工具條上的INSERT ROW按鈕,視窗上又出現一條空記錄用來輸入數據,用類似的方法依次輸入記錄的各個欄位的值依次這樣我們就完成了三條記錄的錄入工作,要注意的是此時輸入的記錄並沒有真正存放到磁碟上去,而是暫時放在緩衝區中,單擊工具條上的SAVE CHANGES按鈕,這樣就把剛才輸入的記錄真正存放到了磁碟上相應的表中
接下來介紹另外的一種數據輸入方法,輸入數據的過程如下:
1) 單擊工具條上的DB ADMINISTRATION畫板按鈕,彈出一個標題為DATABASE ADMINISTRATION的可編輯視窗,在這個視窗中可以輸入SQL語句來往表中添加記錄,不妨在其中輸入一條標準的SQL語句為“INSERT INTO MYTELEBOOK VALUES
(2) 單擊工具列上的EXECUTE按鈕,系統沒有給出任何的反應,這表示INSERT語句已經提交給資料庫管理系統並被成功地執行,如果輸入的SQL語句有錯的話,比如我們把上面INSERT語句括弧中應該是整數的NUMBER項用一個字元串代替,然後單擊工具條上的EXECUTE按鈕,系統會彈出對話框提醒我們剛才輸入的SQL語句有錯,應該修改後再重新提交關閉DATABASE ADMINISTRATION視窗,單擊工具條上的DATA MANIPULATION(GRID)畫板按鈕,彈出的視窗中的有一條記錄就是剛才用SQL語句輸入的記錄
到目前為止,我們成功地創建了一個資料庫和它的一個表,表中有四條記錄,當然你可以用本節介紹的方法往表中添加更多的記錄。接下來將創建POWRBUILDER應用程式不可缺少的組成部分 —— 套用對象。
2.2 創建套用對象
套用對象是PowerBuilder應用程式的基礎,通過它可以設定有關應用程式的全局信息,例如應用程式的名字,程式使用的圖示,程式中文本的字型,應用程式所在的對象庫等各種信息。在以後將詳細介紹如何設定應用程式的這類信息。要記住的很重要的一點是套用對象是PowerBuilder應用程式執行時的入口點。下面我們就開始創建一個新的套用對象。
1)單擊工具條上的APPLICATION畫板按鈕,系統彈出一個標題為APPLICATION的視窗,每次啟動PowerBuilder後系統都會自動打開前一次的套用對象。下面我們將要創建一個新的套用對象。
2) 打開FILE選單,單擊其中的NEW選單項,螢幕上彈出一個名為SELECT NEW APPLICATION LIBRARY的對話框,用於設定把套用對象保存到哪個庫檔案中。應用程式對象庫實際上是一個特殊格式的檔案,用於存放應用程式所用到的各種對象。應用程式本身作為一個對象自然要放到對象庫中。這裡我們創建一個新的對象庫,首先設定對象庫的存放路徑為D:\DATABASE,在檔案名稱一欄中輸入對象庫的名字為TELEPHONE-BOOK,然後單擊保存按鈕。
3)系統又彈出一個名為SAVE APPLICATION的對話框,用於給套用對象自身起一個名字,為方便記憶,同樣給它起名為TELEPHONE-BOOK,對話框下部的註解欄用於輸入有關這個套用對象的一些信息,以後重新打開這個套用對象時可以有一個大概的了解。
4)單擊OK按鈕,系統就創建了一個名為TELEPHONE-BOOK的套用對象和它所在的名為TELEPHONE-BOOK.PBL的對象庫。系統彈出一個對話框詢問是否需要由PowerBuilder為我們生成一個應用程式的模板(圖2-20),所謂應用程式的模板就是應用程式基本框架,這個框架中含有一些應用程式可能用到的基本對象,利用這個框架可以更好更快地開發應用程式。當然也可以不用這個模板而直接編寫應用程式,這裡選擇“否”不讓系統生成應用程式的基本框架,而是由我們自己一步步創建應用程式,以使你PowerBuilder應用程式的開發過程有一個更深刻的了解。
5)單擊工具條上的LIBRARY畫板按鈕,可以發現創建的套用對象TELEPHONE-BOOK出現在我們剛剛創建的對象庫TELEPHONE-BOOK.PBL中。
2.3 創建第一個視窗
視窗在WINDOWS應用程式中是一個極為重要的概念,它提供了應用程式同用戶之間互動的非常直觀的界面,目前許多的WINDOWS下的開發工具都提供了可視化開發視窗對象的方法,使得開發一個視窗對象變得非常容易,PowerBuilder也不例外,下面就開始創建這裡的應用程式中要用到的兩個視窗。
首先來創建第一個視窗對象,創建一個視窗的一般步驟如下:
單擊工具條上的WINDOW畫板按鈕,系統彈出一個題為SELECT WINDOW的對話框,用來選擇當前對象庫中已存在的視窗對象
單擊對話框的NEW按鈕來創建一個新的視窗對象。單擊後螢幕上彈出一個題為WINDOW的視窗,接下來就可以往這個視窗中添加需要的控制項了。
單擊PAINTERBAR工具條上的控制項畫板按鈕,系統彈出一個方框,其中包含有各種各樣的可用控制項(圖2-23),選中其中的一個,在視窗上單擊,就可以把選中的控制項放到視窗中。這裡首先從方框中選擇STATICTEXT控制項,然後在視窗中單擊,就會發現一個靜態文本框空間就出現在視窗中,再次單擊工具條上的控制項畫板按鈕把第二個靜態文本框控制項放到視窗中,用類似的方法把一個SINGLE LINE EDIT控制項,也就是單行編輯框放到視窗中,最後再把一個COMMAND BUTTON控制項,也就是命令按鈕放到視窗中。
圖 2-23
為了使視窗更美觀一點,可以對已放入視窗中的控制項調整位置和改變一些特性,單擊第一個靜態文本框選中它,然後放到合適的地方,在上面單擊右鍵,在彈出的選單中選擇PROPERTIES選單項,系統彈出一個對話框用來設定這個控制項的屬性(圖2-24),NAME欄顯示的是控制項的名字,這個名字是用在以後編寫的腳本中,系統已經設定了一個預設的名字,這裡不作修改,接下來的TEXT一欄是用來設定顯示在靜態文本框中的文本,這裡把它改為“個人通訊錄管理系統”,設好後單擊OK按鈕,用類似的方法把調整另外一個靜態編輯框的位置,並把上面的文字改為“請輸入你的使用口令:”,然後激活單行編輯框,調整好它的位置後把滑鼠放在它的右框線上等滑鼠變成水平雙箭頭形狀的時候單擊並拖動滑鼠,把編輯框拉長一些;最後調整命令按鈕的位置並把上面的標題修改為“OK”。用滑鼠右鍵單擊視窗中沒有控制項的空白區域,然後在彈出的選單中選擇PROPERTIES選單項,在彈出的對話框中把TITLE一欄改為“個人通訊錄”,然後單擊“OK”按鈕關閉對話框。
圖 2-24
單擊工具條上的PREVIEW按鈕可以預覽設計好的視窗(圖2-25),視窗的標題就是我們剛在視窗的TITLE屬性中輸入的值。關閉預覽視窗,這樣我們就定義好了第一個視窗對象,需要給它起一個名字,單擊FILE選單的SAVE選單項,彈出一個題為SAVE WINDOW的對話框,在WINDOWS一欄中給視窗起一個名字為 TELEPHONE-WINDOW1, 這個明字將用於以後的程式中,輸好後單擊OK按鈕,可以發現視窗的標題已變成剛輸入的名字,到此為止第一個視窗就設計好了。
圖 2-25
2.4 創建數據視窗對象
在創建第二個視窗對象之前,我們需要先來創建兩個數據視窗對象。數據視窗對象是PowerBuilder的一大特色,它為我們運算元據庫中的數據提供了一種直觀有效的手段,利用它可以方便地聯結資料庫,以自己喜歡的方式顯示資料庫中的數據以及修改資料庫。下面就開始創建第一個數據視窗對象。
單擊工具條上的DATAWINDOW畫板按鈕,系統彈出一個名為SELECT DATAWINDOW的對話框,用以選擇已存在的數據視窗對象或者創建新的數據視窗對象。
這裡來創建一個新的數據視窗,單擊NEW按鈕,在彈出的NEW DATAWINDOW對話框中有DATA SOURCE 和PRESENTATION STYLE兩個組合框,分別用來選擇要創建的數據視窗的數據來源和顯示樣式,關於這些選項的含義在以後的內容中再詳細介紹,這裡選擇數據源為QUICK SELECT,即簡單查詢型,數據顯示樣式選擇GRID,即格線型。
單擊OK按鈕,系統彈出一個名為QUICK SELECT對話框用於對數據源進行配置,在TABLES欄中選中先前創建的表MYTELEBOOK,這時在COLUMNS欄中顯示出MYTELEBOOK表中的所有的欄位,讓我們從這些欄位中選擇其中的一些,這樣做是考慮到用戶在大多數時候可能只對表中的某些欄位感興趣,沒必要在提供給用戶的界面上顯示出記錄的所有的欄位。目前創建的這個數據視窗是用來瀏覽通訊錄的大致情況,所以只選中NUMBER,NAME TELEPHONE三個欄位,選好後在對話框的下部顯示出這三個欄位,在每一個欄位的下面又有三個選項,單擊NUMBER欄位下的SORT選項框,在彈出的下拉框中選擇ASCENDING選項,這表示以後在數據視窗中顯示數據的時候按編號欄位從小到大的順序顯示記錄, 以便於查看。其它的選項我們不作改動。
單擊OK按鈕,這樣就為數據視窗設好了數據源,系統彈出的標題為DATAWINDOW的視窗中顯示出的三個欄位就是剛才選中的欄位,可以看出DATAWINDOW視窗被劃分成了四個帶狀區域,這四個區域的大小和內容都是可以設計的,在HEADER區域中系統已經自動放好的就是我們為每個欄位設定的題頭,HEADER中的內容以後將顯示在數據視窗中。單擊左邊工具條上的PREVIEW預覽按鈕,視窗中顯示出預覽的結果,資料庫中的數據也自動按編號欄位從小到大的順序顯示在格線中。
接著為設計好的數據視窗對象起一個名字,雙擊DATAWINDOW視窗的左上角,彈出一個對話框詢問是否保存設計結果,選擇“是”後出現SAVE DATAWINDOW對話框,在DATAWINDOWS一欄中給設計好的數據視窗起名為TELE-DATAWINDOW1,確定在APPLICATION LIBRARIES選中的是TELEPHONE-BOOK 1.PBL ,然後單擊OK按鈕,就完成了第一個數據視窗對象的創建。
再次單擊POWERBAR工具條上的DATAWINDOW畫板按鈕,來創建第二個數據視窗對象,這個數據視窗用來顯示在第一個數據視窗中選中的某個記錄的詳細信息。類似地,在彈出的對話框中選擇NEW按鈕,在NEW DATAWINDOW對話框中數據源選為SQL SELECT,即標準的SQL查詢方式,數據顯示方式這次設定為FREEFORM,即自由表格形式,它的特點是數據視窗中顯示的每條記錄的欄位縱向排列,看起來比較清楚,選好後單擊OK按鈕,接下來彈出的對話框中同樣選中MYTELEBOOK表後單擊OPEN按鈕,視窗中顯示出表的所有欄位,這次選中它的所有欄位,可以發現在視窗下部的工作區中顯示出自動生成的SQL語句,單擊下部的SORT標籤,單擊並拖動NUMBER欄位到右邊的方框中,旁邊出現的複選框表示已經把NUMBER欄位按上升排序。單擊DESIGN選單,選中其中的RETRIEVIAL ARGUMENTS選單項,彈出的對話框用來定義SQL 語句的搜尋參數(圖2-31),在NAME欄中給參數起名為NUMBER-SEARCH,TYPE就選擇為NUMBER類型,然後單擊OK按鈕,就定義好了搜尋參數。單擊視窗下部的WHERE標籤,單擊COLUMN欄後選擇NUMBER欄位,OPERATOR欄就選擇“=”號,VALUE欄中輸入冒號加剛才定義的搜尋參數NUMBER-SEARCH,然後單擊PAINTERBAR工具條上的SELECT畫板按鈕,就定義好了數據視窗的數據源的具體格式。
單擊左邊PAINTER BAR工具條上的PREVIEW按鈕,彈出一個對話框用來輸入剛才定義的搜尋參數的值,這裡不妨輸入1,確定後視窗中就顯示出表TELEBOOK中的NUMBER的值為1的記錄。選擇PAINTERBAR工具條上的EXIT按鈕,彈出的對話框詢問是否保存數據視窗,單擊“是”後,在彈出的對話框中給數據視窗起名為“TELE-DATAWINDOW2”,確定在APPLICATION LIBRARIES選中的是TELEPHONE-BOOK 1. PBL對象庫,然後單擊OK按鈕,就完成了第二個數據視窗對象的創建。
2.5 創建第二個視窗對象
在創建了兩個數據視窗對象後我們來創建第二個視窗,把數據視窗對象套用到視窗中去。
單擊POWERBAR工具條上的WINDOW畫板按鈕,在對話框中選擇NEW按鈕來定義一個新的視窗。
單擊PAINTERBAR工具條上的控制項畫板按鈕,在彈出的方框中選擇DATAWINDOW控制項,再在視窗中單擊把它放到視窗中,這裡要提醒一點的是這裡的DATAWINDOW控制項與前面定義的數據視窗對象是兩個不同的概念,這裡的DATAWINDOW控制項相當於一個容器,是用來存放數據視窗對象的。這裡的數據視窗控制項的作用是顯示出資料庫中所有記錄的主要信息,所以可能在一個視窗中顯示不,在彈出的選單中選擇PROPERTIES選單項,在彈出 的對話框中選中VSCROLL BAR複選框,就為數據視窗控制項在以後顯示數據的時候提供了一個垂直滾動條,以便可以利用滾動條看到數據視窗中的所有的記錄。
用和放入第一個數據視窗控制項類似的方法在視窗中放入第二個數據視窗控制項,然後再在視窗中放入四個COMMANDBUTTON控制項,
滑鼠右鍵單擊激活視窗中的第一個DATAWINDOW控制項,在彈出的選單中選擇PROPERTIES選單項,彈出DATAWINDOW對話框,系統已經自動為這個控制項起名為DW-1,這裡就用這個名字,單擊BROWSE按鈕開始為控制項定義它所聯結的數據視窗對象,在彈出的SELECT DATAWINDOW對話框中選擇數據視窗為TELE-DATAWINDOW1,然後單擊OK按鈕,可以發現在DATAWINDOW對話框的DATAWINDOW OBJECT NAME一欄中出現了剛選中的數據視窗對象。
單擊OK按鈕,第一個數據視窗控制項中顯示的就是它所聯結的數據視窗對象的結構。
用類似的方法為第二個數據視窗控制項聯結剛才定義的數據視窗對象TELE-DATAWINDOW2,聯結好之後把四個命令按鈕控制項上的文字分別改為“插入”,“刪除”,“更新”和“關閉”,而它們的名字則分別修改為“CB-INSERT”,“CB-DELETE”,“CB-UPDATE”,“CB-COLSE”。
接下來調整視窗的大小和視窗上的每個控制項的位置和大小,要注意的是要使得數據視窗控制項中的數據視窗對象的每一個欄位都能在控制項中看得到。調整好之後可以單擊PAINTERBAR工具條上的PREVIEW按鈕預覽一下視窗的樣子。設計好視窗以後單擊PAINTERBAR工具條上的SAVE按鈕,彈出SAVE WINDOW對話框用來給視窗起一個名字,給它起名為TELEPHONE-WINDOW2,確定對話框下部的對象庫是TELEBOOK .PBL 後單擊OK 關閉對話框。這樣就定義好了第二個視窗對象。
2.6 建立應用程式
到目前為止,本程式中用到的對象都定義好了,但程式還不能運行,因為我們還沒有為程式編寫代碼,這種代碼在PowerBuilder中被稱為腳本,PowerBuilder是一種基於面向對象的事件驅動機制開發工具,所以腳本也是針對對象的事件來編寫,接下來就為應用程式編寫腳本。 PowerBuilder應用程式的特點是從套用對象開始執行程式,所以我們首先要做的是為套用對象的打開事件編寫代碼,單擊POWERBAR工具條上的APPLICATION畫板按鈕打開套用對象,然後單擊PAINTERBAR工具條上的SCRIPT畫板按鈕,系統彈出SCRIPT對話框用來為套用對象編寫腳本,從SELECT EVENT下拉列表框中選擇OPEN事件,然後在工作區中輸入如下腳本:
SQLCA.DBMS=PROFILESTRING("PB.INI","DATABASE","DBMS","")
SQLCA.DBPRAM=PROFILESTRING("PB.INI","DATABSE","DBPRAM","")
OPEN(TELEPHONE-WINDOW1)
解釋這段腳本前要先介紹事務對象的概念,這裡的SQLCA就是一個系統自動提供的預設事物對象變數,SQLCA是一個全局變數,可以用在所有的視窗對象中。事物對象的作用是為聯結資料庫提供有關的信息,以便可以從資料庫中獲取需要的數據。這段腳本所做的工作是在套用對象啟動後首先從POWERBUIDER中存放與資料庫有關信息的檔案PB . INI中取得需要的值放入事物對象變數中,然後打開TELEPHONE-WINDOW1視窗,以便用戶從登錄視窗輸入正確的密碼後可以進入到個人通訊錄管理系統。這裡就為套用對象編寫這三行代碼。
單擊POWERBAR工具條上的WINDOW畫板按鈕,選擇打開TELEPHONE-WINDOW1,我們開始為它編寫腳本,右鍵單擊視窗上的OK按鈕,首先在選單中選擇PROPERTIES選單項來修改OK控制項的一個屬性,在彈出的對話框中有一個DEFAULT複選框,我們選中它(圖2-36),這樣在以後程式運行的時候按回車鍵的效果和單擊OK控制項就一樣了,單擊OK關閉對話框,然後再次右鍵單擊視窗上的OK按鈕,在選單中選擇SCRIPT選單項開始為這個命令按鈕的單擊事件編寫腳本,觀察視窗的標題確定目前選擇的是命令按鈕的CLICK事件後在工作區中輸入以下的腳本:
if upper(trim(sle_1.text))="mypassword" then
open (telephone_window2)
close(telephone_window1)
else
sle_1.setfocus()
end if
這段腳本所做的工作是當用戶在打開的登錄視窗中單擊OK按鈕的時候判斷單行編輯框中的字元串在去掉前後的空格符和整個轉換成大寫字元後是否為字元串“MYPASSWORD”,如果是的就打開我們在前面定義的第二個,也就是用來對個人通訊錄資料庫進行操作的視窗,然後再關閉登錄視窗, 如果輸入的字元串與設定的字元串“MYPASSWORD”不符的話就表示用戶不能對通訊錄資料庫進行訪問,就把輸入焦點切換到編輯框讓用戶重新輸入正確的口令,這裡我們把口令設成了“MYPASSWORD”,在實際套用中你可以換成一個自己的口令,這樣可以保證自己的資料庫的安全性。
市盈率PE(股價/每股收益):
PE是簡潔有效的估值方法,其核心在於e 的確定。PE=p/e,即價格與每股收益的比值。從直觀上看,如果公司未來若干年每股收益為恆定值,那么PE 值代表了公司保持恆定盈利水平的存在年限。這有點像實業投資中回收期的概念,只是忽略了資金的時間價值。而實際上保持恆定的e 幾乎是不可能的,e 的變動往往取決於巨觀經濟和企業的生存周期所決定的波動周期。所以在運用PE 值的時候,e 的確定顯得尤為重要,由此也衍生出具有不同含義的PE 值。E 有兩個方面,一個是歷史的e,另一個是預測的e。對於歷史的e 來說,可以用不同e 的時點值,可以用移動平均值,也可以用動態年度值,這取決於想要表達的內容。對於預測的e 來說,預測的準確性尤為重要,在實際市場中,e 的變動趨勢對股票投資往往具有決定性的影響。<br>
市淨率PB
(股價/每股淨資)
淨資產收益率ROE:
PB &ROE適合於周期的極值判斷。對於股票投資來說,準確預測e 是非常重要的,e 的變動趨勢往往決定了股價是上行還是下行。但股價上升或下降到多少是合理的呢? PB&ROE 可以給出一個判斷極值的方法。比如,對於一個有良好歷史ROE 的公司,在業務前景尚可的情況下,PB 值低於1就有可能是被低估的。如果公司的盈利前景較穩定,沒有表現出明顯的增長性特徵,公司的PB 值顯著高於行業(公司歷史)的最高PB 值,股價觸頂的可能性就比較大。這裡提到的周期有三個概念:市場的波動周期、股價的變動周期和周期性行業的變動周期。這裡的PB 值也包括三種:整個市場的總體PB 值水平、單一股票的PB 值水平和周期性行業的PB 值變動。當然,PB 值有效套用的前提是合理評估資產價值。<br> 提高負債比率可以擴大公司創造利潤的資源的規模,擴大負債有提高ROE 的效果。所以在運用PB &ROE 估值的時候需考慮償債風險。
絕對估值法DCF:
DCF 是一套很嚴謹的估值方法,是一種絕對定價方法,想得出準確的DCF值,需要對公司未來發展情況有清晰的了解。得出DCF 值的過程就是判斷公司未來發展的過程。所以DCF 估值的過程也很重要。就準確判斷企業的未來發展來說,判斷成熟穩定的公司相對容易一些,處於擴張期的企業未來發展的不確定性較大,準確判斷較為困難。再加上DCF 值本身對參數的變動很敏感,使DCF 值的可變性很大。但在得出DCF 值的過程中,會反映研究員對企業未來發展的判斷,並在此基礎上假設。有了DCF 的估值過程和結果,以後如果假設有變動,即可通過修改參數得到新的估值。
舉例
2005年8月,寶鋼股份跌破淨資產,8月25日,寶鋼集團宣布斥資20億增持股票,並承諾自2005年10月14日開始的6個月內,如公司的股票價格低於每股4.53元,寶鋼集團將再投入累計不超過人民幣20億元的資金,通過交易所增持公司的股份,除非公司的股票價格不低於每股4.53元或上述資金用盡。據海通證券策略分析師吳一萍介紹,寶鋼大股東於2005年底到2006年初對寶鋼股份的增持,其增持價格對應的PB均在1倍左右。