标题：PB&ROE
简介
由于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等。
编程技巧
1、数据的转储和调入功能的实现一个数据处理系统的安全性部分是整个系统的关键部分，对于一些需要长期保存的历史数据来说更是必不可少。对于现代的大型数据库管理系统来说，数据的安全性独立交给DBA来专门管理，一般的系统较少涉及数据的备份工作。为了减少计算机专业人员的负担，一个好的MIS系统应该提供数据的转储和调入功能，这样对数据库管理系统不太了解的用户也可以进行数据安全方面的处理。PowerBuilder中SaveAs()、ImportFile()两函数可以实现这方面的操作，dwcontrol.SaveAs()提供了多种数据的存储格式，如dBase的DBF格式、以TAB作为分隔符的文本TXT格式、Excel格式、SQLInsert格式、CSV格式。dwcontrol.ImportFile()将数据从各种格式的文本文件中调入数据窗口控制里。2、简洁美观的数据报表的创建一个系统里的报表应该具有一致的风格，报表至少应该具有如下几种项目:报表的标题、报表的日期和时间、报表的页序、报表涉及的对象和条件。PowerBuilder提供了各种类型的数据窗口，报表中主要用到如下几种类型: Free风格，该数据窗口的数据排列，用户可以任意调整，有最大的自由性。Grid风格，以表格的方式显示数据，外观比较工整，美观明了。Graph风格，以图形方式显示数据，有直方格、圆饼图、曲线图、三维立体柱图。Group风格的数据窗口提供了一种对数据进行分组的简便途径，它生成了一个具有分组属性的Tabular风格的数据窗口对象。3、Mdi窗体技术的应用随着Windows系统的出现，图形交互界面得到了用户的喜爱，已成为一种潮流，其中Mdi窗体技术更是吸引人。Mdi窗体，即是多文档交互式窗体，亦叫无模式窗体。这种窗体包括一个Mdi主窗口及多个Mdi子窗口，子窗口只能在框架之内出现和移动，可以同时打开多个Mdi子窗口，但同一时刻只能有一个窗口处于被激活状态，当主窗口关闭时，同时关闭所有子窗口。4、SQL语句的使用在用PowerBuilder编程时经常要使用SQL语句对数据库进行操作，而SQL语言语句在使用中格式要求比较严格。此外，在使用SQL语句之前，要用Connect与数据库相连，并且每一条SQL语句必须以“；”结尾。5、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中用得最多的函数之一，常用于向用户显示出错、警告及其它信息，并且在开发过程中常用它显示程序状态和重要变量的取值，它在程序运行过程中，在屏幕上显示一个窗口，只有用户在响应该窗口后，程序才能继续运行下去，因此，这个函数在程序的开发调试过程中非常有用，可以用来判断程序在哪个地方出错。6、数据的突出显示程序运行中，用户希望显示的数据具有明显的区分，数据窗口应该能使用户很快找到他们想要的信息，以颜色区分既满足用户的习惯，又不占系统资源，实现起来也很简单。以学生管理为例，要求成绩低于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(女)时蝴蝶出现，否则蝴蝶消失，程序运行起来相当直观，充分利用列的属性使用户的界面更加友善、漂亮。7、数据的保护有很多情况需要对数据进行保护(即只能显示而不允许修改)，学生查询成绩时就是这种情况。进行数据保护的方法有很多，第一种是双击要保护的列，弹出Column Object，选取Edit页，将Display Only框选中;第二种将要保护的列的TabOrder置0，则此列得不到焦点，当然就无从修改;第三种是从根本作起，选取Rows菜单，再选取Update Properties，弹出Specify Update Properties对话框，将Allow Updates设为空，这样即使用户更改了也无法更新数据库，使更改毫无意义。8、数据窗口的多表更新在处理数据时，经常需要将几个表中的数据放入一个数据窗口中进行处理。一般情况下多表数据源的数据窗口只能用于数据的检索，而不能更新。想要更新数据则采用的方法为:创建数据窗口(将各个表的主键包括进去)，修改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-12.1.1 创建新的数据库创建一个新的数据库的过程如下:
1) 单击工具条上的DATABASE画板按钮，利用它来创建新的数据库，单击后屏幕上弹出一个标题为SELECT TABLES的对话框（图2-2），让我们选择表，这些表是系统当前所连接的数据库中的表，因为我们现在是要创建新的数据库，所以单击对话框的CANCEL按钮关闭这个对话框，接着屏幕上显示的是一个完整的数据库画板窗口，窗口的标题显示的是系统当前所连接的数据库的名字。
  图 2-2
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-3 
  图 2-4
图 2-42.1.2 向数据库中添加表数据库是一个容器，其中存放的是一个个的表。接下来我们就来为刚建的TELEBOOK数据库创建表，创建表的过程如下：
1） 单击工具条上的CREATE TABLE画板按钮，就弹出了标题为CREATE TABLE的对话框（图2-5），利用这个窗口我们就可以生成定义一张表所需要的各项信息
  图 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 )
图（ 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
图 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-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
图 2-10 
3） 单击OK按钮关闭创建规则对话框，可以发现字段属性定义对话框的VALIDATION RULE一栏中已经有了我们刚刚定义的规则NUMBER-VALID，选中这条规则，单击APPLY按钮后这条规则就成为NUMBER字段的有效性检查规则。单击OK按钮关闭对话框。NUMBER字段的有效性检查规则就建立好了。可以用鼠标右键单击NUMBER字段，选择DEFINITION菜单，观察弹出的对话框中的VALIDATION一栏，可以看到其中出现的就是刚刚定义的规则（图2-11）。
  图 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
图 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应用程序的开发过程有一个更深刻的了解。
  图2-20
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
图 2-23 
为了使窗口更美观一点，可以对已放入窗口中的控件调整位置和改变一些特性，单击第一个静态文本框选中它，然后放到合适的地方，在上面单击右键，在弹出的菜单中选择PROPERTIES菜单项，系统弹出一个对话框用来设置这个控件的属性（图2-24），NAME栏显示的是控件的名字，这个名字是用在以后编写的脚本中，系统已经设置了一个缺省的名字，这里不作修改，接下来的TEXT一栏是用来设置显示在静态文本框中的文本，这里把它改为“个人通讯录管理系统”，设好后单击OK按钮，用类似的方法把调整另外一个静态编辑框的位置，并把上面的文字改为“请输入你的使用口令：”，然后激活单行编辑框，调整好它的位置后把鼠标放在它的右边框上等鼠标变成水平双箭头形状的时候单击并拖动鼠标，把编辑框拉长一些；最后调整命令按钮的位置并把上面的标题修改为“OK”。用鼠标右键单击窗口中没有控件的空白区域，然后在弹出的菜单中选择PROPERTIES菜单项，在弹出的对话框中把TITLE一栏改为“个人通讯录”，然后单击“OK”按钮关闭对话框。 
  图 2-24
图 2-24 
单击工具条上的PREVIEW按钮可以预览设计好的窗口（图2-25），窗口的标题就是我们刚在窗口的TITLE属性中输入的值。关闭预览窗口，这样我们就定义好了第一个窗口对象，需要给它起一个名字，单击FILE菜单的SAVE菜单项，弹出一个题为SAVE WINDOW的对话框，在WINDOWS一栏中给窗口起一个名字为 TELEPHONE-WINDOW1, 这个明字将用于以后的程序中，输好后单击OK按钮，可以发现窗口的标题已变成刚输入的名字，到此为止第一个窗口就设计好了。 
  图 2-25
图 2-252.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 &amp;ROE适合于周期的极值判断。对于股票投资来说，准确预测e 是非常重要的，e 的变动趋势往往决定了股价是上行还是下行。但股价上升或下降到多少是合理的呢？ PB&amp;ROE 可以给出一个判断极值的方法。比如，对于一个有良好历史ROE 的公司，在业务前景尚可的情况下，PB 值低于1就有可能是被低估的。如果公司的盈利前景较稳定，没有表现出明显的增长性特征，公司的PB 值显著高于行业（公司历史）的最高PB 值，股价触顶的可能性就比较大。这里提到的周期有三个概念：市场的波动周期、股价的变动周期和周期性行业的变动周期。这里的PB 值也包括三种：整个市场的总体PB 值水平、单一股票的PB 值水平和周期性行业的PB 值变动。当然，PB 值有效应用的前提是合理评估资产价值。<br>　　提高负债比率可以扩大公司创造利润的资源的规模，扩大负债有提高ROE 的效果。所以在运用PB &amp;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倍左右。