文档详情

数据库应用系统开发工具(PB)

鲁**
实名认证
店铺
PPT
1.24MB
约181页
文档ID:585884686
数据库应用系统开发工具(PB)_第1页
1/181

1 引言引言 Power BuilderPower Builder(以下简称(以下简称PBPB)是广泛使用于)是广泛使用于C/SC/S体系体系结构下的面向对象的数据库应用程序的客户端开发工具结构下的面向对象的数据库应用程序的客户端开发工具其优秀的面向对象特性,特别是其具有一个功能强大的智其优秀的面向对象特性,特别是其具有一个功能强大的智能对象能对象——数据窗口,使得开发人员利用它操作关系数据库数据窗口,使得开发人员利用它操作关系数据库时无需编写时无需编写SQLSQL语句,能迅速简单地建立复杂的图形应用,语句,能迅速简单地建立复杂的图形应用,来访问本地或网络服务器上的数据库数据同时它也可用来访问本地或网络服务器上的数据库数据同时它也可用于分布式和于分布式和B/SB/S体系结构的应用程序的开发体系结构的应用程序的开发 数据库应用系统开发工具数据库应用系统开发工具——PBPB 2 学习要求学习要求◆ ◆ 应用程序的体系结构;应用程序的体系结构;◆ ◆ 利用利用PBPB开发数据库应用程序的全过程;开发数据库应用程序的全过程;◆ ◆ 能将前面所学知识与能将前面所学知识与PBPB结合开发结合开发C/SC/S方式的应用系方式的应用系 统。

统第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具——PBPB 3 目前,应用程序的开发主要可选择三种体系结构:目前,应用程序的开发主要可选择三种体系结构:客户客户/ /服务器(服务器(C/SC/S)、分布式和)、分布式和B/S(B/S(或或WEB)WEB)体系结构体系结构 C/SC/S应用程序是传统开发人员普遍采用的应用程序应用程序是传统开发人员普遍采用的应用程序体系结构随着体系结构随着INTERNETINTERNET和和INTRANETINTRANET的不断普及和应用的不断普及和应用程序业务逻辑的复杂化,程序业务逻辑的复杂化,C/SC/S体系结构的应用程序带来体系结构的应用程序带来一些问题为解决这些问题,分布式和一些问题为解决这些问题,分布式和WEBWEB体系结构应体系结构应运而生9.1 9.1 应用程序体系结构应用程序体系结构 49.1.1 9.1.1 C/SC/S体系结构体系结构9.1.2 9.1.2 分布式体系结构分布式体系结构9.1.3 9.1.3 WEBWEB体系结构体系结构9.1 9.1 应用程序体系结构应用程序体系结构 5 C/SC/S体系结构将整个系统划分为两层:一层驻留在体系结构将整个系统划分为两层:一层驻留在客户端,一般由应用程序及相应的数据库连接程序构成,客户端,一般由应用程序及相应的数据库连接程序构成,另一层安装在服务器端,通常是某个数据库系统,包括另一层安装在服务器端,通常是某个数据库系统,包括数据库和服务器组件。

客户端软件的主要功能是处理与数据库和服务器组件客户端软件的主要功能是处理与用户的交互、按照某种业务逻辑进行处理以及与数据库用户的交互、按照某种业务逻辑进行处理以及与数据库进行交互,服务器端数据库系统根据客户端的请求进行进行交互,服务器端数据库系统根据客户端的请求进行数据库操作,然后将结果传送给客户端客户端与服务数据库操作,然后将结果传送给客户端客户端与服务器端(数据库)软件之间的交互通过器端(数据库)软件之间的交互通过SQLSQL语句进行语句进行9.1.1 C/S9.1.1 C/S体系结构体系结构 6 C/SC/S结构具有以下结构具有以下优点:优点: ((1 1)采用该体系结构可缩短软件系统的开发周期采用该体系结构可缩短软件系统的开发周期 C/SC/S体系结构将处理权力下放到客户端,因此客户端用户拥体系结构将处理权力下放到客户端,因此客户端用户拥有强大的处理能力,这在很大程度上激发了终端用户的积极性,有强大的处理能力,这在很大程度上激发了终端用户的积极性,提高了工作效率提高了工作效率 ((2 2)提高系统性能提高系统性能 在该体系结构下,处理是分布式的,由众多的在该体系结构下,处理是分布式的,由众多的CPUCPU参与处理,参与处理,从而提高了整个系统的效率。

从而提高了整个系统的效率 ((3 3)采用该体系结构开发的系统具有柔性采用该体系结构开发的系统具有柔性 从组织运营和技术两方面提高了组织的柔性从组织运营和技术两方面提高了组织的柔性9.1.1 C/S9.1.1 C/S体系结构体系结构 7产生的产生的问题:问题:((1 1)维护困难维护困难2 2)缺乏安全性缺乏安全性3 3)客户机负荷过重客户机负荷过重4 4)网络传输负担过重网络传输负担过重5 5)不适应)不适应INTERNETINTERNET环境的要求环境的要求9.1.1 C/S9.1.1 C/S体系结构体系结构 81. 1. 客户端开发工具可以完成的工作客户端开发工具可以完成的工作 ((1 1)设计窗口和定义窗口的控件)设计窗口和定义窗口的控件 ((2 2)生成菜单)生成菜单 ((3 3)生成数据窗口)生成数据窗口 ((4 4)在程序中直接书写)在程序中直接书写SQLSQL语句操作数据库语句操作数据库 ((5 5)可以方便地生成和维护数据库)可以方便地生成和维护数据库 ((6 6)在图形方式下生成数据查询。

用户即使不会使用)在图形方式下生成数据查询用户即使不会使用SQLSQL语句也可以在此环境下生成复杂的查询,并将其作为一语句也可以在此环境下生成复杂的查询,并将其作为一类对象保存类对象保存 ((7 7)实现数据库之间数据的转换)实现数据库之间数据的转换 9.1.1 C/S9.1.1 C/S体系结构体系结构 92. 2. 数据库可以完成的工作数据库可以完成的工作 数据库是数据库是C/SC/S应用系统的核心,从客户端开发工具来看,它应用系统的核心,从客户端开发工具来看,它的作用主要有:的作用主要有: ((1 1)接收)接收SQLSQL指令,执行指令,执行SQLSQL指令,并将指令的执行结果返回指令,并将指令的执行结果返回给客户端给客户端 ((2 2)查询优化查询优化 ((3 3)事务处理)事务处理 ((4 4)并发处理)并发处理 ((5 5)存取权限管理)存取权限管理 ((6 6)数据库规则)数据库规则9.1.1 C/S9.1.1 C/S体系结构体系结构 10((7 7)相关完整性约束)相关完整性约束((8 8)存储过程)存储过程((9 9)触发器)触发器((1010)视图)视图((1111)序号生成器)序号生成器9.1.1 C/S9.1.1 C/S体系结构体系结构 119.1.1 C/S9.1.1 C/S体系结构体系结构 查询优化查询优化 客户端发出的客户端发出的SQLSQL指令,数据库要先对其进行语法和指令,数据库要先对其进行语法和句法分析,然后进行查询优化。

查询优化分为两类:一类句法分析,然后进行查询优化查询优化分为两类:一类是基于语法的优化,这类优化是根据是基于语法的优化,这类优化是根据SQLSQL语句的写法而进语句的写法而进行的,相同的查询不同的写法会导致完全不同的查询效率行的,相同的查询不同的写法会导致完全不同的查询效率另一类是基于成本的优化,这类优化与另一类是基于成本的优化,这类优化与SQLSQL语句的写法无语句的写法无关,仅与要完成的工作有关基于成本的优化技术降低了关,仅与要完成的工作有关基于成本的优化技术降低了对开发人员的要求,可以使开发人员更专心地解决应用中对开发人员的要求,可以使开发人员更专心地解决应用中的问题 129.1.1 C/S9.1.1 C/S体系结构体系结构事务处理事务处理 数据库的特点是数据的集中管理和共享,在通常情数据库的特点是数据的集中管理和共享,在通常情况下总是有若干个事务并发地运行,这些并行的事务可况下总是有若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据因此,数据库的一个重要任能并发地存取相同的数据因此,数据库的一个重要任务是要有一种机制去保证这种并发的存取和修改不破坏务是要有一种机制去保证这种并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行并取得正确数据的完整性,确保这些事务能正确地运行并取得正确的结果。

的结果 139.1.1 C/S9.1.1 C/S体系结构体系结构并发处理并发处理 若不加控制的话,事务并发执行将导致不正确的结若不加控制的话,事务并发执行将导致不正确的结果和数据库状态的不一致为保证数据库正确地反映所果和数据库状态的不一致为保证数据库正确地反映所有事务的更新,以及在一事务修改数据库中的数据时,有事务的更新,以及在一事务修改数据库中的数据时,其它事务不能同时修改这些数据,数据库必须用锁来控其它事务不能同时修改这些数据,数据库必须用锁来控制对数据的并发存取制对数据的并发存取 并发处理是数据库最重要的问题之一,解决的办法并发处理是数据库最重要的问题之一,解决的办法是加锁大多数数据库都有自动加锁功能当数据库认是加锁大多数数据库都有自动加锁功能当数据库认为必要时,会在相关对象上加上一个适当的锁但自动为必要时,会在相关对象上加上一个适当的锁但自动加锁并不一定都恰当,有时需要编程进行干预加锁并不一定都恰当,有时需要编程进行干预 149.1.1 C/S9.1.1 C/S体系结构体系结构数据库规则数据库规则 规则是加在数据库表列上的约束条件,是在数据库规则是加在数据库表列上的约束条件,是在数据库上设定的。

主要有限制列的取值范围、唯一性、是否上设定的主要有限制列的取值范围、唯一性、是否非空等如果列的输入值不满足约束条件时,则数据非空等如果列的输入值不满足约束条件时,则数据库会给出错误信息,数据库只接收满足约束条件的数库会给出错误信息,数据库只接收满足约束条件的数据 159.1.1 C/S9.1.1 C/S体系结构体系结构触发器触发器 触发器是一种特殊类型的存储过程,它在插入、删触发器是一种特殊类型的存储过程,它在插入、删除或修改特定表中的数据时起作用触发器可以维持表除或修改特定表中的数据时起作用触发器可以维持表间数据的一致性,保证数据的相关完整性触发器的优间数据的一致性,保证数据的相关完整性触发器的优点是不管什么原因造成数据库数据变化时都能自动响应点是不管什么原因造成数据库数据变化时都能自动响应 169.1.1 C/S9.1.1 C/S体系结构体系结构视图视图 视图是一个或多个表中数据的一种表现形式,可将视图是一个或多个表中数据的一种表现形式,可将视图看作为一个移动的窗口,通过它可看到感兴趣的数视图看作为一个移动的窗口,通过它可看到感兴趣的数据视图看起来非常象表,对它的查询和操作与表相同。

据视图看起来非常象表,对它的查询和操作与表相同使用视图有以下使用视图有以下优点:优点:① ① 看到的是所需要的看到的是所需要的视图允许用户集中在他们感兴视图允许用户集中在他们感兴趣的数据或他们负责的数据上进行工作那些对特定用趣的数据或他们负责的数据上进行工作那些对特定用户或与特定工作无关的数据可以被排除在视图之外户或与特定工作无关的数据可以被排除在视图之外② ② 简化数据操作简化数据操作视图不仅可简化用户对数据的理解,视图不仅可简化用户对数据的理解,而且可以简化他们的操作那些被经常使用的查询可以而且可以简化他们的操作那些被经常使用的查询可以定义为视图,从而使用户不必为以后的操作每次指定全定义为视图,从而使用户不必为以后的操作每次指定全部查询条件部查询条件 179.1.1 C/S9.1.1 C/S体系结构体系结构③ ③ 视图允许用户以不同的方式查询同样的数据视图允许用户以不同的方式查询同样的数据④ ④ 安全性通过视图用户只能查询或修改他们所能见到通过视图用户只能查询或修改他们所能见到的数据通过使用视图和有选择的授权,用户可被限制的数据通过使用视图和有选择的授权,用户可被限制在使用数据的不同子集上。

在使用数据的不同子集上⑤ ⑤ 逻辑数据独立性逻辑数据独立性视图可帮助用户屏蔽真实表结构带视图可帮助用户屏蔽真实表结构带来的影响,使应用程序和数据库结构相互独立,互不影来的影响,使应用程序和数据库结构相互独立,互不影响 183 3.. C/SC/S应用系统开发应考虑的问题及解决方案应用系统开发应考虑的问题及解决方案 开发开发C/SC/S应用系统时主要应考虑两个应用系统时主要应考虑两个问题:问题: ((1 1)客户端开发工具主要是应用前台的问题,数据库主要)客户端开发工具主要是应用前台的问题,数据库主要是应用后台的问题由于数据库和客户端开发工具的功能都在是应用后台的问题由于数据库和客户端开发工具的功能都在不断增强,客户端开发工具在向数据库方向上延伸,数据库的不断增强,客户端开发工具在向数据库方向上延伸,数据库的功能在向客户端开发工具方向延伸,一些功能是相互交叉的,功能在向客户端开发工具方向延伸,一些功能是相互交叉的,所以有些问题用客户端开发工具和数据库都能解决对于应用所以有些问题用客户端开发工具和数据库都能解决对于应用中的某些特定问题,使用客户端开发工具还是数据库来解决,中的某些特定问题,使用客户端开发工具还是数据库来解决,用数据库解决该问题的好处是什么,用客户端开发工具的好处用数据库解决该问题的好处是什么,用客户端开发工具的好处又是什么?又是什么? ((2 2)对于非数据库莫属的工作,客户端开发工具表现特征)对于非数据库莫属的工作,客户端开发工具表现特征怎样?客户端开发工具如何针对它们编程?怎样?客户端开发工具如何针对它们编程?9.1.1 C/S9.1.1 C/S体系结构体系结构 19 应用系统开发中的一些应用系统开发中的一些解决方案:解决方案: ((1 1)维护体现企业规则的表间关系可用客户端开发工具编程完成,)维护体现企业规则的表间关系可用客户端开发工具编程完成,也可用数据库触发器来控制。

这种表间的关系是随着企业规章制度的变也可用数据库触发器来控制这种表间的关系是随着企业规章制度的变化而变化的如果用客户端开发工具编程来实现,则程序的维护将是很化而变化的如果用客户端开发工具编程来实现,则程序的维护将是很困难的原则上,此类问题应该用触发器来解决,用触发器来实现具有困难的原则上,此类问题应该用触发器来解决,用触发器来实现具有以下优点:以下优点: ① ① 企业规则可以在数据库中集中控制企业规则可以在数据库中集中控制 ② ② 如果企业规则发生变化,只需修改相应数据库触发器的内容,如果企业规则发生变化,只需修改相应数据库触发器的内容,无需修改客户端应用程序,系统容易维护无需修改客户端应用程序,系统容易维护 ③ ③ 客户端应用程序编程变得更简单客户端应用程序编程变得更简单 ④ ④ 系统运行效率会提高系统运行效率会提高 但过多地滥用触发器反而会使系统的效率降低但过多地滥用触发器反而会使系统的效率降低9.1.1 C/S9.1.1 C/S体系结构体系结构 20 ((2 2)体现企业规则的数据运算可用客户端开发工具编程完)体现企业规则的数据运算可用客户端开发工具编程完成,也要用存储过程完成。

成,也要用存储过程完成 ((3 3)事务是由数据库管理的最小逻辑工作单元,在一个事)事务是由数据库管理的最小逻辑工作单元,在一个事务中所有对数据库的更新操作要么全部成功,要么全部失败务中所有对数据库的更新操作要么全部成功,要么全部失败 ((4 4)并发处理是多人同时更新数据库中相同数据时的处理)并发处理是多人同时更新数据库中相同数据时的处理方式,数据库可以自动加锁,但这种自动加锁方式不一定适合方式,数据库可以自动加锁,但这种自动加锁方式不一定适合实际需要在实际的并发条件下会出现很多难以预料的复杂情实际需要在实际的并发条件下会出现很多难以预料的复杂情况,况,““恰当恰当””地加锁是客户端开发工具的任务,也是一个较难地加锁是客户端开发工具的任务,也是一个较难的问题 ((5 5)序号生成应该由数据库来完成序号生成应该由数据库来完成9.1.1 C/S9.1.1 C/S体系结构体系结构 21 ((6 6)视图是数据库中原始数据的某种变换有时候,)视图是数据库中原始数据的某种变换有时候,这种变换可以用开发工具来完成但视图的许多优良特性这种变换可以用开发工具来完成。

但视图的许多优良特性是客户端开发工具所不具有的哪些工作应由开发工具来是客户端开发工具所不具有的哪些工作应由开发工具来完成,哪些工作应由视图来完成,是数据库设计人员和开完成,哪些工作应由视图来完成,是数据库设计人员和开发人员要认真研究的问题发人员要认真研究的问题 ((7 7)数据库表列的约束既可以在数据库中完成,又可)数据库表列的约束既可以在数据库中完成,又可使用开发工具编程实现在这一点上它们功能完全重叠,使用开发工具编程实现在这一点上它们功能完全重叠,但它们的特性差异较大但它们的特性差异较大在数据库中定义的约束条件只有在数据库中定义的约束条件只有把数据送到数据库时才起作用,屏幕上录入数据正确与否,把数据送到数据库时才起作用,屏幕上录入数据正确与否,数据库无法在录入时知道而在开发工具中定义的约束只数据库无法在录入时知道而在开发工具中定义的约束只有在屏幕录入时才起作用,数据库不管它的对与错因此有在屏幕录入时才起作用,数据库不管它的对与错因此两种约束同样重要哪些约束用数据库完成,哪些约束在两种约束同样重要哪些约束用数据库完成,哪些约束在客户端应用程序完成,哪些约束两种都要做是需要认真研客户端应用程序完成,哪些约束两种都要做是需要认真研究与解决的问题。

究与解决的问题9.1.1 C/S9.1.1 C/S体系结构体系结构 22 分布式应用体系结构将应用系统分为三层:表示层、业务逻辑分布式应用体系结构将应用系统分为三层:表示层、业务逻辑层和数据访问层表示层应用程序安装在客户机上或从网络上下载层和数据访问层表示层应用程序安装在客户机上或从网络上下载到客户机上,它负责用户界面并与用户进行交互数据访问层是数到客户机上,它负责用户界面并与用户进行交互数据访问层是数据源,通常是数据库系统业务逻辑层是指程序中做出智能决策的据源,通常是数据库系统业务逻辑层是指程序中做出智能决策的那一部分功能,业务逻辑层应用程序驻留在应用服务器上,该层也那一部分功能,业务逻辑层应用程序驻留在应用服务器上,该层也称为中间层称为中间层分布式应用程序体系结构有如下分布式应用程序体系结构有如下优点:优点:((1 1)逻辑封装性逻辑封装性 将应用系统划分为不同逻辑块,层次清楚将应用系统划分为不同逻辑块,层次清楚2 2)痩客户机痩客户机 减少甚至消除了传统减少甚至消除了传统C/SC/S体系结构中的体系结构中的““胖客户机胖客户机””的功能负的功能负担,使其消肿为担,使其消肿为““痩客户机痩客户机””。

9.1.2 9.1.2 分布式体系结构分布式体系结构 23((3 3)提高系统性能提高系统性能 将复杂的应用和业务逻辑分离出来并由一台或多台应用服务器进将复杂的应用和业务逻辑分离出来并由一台或多台应用服务器进行处理,不仅可提高应用程序的执行速度,而且可减少网络通信流量行处理,不仅可提高应用程序的执行速度,而且可减少网络通信流量4 4)提高安全性提高安全性 由于所有业务逻辑集中驻留在应用服务器上,系统管理人员可方由于所有业务逻辑集中驻留在应用服务器上,系统管理人员可方便监控服务器的运行状况,容易控制访问服务器和与服务器打交道的便监控服务器的运行状况,容易控制访问服务器和与服务器打交道的人员数量,从而减少系统管理人员管理系统和维护的工作量,确保系人员数量,从而减少系统管理人员管理系统和维护的工作量,确保系统安全可靠地运行统安全可靠地运行5 5)零客户管理工作零客户管理工作 当需要动态改变应用程序的业务逻辑时,只要改变应用服务器的当需要动态改变应用程序的业务逻辑时,只要改变应用服务器的相应应用程序,客户机上的应用程序几乎不需要改变相应应用程序,客户机上的应用程序几乎不需要改变。

9.1.2 9.1.2 分布式体系结构分布式体系结构 24 WEBWEB应用程序体系结构是分布式应用程序体系结构的变应用程序体系结构是分布式应用程序体系结构的变种在此体系结构中,客户端软件是通用的种在此体系结构中,客户端软件是通用的WEBWEB浏览器,应浏览器,应用服务器软件有用服务器软件有WEBWEB服务器和其它逻辑服务器服务器和其它逻辑服务器 在此体系结构中,客户端通过浏览器向在此体系结构中,客户端通过浏览器向WEBWEB服务器发出服务器发出请求,请求,WEBWEB服务器将此请求转换成对其它应用服务器或数据服务器将此请求转换成对其它应用服务器或数据库服务器的请求,当其它应用服务器或数据库服务器返回数库服务器的请求,当其它应用服务器或数据库服务器返回数据给据给WEBWEB服务器后,服务器后,WEBWEB服务器生成数据(网页),并将其传服务器生成数据(网页),并将其传回给客户机上的浏览器详细实现过程我们将在回给客户机上的浏览器详细实现过程我们将在WEBWEB数据库数据库一章中讨论一章中讨论9.1.3 WEB9.1.3 WEB体系结构体系结构 259.2.1 9.2.1 PBPB应用开发流程应用开发流程9.2.2 9.2.2 PBPB对象概述对象概述9.2 PB9.2 PB基础基础 26 在此我们以在此我们以PB8.0PB8.0为例说明为例说明PBPB应用程序开发过程。

应用程序开发过程1 1)系统分析和设计)系统分析和设计 在此阶段主要完成系统需求分析,理解系统要完成的任务在此阶段主要完成系统需求分析,理解系统要完成的任务2 2)建立工作空间)建立工作空间 工作空间(工作空间(WorkspaceWorkspace)是)是PBPB中组织各种开发资源的一个概念,中组织各种开发资源的一个概念,类似于其它高级语言中的工程概念,但又有所不同工作空间是对类似于其它高级语言中的工程概念,但又有所不同工作空间是对软件资源进行管理的有效手段,其作用是方便对各种软件对象进行软件资源进行管理的有效手段,其作用是方便对各种软件对象进行分类管理分类管理3 3)建立应用对象)建立应用对象 要建立应用程序必须在工作空间下建立应用对象要建立应用程序必须在工作空间下建立应用对象((ApplicationApplication)), ,应用对象下管理的是项目的所有软件资源应用对象下管理的是项目的所有软件资源9.2.1 PB9.2.1 PB应用开发流程应用开发流程 27((4 4)建立各种对象)建立各种对象 完整的完整的PBPB应用是由多种对象组合在一起构成的,这应用是由多种对象组合在一起构成的,这些对象包括窗口些对象包括窗口(Window)(Window)、数据窗口、数据窗口(Data window)(Data window)、类、类(Class)(Class)、菜单、菜单(Menu)(Menu)、函数、函数(Function)(Function)等,它们类似于等,它们类似于积木,通过积木,通过Power ScriptPower Script语言将这些对象组合起来就构语言将这些对象组合起来就构成了一个完整的成了一个完整的PBPB应用程序。

应用程序5 5)编写事件处理程序)编写事件处理程序 在各种对象设计完成后,需要使用在各种对象设计完成后,需要使用Power ScriptPower Script编编写对象或控件的事件处理程序,在这些程序中可嵌入标写对象或控件的事件处理程序,在这些程序中可嵌入标准准SQLSQL语句,从而实现对数据库的操作语句,从而实现对数据库的操作9.2.1 PB9.2.1 PB应用开发流程应用开发流程 28((6 6)运行调试)运行调试 通过上述步骤设计的应用程序,要经过不断的运行通过上述步骤设计的应用程序,要经过不断的运行调试、查找错误,最后运行成功后才打包生成可执行文调试、查找错误,最后运行成功后才打包生成可执行文件7 7)打包生成可执行程序)打包生成可执行程序 利用利用PBPB提供的打包功能,生成并发布应用程序,脱提供的打包功能,生成并发布应用程序,脱离离PBPB环境独立运行环境独立运行9.2.1 PB9.2.1 PB应用开发流程应用开发流程 291. 1. 对象、属性和事件对象、属性和事件 PBPB的对象是由的对象是由PBPB提供的,可用来构造提供的,可用来构造PBPB应用程序的一应用程序的一些部件。

些部件PBPB为这些对象约定了属性(为这些对象约定了属性(propertiesproperties)和事件属性决定了事件的特征,而事件是外部作用于对象上的属性决定了事件的特征,而事件是外部作用于对象上的““动作动作””,这一动作可触发一段程序的执行这一动作可触发一段程序的执行每个每个PBPB对象包含以下组成部分:对象包含以下组成部分: ((1 1)每一个对象都包含一个属性集来描述对象的特)每一个对象都包含一个属性集来描述对象的特征,可以通过程序读取或设置这些属性值征,可以通过程序读取或设置这些属性值 ((2 2)每一对象可有一组相关事件,每一个事件对应)每一对象可有一组相关事件,每一个事件对应一个事件处理程序,当对象指定事件发生时就会触发相应一个事件处理程序,当对象指定事件发生时就会触发相应事件的处理程序事件的处理程序9.2.2 PB9.2.2 PB对象概述对象概述 309.2.2 PB9.2.2 PB对象概述对象概述 ((3 3)每一对象可有若干个函数供对象中的脚本)每一对象可有若干个函数供对象中的脚本((ScriptScript)调用 ((4 4)每个对象可有若干结构。

每个对象可有若干结构 ((5 5)每一对象可以有若干脚本代码,每一段脚本代)每一对象可以有若干脚本代码,每一段脚本代码与对象的某一事件相对应,对应事件发生时自动执行码与对象的某一事件相对应,对应事件发生时自动执行其脚本代码脚本代码也称为事件处理函数或事件处理其脚本代码脚本代码也称为事件处理函数或事件处理程序 开发人员可以为对象的属性指定特定的值,为对象开发人员可以为对象的属性指定特定的值,为对象或控件的事件编写特定的程序,也可为对象定义新的事或控件的事件编写特定的程序,也可为对象定义新的事件(即用户自定义事件)当对象的事件发生时,将驱件(即用户自定义事件)当对象的事件发生时,将驱动一特定的程序段完成其操作,因此在学习动一特定的程序段完成其操作,因此在学习PBPB时我们应时我们应该了解对象的事件何时触发、事件触发的先后顺序等该了解对象的事件何时触发、事件触发的先后顺序等 319.2.2 PB9.2.2 PB对象概述对象概述 2. PB2. PB库文件库文件 PBPB的所有对象存储在的所有对象存储在PBPB的库文件(扩展名为的库文件(扩展名为PBLPBL)中。

中一个一个PBPB的应用程序有一个或多个库文件在建立的应用程序有一个或多个库文件在建立PBPB应用对应用对象时系统会提示开发者指定一个文件名当象时系统会提示开发者指定一个文件名当PBPB库文件过大库文件过大时会影响应用程序的执行效率,我们可以建立新的库文件,时会影响应用程序的执行效率,我们可以建立新的库文件,将将PBPB对象存储在不同的库文件中对象存储在不同的库文件中 建立一个工作空间将产生一个扩展名为建立一个工作空间将产生一个扩展名为PBWPBW的文件,的文件,它记录有关工作空间的信息在一个工作空间中可建立多它记录有关工作空间的信息在一个工作空间中可建立多个目标,每一目标对应于一个扩展名为个目标,每一目标对应于一个扩展名为PBTPBT的文件,其中的文件,其中记录了有关目标的信息每一个目标实际上是一个应用程记录了有关目标的信息每一个目标实际上是一个应用程序,它可对应一个或多个库文件序,它可对应一个或多个库文件 323. 3. 应用对象应用对象 PBPB的应用程序是从应用对象开始执行的应用程序对象定义的应用程序是从应用对象开始执行的应用程序对象定义应用程序的特征,如当前应用的库文件、缺省字体字型等。

应用应用程序的特征,如当前应用的库文件、缺省字体字型等应用对象常使用的事件是对象常使用的事件是OpenOpen事件和事件和CloseClose事件,当执行一个应用程事件,当执行一个应用程序时,应用对象的序时,应用对象的OpenOpen事件被触发,在事件被触发,在OpenOpen事件中必须有一条打事件中必须有一条打开主窗口的语句,还可有一些与数据库连接有关的语句等当用开主窗口的语句,还可有一些与数据库连接有关的语句等当用户结束应用时,应用对象的户结束应用时,应用对象的CloseClose事件被触发,此事件是关闭数事件被触发,此事件是关闭数据库4. 4. 窗口对象窗口对象 窗口是用户和窗口是用户和PBPB应用程序间的主要界面,它可以显示信息,应用程序间的主要界面,它可以显示信息,接收用户的信息,响应用户的操作等窗口由属性、事件和控件接收用户的信息,响应用户的操作等窗口由属性、事件和控件构成其中属性定义了窗口的外形和特征,如窗口的大小、标题构成其中属性定义了窗口的外形和特征,如窗口的大小、标题等最常用的事件是等最常用的事件是Open Open 和和CloseClose事件控件是窗口用来控制应事件。

控件是窗口用来控制应用的部件,如命令按钮用的部件,如命令按钮9.2.2 PB9.2.2 PB对象概述对象概述 335. 5. 数据窗口对象数据窗口对象 数据窗口对象用于数据库或其它数据源的数据检索和数数据窗口对象用于数据库或其它数据源的数据检索和数据操作它可根据用户的需求设计成不同的显示风格,也可据操作它可根据用户的需求设计成不同的显示风格,也可以对每一列定义显示格式、编辑格式和合法性检验规则等以对每一列定义显示格式、编辑格式和合法性检验规则等 数据窗口的数据源可以是表、视图、存储过程或外部数数据窗口的数据源可以是表、视图、存储过程或外部数据一个窗口可以有多个数据窗口,不同的数据窗口可以对据一个窗口可以有多个数据窗口,不同的数据窗口可以对应不同的数据源甚至不同的数据库系统应不同的数据源甚至不同的数据库系统6. 6. 查询对象查询对象 一个查询(一个查询(QueryQuery)是用一个名字保存的一条)是用一个名字保存的一条SelectSelect语句,语句,使其可以重复用于数据窗口对象的数据源由于查询可以一使其可以重复用于数据窗口对象的数据源。

由于查询可以一次编码,重复使用,因此使用它可提高开发效率次编码,重复使用,因此使用它可提高开发效率9.2.2 PB9.2.2 PB对象概述对象概述 347.7.菜单对象菜单对象 菜单是用户操作应用程序的主要界面或工具用户通过选择菜菜单是用户操作应用程序的主要界面或工具用户通过选择菜单项可执行相关的命令或任务开发者可为用户定制菜单,为菜单单项可执行相关的命令或任务开发者可为用户定制菜单,为菜单项定义快捷键或图标项定义快捷键或图标 PBPB定制的菜单类似于定制的菜单类似于WordWord的菜单,它可分为多个层次,一个菜的菜单,它可分为多个层次,一个菜单项可弹出一个下拉式菜单,一个下拉式菜单项又可弹出一个级联单项可弹出一个下拉式菜单,一个下拉式菜单项又可弹出一个级联菜单等8.8.用户对象用户对象 在在PBPB应用程序中,有一些对象具有类似的特征并重复出现或使应用程序中,有一些对象具有类似的特征并重复出现或使用时,我们可以定义用户对象(用时,我们可以定义用户对象(User objectUser object)用户对象一经定义,)用户对象一经定义,就和就和PBPB自身对象一样使用。

自身对象一样使用 PBPB有两类用户对象:可视用户对象和类用户对象有两类用户对象:可视用户对象和类用户对象 9.2.2 PB9.2.2 PB对象概述对象概述 359.9.工程对象工程对象 建立可执行程序、动态连接库或其它系统应用的组件时建立可执行程序、动态连接库或其它系统应用的组件时需要建立工程需要建立工程(Project)(Project)对象 PBPB允许在可执行文件或动态连接库中包含附加资源(如允许在可执行文件或动态连接库中包含附加资源(如位图和图标等),也可将附加资源单独分发位图和图标等),也可将附加资源单独分发10.10.函数函数 PBPB可以定义两种类型的函数:可以定义两种类型的函数: ((1 1)对象级函数为指定对象定义的函数,这类函数封装)对象级函数为指定对象定义的函数,这类函数封装在指定对象之内,如窗口函数在指定对象之内,如窗口函数 ((2 2)全局函数它不封装在其它对象之内,而是作为独立)全局函数它不封装在其它对象之内,而是作为独立的对象存储这些函数主要是一些通用的函数,如数学运算的对象存储这些函数主要是一些通用的函数,如数学运算函数。

函数9.2.2 PB9.2.2 PB对象概述对象概述 3611.11.结构结构 结构(结构(StructureStructure)对象类似于)对象类似于C C语言中的结构,是由语言中的结构,是由一个或多个相关的变量构成,这些变量可以有相同或不一个或多个相关的变量构成,这些变量可以有相同或不同的变量类型使用结构可以将一组相关的数据项作为同的变量类型使用结构可以将一组相关的数据项作为一个数据实体来处理一个数据实体来处理PBPB有两类结构:有两类结构: ((1 1)对象级结构它是与特定对象相关的结构,这些)对象级结构它是与特定对象相关的结构,这些结构可用于对象自己的程序代码中,也可以被其它对象结构可用于对象自己的程序代码中,也可以被其它对象的程序引用的程序引用 ((2 2)全局结构它不与任何对象有关,可以在应用程)全局结构它不与任何对象有关,可以在应用程序的任何程序代码中说明结构实例和对此结构进行引用序的任何程序代码中说明结构实例和对此结构进行引用9.2.2 PB9.2.2 PB对象概述对象概述 37 PBPB通过两类数据库接口软件与不同的数据库相连,通过两类数据库接口软件与不同的数据库相连,即通用的即通用的ODBCODBC((Open Database ConnectivityOpen Database Connectivity)接口软)接口软件与专用的数据库接口软件。

件与专用的数据库接口软件ODBCODBC开放式数据库互接标开放式数据库互接标准接口允许应用存取以准接口允许应用存取以SQLSQL做为查询语言的数据库管理系做为查询语言的数据库管理系统,统,PBPB提供了到提供了到ODBCODBC的接口软件,通过这一接口软件,的接口软件,通过这一接口软件,PBPB可以连接到任何支持可以连接到任何支持ODBCODBC的数据库上专用接口软件的数据库上专用接口软件是专为某种数据库设计,通过更换是专为某种数据库设计,通过更换PBPB到数据库的接口软到数据库的接口软件以及数据库到网络的接口软件,可以使件以及数据库到网络的接口软件,可以使PBPB连接到不同连接到不同的数据库上,与不同的数据库构成客户的数据库上,与不同的数据库构成客户/ /服务器体系结构服务器体系结构的客户端或的客户端或B/SB/S模式的模式的WEBWEB服务器端服务器端9.3 PB9.3 PB与数据库接口与数据库接口 38 9.3.1 ODBC9.3.1 ODBC9.3.2 PB9.3.2 PB中中ODBCODBC数据源及数据库连接参数的数据源及数据库连接参数的配置配置9.3.3 PB9.3.3 PB与与OracleOracle连接连接9.3.4 9.3.4 应用程序与应用程序与OracleOracle数据库连接数据库连接9.3 PB9.3 PB与数据库接口与数据库接口 39 ODBCODBC是一种访问数据库的统一界面,已被数据库界广泛是一种访问数据库的统一界面,已被数据库界广泛接受和采用。

从逻辑上看,接受和采用从逻辑上看,ODBCODBC由两部分组成:由两部分组成: ((1 1)一部分是连接客户端的标准客户端界面从客户端)一部分是连接客户端的标准客户端界面从客户端的角度的角度ODBCODBC遵守共同的标准,这使得不同的开发工具连接和遵守共同的标准,这使得不同的开发工具连接和使用数据库的方式是一样的,也使得使用不同的数据库管理使用数据库的方式是一样的,也使得使用不同的数据库管理系统的方式也一样系统的方式也一样 ((2 2)另一部分是连接专门的数据库管理系统的服务器端)另一部分是连接专门的数据库管理系统的服务器端界面或驱动程序界面或驱动程序 ODBCODBC实际上是一个访问数据库的函数库,应用程序可以实际上是一个访问数据库的函数库,应用程序可以通过该函数库直接操作数据库中的数据另外通过该函数库直接操作数据库中的数据另外ODBCODBC是基于是基于SQLSQL语言的,所以语言的,所以ODBCODBC是是SQLSQL与应用程序之间的标准接口与应用程序之间的标准接口9.3.1 ODBC9.3.1 ODBC 40 ODBCODBC由应用程序、驱动程序管理器、驱动程序和数由应用程序、驱动程序管理器、驱动程序和数据源构成。

其中应用程序通过据源构成其中应用程序通过ODBCODBC函数完成对数据库的函数完成对数据库的访问操作,其功能包括:访问操作,其功能包括: ((1 1)请求对数据源的连接,获取连接句柄请求对数据源的连接,获取连接句柄 ((2 2)指定事务控制方式指定事务控制方式 ((3 3)定义接收结果的数据区定义接收结果的数据区 ((4 4)向数据源发送)向数据源发送SQLSQL语句 ((5 5)接收)接收SQLSQL语句的查询结果语句的查询结果 ((6 6)处理出错信息,并将出错信息返回给应用程序处理出错信息,并将出错信息返回给应用程序 ((7 7)结束对数据源的连接结束对数据源的连接9.3.1 ODBC9.3.1 ODBC 41 驱动程序管理器负责对驱动程序管理器负责对ODBCODBC的驱动程序和数据源进的驱动程序和数据源进行管理,其功能包括:行管理,其功能包括: ((1 1)安装指定的驱动程序安装指定的驱动程序 ((2 2)定义数据源,并在)定义数据源,并在ODBC.INIODBC.INI文件中把数据源映文件中把数据源映射到具体的射到具体的ODBCODBC驱动程序上。

驱动程序上 ((3 3)为每一驱动程序提供)为每一驱动程序提供ODBCODBC函数的入口点函数的入口点 ((4 4)为)为ODBCODBC调用提供参数验证等调用提供参数验证等9.3.1 ODBC9.3.1 ODBC 42 驱动程序是真正实现驱动程序是真正实现ODBCODBC函数调用和访问数据库的函数调用和访问数据库的动态连接函数库,对不同的数据库有不同的驱动程序动态连接函数库,对不同的数据库有不同的驱动程序一般情况驱动程序由数据库厂商提供驱动程序的功能一般情况驱动程序由数据库厂商提供驱动程序的功能为:为: ((1 1)建立与数据源的连接建立与数据源的连接 ((2 2)向数据源提交)向数据源提交SQLSQL请求 ((3 3)处理查询结果处理查询结果 ((4 4)将数据源错误转换为标准错误代码,并返回给)将数据源错误转换为标准错误代码,并返回给应用程序应用程序 ((5 5)提交事务的开始请求、完成请求和撤消请求等提交事务的开始请求、完成请求和撤消请求等9.3.1 ODBC9.3.1 ODBC 43 数据源是通过数据源是通过ODBCODBC连接的关系数据库。

连接的关系数据库 ODBCODBC是通过驱动程序来保证数据库的独立性,而驱是通过驱动程序来保证数据库的独立性,而驱动程序则是一个用以支持动程序则是一个用以支持ODBCODBC函数调用的模块,应用程函数调用的模块,应用程序通过调用驱动程序所支持的函数来操纵数据库通过序通过调用驱动程序所支持的函数来操纵数据库通过建立不同的数据源,可以对不同的数据库进行操作建立不同的数据源,可以对不同的数据库进行操作9.3.1 ODBC9.3.1 ODBC 441.1.定义数据源定义数据源 不管是在不管是在PBPB下操作数据库,还是在应用程序中使用下操作数据库,还是在应用程序中使用数据库,如果通过数据库,如果通过ODBCODBC连接数据库,则必须首先定义数连接数据库,则必须首先定义数据源(据源(DSNDSN)我们也可通过)我们也可通过PBPB的数据库配置文件的数据库配置文件((Database ProfilesDatabase Profiles)对话框调用)对话框调用ODBCODBC管理程序来实现管理程序来实现其方法如下:单击其方法如下:单击PBPB的的DB profileDB profile工具按钮,展开工具按钮,展开ODBCODBC,选择,选择UtilitiesUtilities,双击,双击ODBC administrator ODBC administrator 调用调用ODBCODBC管理程序,点击管理程序,点击““用户用户DSNDSN””标签页,单击标签页,单击““添加添加””命令命令按钮,选取所使用的数据库的驱动程序,按按钮,选取所使用的数据库的驱动程序,按““完成完成””命命令按钮,指定令按钮,指定ODBCODBC标签页下的标签页下的Data source nameData source name(数据(数据源名)源名) 和和DatabaseDatabase标签页下的标签页下的Database fileDatabase file(数据库(数据库文件名)和其它一些参数。

文件名)和其它一些参数9.3.2 PB9.3.2 PB中中ODBCODBC数据源及数据库连接参数的配置数据源及数据库连接参数的配置 452.2.数据库连接参数的配置数据库连接参数的配置 在在PBPB下操作库,必须对数据库的连接参数进行配置其下操作库,必须对数据库的连接参数进行配置其方法如下:方法如下: ((1 1)单击)单击PBPB的的DB profileDB profile工具按钮工具按钮 ((2 2)选取数据驱动程序,在此选择)选取数据驱动程序,在此选择ODBCODBC ((3 3)对)对ConnectionConnection标签页下指定参数:标签页下指定参数:Profile nameProfile name( (配置文件名配置文件名) )、、Data source(Data source(数据源名称,在数据源名称,在1 1中定义的数中定义的数据源名称据源名称) )、、user nameuser name(用户名)、(用户名)、password(password(口令口令) ) 一些数据库如一些数据库如Oracle Oracle ,我们可使用专用接口,只要对,我们可使用专用接口,只要对数据库连接参数进行配置,而不要定义数据源。

数据库连接参数进行配置,而不要定义数据源9.3.2 PB9.3.2 PB中中ODBCODBC数据源及数据库连接参数的配置数据源及数据库连接参数的配置 46 由于使用专用接口的查询速度要比使用由于使用专用接口的查询速度要比使用ODBCODBC接口快得多,在应用接口快得多,在应用系统中应采用系统中应采用OracleOracle专用接口专用接口PBPB中中OracleOracle接口的使用方法如下:接口的使用方法如下: ((1 1)在客户机上安装)在客户机上安装OracleOracle客户端软件,并利用客户端软件,并利用OracleOracle的的Net Net Configuration AssistantConfiguration Assistant配置客户端,假定数据库的连接描述符配置客户端,假定数据库的连接描述符(数据库别名)为(数据库别名)为WZWZ ((2 2)单击)单击PBPB的的DB profileDB profile工具按钮工具按钮 ((3 3)选取数据驱动程序,在此选择)选取数据驱动程序,在此选择OracleOracle。

((4 4)对)对ConnectionConnection标签页下指定参数:标签页下指定参数:Profile name(Profile name(配置文件配置文件名名) )、、DatabaseDatabase、、ServernameServername、、Login IDLogin ID(用户名)、(用户名)、password(password(口令口令) )其中Database=Database=””WZWZ””,,servernameservername可设置为可设置为““@ @TNS:WZ.worldTNS:WZ.world””或或““@:@:WZ.worldWZ.world””或或““WZ.worldWZ.world””,, Login IDLogin ID为为““WZZKWZZK””,,PasswordPassword为为““WZZKADMIWZZKADMI””9.3.3 PB9.3.3 PB与与OracleOracle连接连接 47 PBPB应用程序要访问数据库必须向数据库服务器提供合法的登应用程序要访问数据库必须向数据库服务器提供合法的登录信息并进行登录。

录信息并进行登录PBPB的数据库连接是建立与某台数据库服务器的数据库连接是建立与某台数据库服务器上数据库的可靠通信,以传递和提交用户的数据库操作请求上数据库的可靠通信,以传递和提交用户的数据库操作请求PBPB利用事务对象管理数据库的连接利用事务对象管理数据库的连接1 1.事务对象及其建立.事务对象及其建立 事务对象是事务对象是PBPB的不可视对象,对象类型为的不可视对象,对象类型为transactiontransactionSQLCASQLCA((SQL Communications AreaSQL Communications Area)是一个事务对象实例,它是)是一个事务对象实例,它是PBPB预定义的一个全局事务对象,用来管理开发期间的数据库连接预定义的一个全局事务对象,用来管理开发期间的数据库连接参数的配置文件,以便参数的配置文件,以便PBPB与数据库服务器进行交互同时我们也与数据库服务器进行交互同时我们也可以在应用程序中自己定义事务对象,其方法如下:可以在应用程序中自己定义事务对象,其方法如下: ((1 1)用)用transactiontransaction类型说明事务对象变量。

类型说明事务对象变量 ((2 2)用)用CREATE CREATE 语句建立对象实例语句建立对象实例9.3.4 9.3.4 应用程序与应用程序与OracleOracle数据库连接数据库连接 48 ((3 3)设置连接参数并建立连接设置连接参数并建立连接 ((4 4)利用事务变量进行数据库操作利用事务变量进行数据库操作 ((5 5)用)用DESTROYDESTROY语句清除事务对象变量语句清除事务对象变量例例9-1 建立事务对象建立事务对象myoracle transaction myoracle//定义事务对象变量定义事务对象变量 myoracle=CREATE transaction//建立事务对象实例建立事务对象实例 myoracle.DBMS=”O91 ORACLE9i” myoracle.Database=”WZ”//数据库别名数据库别名 myoracle.Userid=”wzzk”//用户名用户名 9.3.4 9.3.4 应用程序与应用程序与OracleOracle数据库连接数据库连接 499.3.4 9.3.4 应用程序与应用程序与OracleOracle数据库连接数据库连接 myoracle.Dbpass=”wzzkadmi”//用户口令用户口令 myoracle.Logid=”wzzk”//登录名登录名 myoracle.Logpass=”wzzkadmi”//登录口令登录口令 myoracle.ServerName=”wz.world” myoracle.Autocommit=FALSE myoracle.DBParm=”CommitOnDisconnect=’NO’” connect using myoracle;//通过事务对象与数据库连通过事务对象与数据库连接接如果在如果在PB应用程序中使用应用程序中使用SQLCA,则不需要定义,只,则不需要定义,只需设置连接参数且需设置连接参数且connect命令后的命令后的“using SQLCA”可可省略。

省略 509.3.4 9.3.4 应用程序与应用程序与OracleOracle数据库连接数据库连接2 2.事务对象的使用.事务对象的使用 PBPB的事务对象可在的事务对象可在PBPB脚本的任何地方定义,但在使用脚本的任何地方定义,但在使用时应注意定义的事务对象变量是全局变量、共享变量、实时应注意定义的事务对象变量是全局变量、共享变量、实例变量还是局部变量,因为其作用范围不同例变量还是局部变量,因为其作用范围不同 在执行在执行SQLSQL语句或进行数据窗口操作之前,必须使用语句或进行数据窗口操作之前,必须使用CONNECTCONNECT连接相应数据库连接相应数据库 如果使用自定义的事务对象,在如果使用自定义的事务对象,在SQLSQL语句后面应加上语句后面应加上““Using Using 事务对象变量名事务对象变量名”” 在完成对数据库的操作后,使用在完成对数据库的操作后,使用““DISCONNECT Using DISCONNECT Using 事务对象名事务对象名; ;””断开与数据库的连接,在适当时候应清除事断开与数据库的连接,在适当时候应清除事务对象变量务对象变量 51 每一种编程语言都有自己的约定,每一种编程语言都有自己的约定,PBPB也不例外。

也不例外PowerScriptPowerScript是是PBPB的编程语言,事件处理程序、自定义函的编程语言,事件处理程序、自定义函数等的编写都是使用数等的编写都是使用 PowerScriptPowerScript编写的由于我们已编写的由于我们已学习了一种或几种高级语言(如学习了一种或几种高级语言(如C C语言),在此仅对语言),在此仅对PowerScriptPowerScript作一简单介绍作一简单介绍9 9..4 4 PowerScriptPowerScript 语言介绍语言介绍 529.4.1 9.4.1 PowerScriptPowerScript基本概念基本概念9.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式9.4.3 9.4.3 PowerScriptPowerScript语句语句9.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句9.4.5 9.4.5 函数与事件的调用函数与事件的调用9.4.6 ORACLE9.4.6 ORACLE的存储过程和函数调用的存储过程和函数调用 9 9..4 4 PowerScriptPowerScript 语言介绍语言介绍 531 1.. 空值空值 空值是关系数据库中的一个特殊概念,可以将其认空值是关系数据库中的一个特殊概念,可以将其认为一个特定的值,也可以将其认为不确定的值。

空值不为一个特定的值,也可以将其认为不确定的值空值不是空字符串,也不是数字是空字符串,也不是数字0 0用NULLNULL表示空值表示空值 在在PowerScriptPowerScript中不能用赋值语句对变量赋中不能用赋值语句对变量赋NULLNULL值,值,而应使用函数而应使用函数SetNULLSetNULL()()对变量赋对变量赋NULLNULL也不能将也不能将NULLNULL用用于比较运算,而须使用函数于比较运算,而须使用函数IsNULLIsNULL()()来判断表达式是否来判断表达式是否为为NULLNULL 在在SQLSQL的的INSERTINSERT和和UPDATEUPDATE中可以使用中可以使用NULLNULL将表中字段将表中字段设置为空值设置为空值9.4.1 9.4.1 PowerScriptPowerScript基本概念基本概念 542 2.. 代词代词 PowerScriptPowerScript可以使用代词来引用对象或控件,这样可以使用代词来引用对象或控件,这样可以增加程序代码的通用性可以增加程序代码的通用性PowerScriptPowerScript中的代词有:中的代词有:ParentParent、、ThisThis和和SuperSuper。

1 1)) ParentParent Parent Parent引用当前对象的父对象或包含当前对象的对引用当前对象的父对象或包含当前对象的对象,它可用于窗口中的控件、用户对象的控件和菜单等象,它可用于窗口中的控件、用户对象的控件和菜单等2 2)) ThisThis This This用于引用当前对象自身的属性或事件等它可用于引用当前对象自身的属性或事件等它可用于窗口、用户对象、菜单、应用对象和各种控件等用于窗口、用户对象、菜单、应用对象和各种控件等9.4.1 9.4.1 PowerScriptPowerScript基本概念基本概念 55((3 3))SupperSupper 子对象或控件中的程序可以调用祖先对象或控件中子对象或控件中的程序可以调用祖先对象或控件中的程序,可以直接使用祖先的名称调用,也可使用代词的程序,可以直接使用祖先的名称调用,也可使用代词SupperSupper来调用这里所说的子对象与祖先对象是有继承来调用这里所说的子对象与祖先对象是有继承关系的两个对象关系的两个对象调用祖先对象函数的格式为:调用祖先对象函数的格式为:Supper::Supper::函数名(参数)函数名(参数)调用祖先对象事件的格式为:调用祖先对象事件的格式为:Call Supper::Call Supper::事件名事件名或:或:Supper::eventSupper::event( (事件名事件名) )9.4.1 9.4.1 PowerScriptPowerScript基本概念基本概念 56 常量、变量、函数和表达式是所有程序设计语言的常量、变量、函数和表达式是所有程序设计语言的重要组成部分,在此只介绍重要组成部分,在此只介绍PowerScriptPowerScript的特殊部分。

的特殊部分1 1.数据类型.数据类型 PowerScriptPowerScript的数据类型可分为标准数据类型、可变的数据类型可分为标准数据类型、可变数据类型、系统对象数据类型和枚举数据类型数据类型、系统对象数据类型和枚举数据类型 ((1 1)标准数据类型)标准数据类型 标准数据类型是我们在高级程序设计语言中所熟悉标准数据类型是我们在高级程序设计语言中所熟悉的数据类型,如的数据类型,如CharChar、、IntInt,在此不作介绍在此不作介绍 ((2 2)可变数据类型)可变数据类型 可变数据类型(可变数据类型(AnyAny类型)变量可以保存任意数据类类型)变量可以保存任意数据类型的值可用赋值语句给型的值可用赋值语句给AnyAny类型的变量赋值,赋值后,类型的变量赋值,赋值后,变量类型也随之变化变量类型也随之变化9.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式 57((3 3)系统对象数据类型)系统对象数据类型 系统对象数据类型是系统对象数据类型是PowerScriptPowerScript的一种特殊类型。

的一种特殊类型在在PBPB中窗口、菜单、各种控件都是系统对象有时为建中窗口、菜单、各种控件都是系统对象有时为建立系统对象的不同实例,需要定义具有系统对象数据类立系统对象的不同实例,需要定义具有系统对象数据类型的变量型的变量4 4)枚举数据类型)枚举数据类型 枚举数据类型常用作函数参数或指定对象或控件的枚举数据类型常用作函数参数或指定对象或控件的属性即在属性即在PBPB中有些函数的参数、对象或控件的属性是中有些函数的参数、对象或控件的属性是枚举数据类型的枚举数据类型的 应当注意的是用户不能定义枚举数据类型的变量,应当注意的是用户不能定义枚举数据类型的变量,且在每一枚举值之后应加上且在每一枚举值之后应加上““!!””9.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式 582 2.常量.常量 常量的使用与我们所学过的高级语言类似,在此仅常量的使用与我们所学过的高级语言类似,在此仅介绍符号常量的定义符号常量是将一个标识符说明为介绍符号常量的定义符号常量是将一个标识符说明为一个常量,它的作用主要是用来提高程序的可读性和可一个常量,它的作用主要是用来提高程序的可读性和可移植性。

其格式为:移植性其格式为: CONSTANT [CONSTANT [权限权限] ] 类型类型 常量名常量名= =常量值常量值 或:或:[ [权限权限] CONSTANT ] CONSTANT 类型类型 常量名常量名= =常量值常量值 其中权限为其中权限为PRIVATE(PRIVATE(私有私有) )、、 PROTECTEDPROTECTED(保护)和(保护)和PUBLICPUBLIC(公共)例如:说明例如:说明pi是一个公共常量的语句为:是一个公共常量的语句为:CONSTANT PUBLIC REAL pi=3.141599.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式 593 3.变量.变量((1 1)全局变量)全局变量 在整个应用程序内有效,它独立于任何对象可以在整个应用程序内有效,它独立于任何对象可以在窗口、用户对象、菜单或其它对象的脚本中定义全局在窗口、用户对象、菜单或其它对象的脚本中定义全局变量2 2)) 实例变量实例变量 属于定义它的对象并与该对象的一个实例有关,可属于定义它的对象并与该对象的一个实例有关,可以将其看作对象的一个属性。

实例变量与定义它的对象以将其看作对象的一个属性实例变量与定义它的对象实例同时建立和撤消实例同时建立和撤消9.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式 60((3 3)共享变量)共享变量 属于定义它的对象并在这个对象的所有实例中引用属于定义它的对象并在这个对象的所有实例中引用共享变量在定义它的对象关闭时并不撤消,其值保持不共享变量在定义它的对象关闭时并不撤消,其值保持不变,再次打开该对象可继续使用该值共享变量只能在变,再次打开该对象可继续使用该值共享变量只能在定义它的对象脚本中引用可以在窗口中、用户对象、定义它的对象脚本中引用可以在窗口中、用户对象、菜单或应用对象中定义共享变量菜单或应用对象中定义共享变量4 4)局部变量)局部变量 局部变量在使用它的事件处理函数或自定义函数中局部变量在使用它的事件处理函数或自定义函数中说明程序段内只能引用在其内部定义的局部变量程序段内只能引用在其内部定义的局部变量局部变量在定义它的脚本中执行时建立,在脚本执行完成部变量在定义它的脚本中执行时建立,在脚本执行完成后立即释放后立即释放9.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式 61 PowerScriptPowerScript中的函数分为内部函数、用户自定义函中的函数分为内部函数、用户自定义函数、外部函数和远程过程调用(数、外部函数和远程过程调用(Remote procedure Remote procedure call,call,简称为简称为RPCRPC)。

内部函数由系统函数和对象函数组成,系统函数与内部函数由系统函数和对象函数组成,系统函数与任何对象无关的并由任何对象无关的并由PowerScriptPowerScript提供,这些函数完成一提供,这些函数完成一些公共的计算和处理功能些公共的计算和处理功能 用户自定义函数是用户根据需要定义的函数,用户用户自定义函数是用户根据需要定义的函数,用户可定义全局函数,也可定义对象函数可定义全局函数,也可定义对象函数 外部函数是指使用其它语言编写并保存在动态链接外部函数是指使用其它语言编写并保存在动态链接库中的函数,在使用外部函数时必须进行说明库中的函数,在使用外部函数时必须进行说明 系统函数的调用与其它高级语言函数的调用一致系统函数的调用与其它高级语言函数的调用一致对象函数的调用格式为:对象函数的调用格式为:对象名对象名. .函数名(参数值表)函数名(参数值表)9.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式 625 5.表达式.表达式 表达式是由常量、变量、函数和运算符等构成的表达式是由常量、变量、函数和运算符等构成的。

PowerScriptPowerScript支持四类运算符:算术运算符、关系运算符、支持四类运算符:算术运算符、关系运算符、逻辑运算符和字符串连接运算符它们的使用与其它高逻辑运算符和字符串连接运算符它们的使用与其它高级语言类似,但应注意的是:减号(级语言类似,但应注意的是:减号(- -),在一般情况下),在一般情况下““- -””被认为是连字符,在表达式中要将被认为是连字符,在表达式中要将““- -””作为减号作为减号来使用时必须在它的前后都加上一个空格来使用时必须在它的前后都加上一个空格9.4.2 9.4.2 常量、变量、函数和表达式常量、变量、函数和表达式 631 1.赋值语句.赋值语句 赋值语句给变量或对象的属性赋值给变量赋值的格式赋值语句给变量或对象的属性赋值给变量赋值的格式为:变量名为:变量名= =表达式给对象的属性赋值的格式为:对象名表达式给对象的属性赋值的格式为:对象名. .属性名属性名= =表达式应当注意的是表达式应当注意的是PowerScriptPowerScript不允许一次给多不允许一次给多个变量或属性赋值同时与个变量或属性赋值同时与C C语言类似,语言类似,PowerScriptPowerScript提供了提供了一些简化的赋值运算符,如一些简化的赋值运算符,如““++++””。

2 2.分支结构.分支结构 PowerScriptPowerScript提供的分支结构有条件语句和多分支语句提供的分支结构有条件语句和多分支语句1 1)条件语句)条件语句条件语句根据特定条件选择执行不同的语句,它分为单行格条件语句根据特定条件选择执行不同的语句,它分为单行格式和多行格式式和多行格式9.4.3 9.4.3 PowerScriptPowerScript语句语句 64 单行格式如下:单行格式如下:IF IF 条件条件 THEN THEN 语句语句1 [ELSE 1 [ELSE 语句语句2 ]2 ] 多行格式:多行格式:IF IF 条件条件1 THEN1 THEN 语句组语句组1 1[ELSEIF [ELSEIF 条件条件2 THEN2 THEN 语句组语句组2 2 …………] ][ELSE[ELSE 语句组语句组] ]END IFEND IF9.4.3 9.4.3 PowerScriptPowerScript语句语句 65((2 2)多分支结构)多分支结构 CHOOSE CASECHOOSE CASE语句是用来进行多分支选择的,其格式如下:语句是用来进行多分支选择的,其格式如下:CHOOSE CASE CHOOSE CASE 表达式表达式 CASE CASE 表达式表达式1 1 语句组语句组1 1 CASE CASE 表达式表达式2 2 语句组语句组2 2 ………… CASE CASE 表达式表达式n n 语句组语句组n n CASE ELSE CASE ELSE 语句组语句组END CHOOSEEND CHOOSE9.4.3 9.4.3 PowerScriptPowerScript语句语句 663 3.循环结构.循环结构 PowerScriptPowerScript的循环语句有的循环语句有5 5种,其格式分别如下:种,其格式分别如下:格式格式1 1:: DO UNTIL DO UNTIL 条件条件 语句组语句组 LOOPLOOP 该语句当条件不成立时执行语句组,直到条件成立时结束循环。

该语句当条件不成立时执行语句组,直到条件成立时结束循环格式格式2 2:: DO DO 语句组语句组 LOOP UNTIL LOOP UNTIL 条件条件该语句先执行语句组,然后检测条件是否成立,若条件不成立继续该语句先执行语句组,然后检测条件是否成立,若条件不成立继续执行语句组,若条件成立,则结束循环执行语句组,若条件成立,则结束循环9.4.3 9.4.3 PowerScriptPowerScript语句语句 67格式格式3 3:: DO WHILE DO WHILE 条件条件 语句组语句组 LOOPLOOP 该语句当条件成立时执行语句组,当条件不成立时结束循环该语句当条件成立时执行语句组,当条件不成立时结束循环格式格式4 DO4 DO 语句组语句组 LOOP WHILE LOOP WHILE 条件条件 该语句先执行语句组,然后检测条件是否成立,若条件成立继该语句先执行语句组,然后检测条件是否成立,若条件成立继续执行语句组,否则结束循环。

续执行语句组,否则结束循环格式格式5 FOR 5 FOR 循环变量循环变量= =初值初值 TO TO 终值终值 [STEP [STEP 步长步长] ] 语句组语句组 NEXTNEXT9.4.3 9.4.3 PowerScriptPowerScript语句语句 684 4..CALLCALL语句语句 CALLCALL语句用于在了对象中调用祖先对象中的函数或事件可语句用于在了对象中调用祖先对象中的函数或事件可以调用菜单、用户对象、窗口等祖先对象中的事件或函数,也可以调用菜单、用户对象、窗口等祖先对象中的事件或函数,也可以调用用户对象或窗口祖先对象中控件的事件其格式如下:以调用用户对象或窗口祖先对象中控件的事件其格式如下: CALL CALL 祖先对象名祖先对象名[`[`控件名控件名] ]::事件名5 5.建立与删除对象实例语句.建立与删除对象实例语句 CREATET CREATET 和和DESTROYDESTROY语句分别用来创建和删除对象实例语句分别用来创建和删除对象实例。

((1 1)) CREATECREATE语句语句 CREATECREATE语句根据指定的对象类型建立一个对象实例,该语句语句根据指定的对象类型建立一个对象实例,该语句的返回结果为存储在同一类型的变量中的对象实例在对象实例的返回结果为存储在同一类型的变量中的对象实例在对象实例被创建后可以引用对象实例的属性被创建后可以引用对象实例的属性9.4.3 9.4.3 PowerScriptPowerScript语句语句 69 该语句有两种格式,一种是静态指定对象类型,另一种是动态该语句有两种格式,一种是静态指定对象类型,另一种是动态指定对象类型它们的格式如下:指定对象类型它们的格式如下:格式格式1 1:对象变量:对象变量=CREATE =CREATE 对象类型对象类型 此语句为对象变量创建一个指定对象类型的对象实例此语句为对象变量创建一个指定对象类型的对象实例格式格式2 2:对象变量:对象变量=CREATE USING =CREATE USING 对象类型字符串对象类型字符串 该语句根据对象字符串中指定的对象类型建立一个对象实例。

该语句根据对象字符串中指定的对象类型建立一个对象实例2 2)) DESTROYDESTROY语句语句 DESTORYDESTORY语句删除由语句删除由CREATECREATE语句建立的对象实例用语句建立的对象实例用CREATECREATE语句语句建立的对象实例在使用完毕后应使用该语句及时释放,使对象实例建立的对象实例在使用完毕后应使用该语句及时释放,使对象实例所占用的内存资源得到重新使用该语句格式为:所占用的内存资源得到重新使用该语句格式为:DESTROY DESTROY 对象变量对象变量9.4.3 9.4.3 PowerScriptPowerScript语句语句 70 在在PBPB应用程序开发过程中,在多数情况下对数据库的操作是应用程序开发过程中,在多数情况下对数据库的操作是通过数据窗口进行的,但数据窗口并不是万能的,有时我们需要通过数据窗口进行的,但数据窗口并不是万能的,有时我们需要利用利用SQLSQL语句对数据库进行操作语句对数据库进行操作PowerScriptPowerScript提供了嵌入式提供了嵌入式SQLSQL语句与动态语句与动态SQLSQL语句。

语句1 1.. 嵌入式嵌入式SQLSQL 在在PowerScriptPowerScript的脚本中可以使用标准的脚本中可以使用标准SQLSQL语句,但在标准语句,但在标准SQLSQL语句的后面应加上语句的后面应加上““USING USING 事务对象名事务对象名 ;;””,如果所使用的,如果所使用的事务对象是事务对象是SQLCASQLCA,则只需在,则只需在SQLSQL语句后加上语句后加上““;;””即可例如连即可例如连接数据库命令为:接数据库命令为:CONNECT USING SQLCACONNECT USING SQLCA;; 如果在如果在SQLSQL语句中使用变量,应在变量之前加上语句中使用变量,应在变量之前加上““::”” 应该注意的是:在应该注意的是:在SQLSQL语句中使用的函数应该是数据库系统语句中使用的函数应该是数据库系统的函数,而不是的函数,而不是PBPB的函数9.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句 712 2.. 动态动态SQLSQL((1 1)既无输入参数、也无结果集的动态)既无输入参数、也无结果集的动态SQLSQL语句语句 该类型该类型SQLSQL语句格式为:语句格式为: EXECUTE IMMEDIATE EXECUTE IMMEDIATE 字符串字符串 [USING [USING 事务对象名事务对象名] ];;((2 2)) 有输入参数、但无结果集的动态有输入参数、但无结果集的动态SQLSQL语句语句 该类型动态该类型动态SQLSQL语句能够处理设计时已经知道语句能够处理设计时已经知道SQLSQL语句的参数语句的参数个数,且该个数,且该SQLSQL语句没有返回值。

它可以在运行时定义参数的数语句没有返回值它可以在运行时定义参数的数据操作语句其格式如下:据操作语句其格式如下: PREPARE PREPARE 动态策略区变量动态策略区变量 FROM FROM 字符串字符串 [USING [USING 事务对象事务对象名名] ];; EXECUTE EXECUTE 动态策略区变量动态策略区变量 USING USING 参数值表参数值表 ;;9.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句 729.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句其中动态策略区(其中动态策略区(DynamicStagingArea)变量是类型为)变量是类型为DynamicStagingArea的对象变量,通常使用的对象变量,通常使用SQLSA,这里,这里动态策略区用于准备动态策略区用于准备SQL语句以及所需参数个数字符串的内语句以及所需参数个数字符串的内容是一有效容是一有效SQL语句,使用语句,使用“??”代表所需参数应该注意参代表所需参数应该注意参数值表中参数值的顺序必须对应于字符串中?的顺序。

数值表中参数值的顺序必须对应于字符串中?的顺序例例9-2 使用动态使用动态SQL语句,删除指定物资编码的记录程序段语句,删除指定物资编码的记录程序段如下:如下:string vwzbm=’010101’PREPARE SQLSA FROM “delete from wzbmb where wzbm=?”;EXECUTE SQLSA USING :vwzbm; 739.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句((3 3)编译时已知道参数和结果集的动态)编译时已知道参数和结果集的动态SQLSQL语句语句该类动态该类动态SQLSQL语句处理参数和结果集在编译时已知的情况语句处理参数和结果集在编译时已知的情况下,它有两种形式:使用游标和使用存储过程下,它有两种形式:使用游标和使用存储过程使用游标形式的语法格式和程序中语句出现次序为:使用游标形式的语法格式和程序中语句出现次序为:DECLARE DECLARE 游标名游标名 DYNAMIC CURSOR FOR DYNAMIC CURSOR FOR 动态策略区变量;动态策略区变量;////说明动态游标说明动态游标PREPARE PREPARE 动态策略区变量动态策略区变量FROM FROM 字符串字符串 [USING [USING 事务对象事务对象名名] ;//] ;//准备动态策略区准备动态策略区OPEN DYNAMIC OPEN DYNAMIC 游标名游标名 [USING [USING 参数值表参数值表] ] ;;////打开动态打开动态游标游标 749.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句FETCH 游标名游标名 INTO 变量表变量表 ;;//读取行数据读取行数据CLOSE 游标名;游标名;//关闭动态游标关闭动态游标使用存储过程形式的语法格式和程序中语句出现次序为:使用存储过程形式的语法格式和程序中语句出现次序为:DECLARE 存储过程名存储过程名 DYNAMIC PROCEDURE FOR 动态策略区变量;动态策略区变量;//说明动态过程说明动态过程PREPARE 动态策略区变量动态策略区变量FROM 字符串字符串 [USING 事务对象名事务对象名] ;//准备动态准备动态策略区策略区EXECUTE DYNAMIC 存储过程名存储过程名 [USING 参数值表参数值表];;//执行动态过程执行动态过程FETCH 存储过程名存储过程名 INTO 变量表变量表 ;;//读取行数据读取行数据CLOSE 存储过程名;存储过程名;//关闭动态过程关闭动态过程其中字符串的内容是一有效其中字符串的内容是一有效SQL语句,如果有变量,变量名前加上语句,如果有变量,变量名前加上“::”,,用用“??”代表参数。

代表参数 759.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句例例9-3 9-3 利用游标方式实现一个带参数的动态查询其程序段如下:利用游标方式实现一个带参数的动态查询其程序段如下:DECLARE DECLARE wzbm_cursorwzbm_cursor DYNAMIC CURSOR FOR SQLSA DYNAMIC CURSOR FOR SQLSA;;String String vwzmcvwzmcString String vwzbmvwzbm= =’’010102010102’’PREPARE SQLSA FROM PREPARE SQLSA FROM ““SELECT SELECT wzmcwzmc from from wzbmbwzbmb where where wzbmwzbm=?=?””; ;OPEN DYNAMIC OPEN DYNAMIC wzbm_cursorwzbm_cursor USING USING ::vwzbmvwzbm ;; FETCH FETCH wzbm_cursorwzbm_cursor INTO INTO ::vwzmcvwzmc ;;CLOSE CLOSE wzbm_cursorwzbm_cursor;;请读者考虑如何使用存储过程方式实现例请读者考虑如何使用存储过程方式实现例9-39-3的功能。

的功能 769.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句((4)不知道参数和结果集的动态)不知道参数和结果集的动态SQL语句语句该类动态该类动态SQL语句能处理在编译时不知道参数和结果集语句能处理在编译时不知道参数和结果集 SQL语句,语句, 它有两种形式:使用游标和使用存储过程它有两种形式:使用游标和使用存储过程使用游标形式的语法格式和程序中语句出现次序为:使用游标形式的语法格式和程序中语句出现次序为:DECLARE 游标名游标名 DYNAMIC CURSOR FOR 动态策略区变量;动态策略区变量; //说明动态游标说明动态游标PREPARE 动态策略区变量动态策略区变量FROM 字符串字符串 [USING 事务对象名事务对象名] ; //准备动态策略区准备动态策略区DESCRIPBE 动态策略区变量动态策略区变量INTO 动态描述区变量;动态描述区变量;OPEN DYNAMIC 游标名游标名 USING DESCRIPTOR 动态描述区变量;动态描述区变量; //打开动态游标打开动态游标FETCH 游标名游标名 USING DESCRIPTOR 动态描述区变量;动态描述区变量; //读取行数据读取行数据CLOSE 游标名;游标名;//关闭动态游标关闭动态游标 779.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句使用存储过程形式的语法格式和程序中语句出现次序为:使用存储过程形式的语法格式和程序中语句出现次序为:DECLARE 存储过程名存储过程名 DYNAMIC PROCEDURE FOR 动动态策略区变量;态策略区变量;//说明动态过程说明动态过程PREPARE 动态策略区变量动态策略区变量FROM 字符串字符串 [USING 事务对象事务对象名名] ;//准备动态策略区准备动态策略区DESCRIPBE 动态策略区变量动态策略区变量INTO 动态描述区变量;动态描述区变量;EXECUTE DYNAMIC 存储过程名存储过程名 USING DESCRIPTOR 动态描述区变量;动态描述区变量;//执行动态过程执行动态过程FETCH 存储过程名存储过程名 USING DESCRIPTOR 动态描述区变动态描述区变量;量;//读取行数据读取行数据CLOSE 存储过程名;存储过程名;//关闭动态过程关闭动态过程 789.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句其中字符串的内容是一有效其中字符串的内容是一有效SQL语句,如果有变量,变量名前加语句,如果有变量,变量名前加上上“::”,, 用用“??”代表参数。

动态描述区变量是类型为代表参数动态描述区变量是类型为DynamicDescriptionArea 的对象变量,可选系统默认的全的对象变量,可选系统默认的全局变量局变量SQLDA通过动态描述区变量的通过动态描述区变量的 四个属性:四个属性:NumInputs、、InParmType、、Numouputs、、OutParmType 可以得到输入参数个数、输入参数类型、输出参数个数、输出参可以得到输入参数个数、输入参数类型、输出参数个数、输出参数类型数类型 的信息,其中的信息,其中InParmType是一个数组,每个元素依是一个数组,每个元素依次对应于次对应于SQL语句中语句中 的一个的一个“??”OutParmType也是一个也是一个数组,每个元素依次对应于一个输数组,每个元素依次对应于一个输 出参数InParmType和和OutParmType的数据类型是枚举数据类型,其的数据类型是枚举数据类型,其 值主要为:值主要为:TypeInteger!、、TypeDecimal!、、TypeDouble!、、TypeLong!、、Typereal!、、TypeUnsignedInteger!、、TypeUnsignedLong!、、TypeBoolean!、、Typestring!、、TypeDate!、、TypeTime!、、TypeDateTime!。

799.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句通过使用该对象变量的函数通过使用该对象变量的函数SetDynamicParm(动态描述区动态描述区变量名,输入参数序号,参数值变量名,输入参数序号,参数值)设置具体的输入参数通设置具体的输入参数通过过GetDynamicNumber()、、GetDynamicString()、、GetDynamicDate、、GetDynamicTime、、GetDynamicDateTime()得到输出参数的值,函数的选择应根据输出参数的数据类得到输出参数的值,函数的选择应根据输出参数的数据类型来确定,这些函数都有两个参数,第一个为动态描述区型来确定,这些函数都有两个参数,第一个为动态描述区变量,第二个为输出参数序号如果该动态变量,第二个为输出参数序号如果该动态SQL语句有输语句有输入参数,应在入参数,应在OPEN DYNAMIC或或EXECUTE DYNAMIC语语句之前利用句之前利用SetDynamicParm()函数设置输入参数值函数设置输入参数值 809.4.4 9.4.4 嵌入式嵌入式SQLSQL与动态与动态SQLSQL语句语句例例9-4 利用游标方式实现有参数的动态查询。

其程序段如下:利用游标方式实现有参数的动态查询其程序段如下:DECLARE wzlk_cursor DYNAMIC CURSOR FOR SQSA;;PREPARE SQLSA FROM “select wzbm from wzlkb where dwbm=?”;DESCRIPBE SQLSA INTO SQLDA;;SetDynamicParm(SQLDA,1,’0101’)OPEN DYNAMIC wzlk_cursor USING DESCRIPTOR SQLDA;;FETCH wzlk_cursor USING DESCRIPTOR SQLDA;;//得到第一条记录得到第一条记录//利用循环语句可得到其它满足条件的记录利用循环语句可得到其它满足条件的记录CLOSE wzlk_cursor;;请读者完成上述程序片段,并利用存储过程方式实现相同的功能请读者完成上述程序片段,并利用存储过程方式实现相同的功能 81 PBPB对象有内置的函数和事件,用户也可以为对象定对象有内置的函数和事件,用户也可以为对象定义用户事件或函数事件(义用户事件或函数事件(EventEvent)是对象或控件内可以)是对象或控件内可以触发一段程序执行的一个动作。

用户可以通过一个动作触发一段程序执行的一个动作用户可以通过一个动作触发某个事件,也可在另一程序段中用语句触发事件触发某个事件,也可在另一程序段中用语句触发事件事件分为用户事件和对象内置事件用户事件是为扩展事件分为用户事件和对象内置事件用户事件是为扩展对象的功能由用户定义的事件,用户可为用户事件定义对象的功能由用户定义的事件,用户可为用户事件定义参数和返回值,用户事件一般通过另一事件中的语句触参数和返回值,用户事件一般通过另一事件中的语句触发内置事件是发内置事件是PBPB系统定义的对象的一部分,它通常是系统定义的对象的一部分,它通常是由用户的动作或系统的信息触发由用户的动作或系统的信息触发 调用函数或事件的格式为:调用函数或事件的格式为:[ [对象名对象名.][.][类型类型] [] [调用方式调用方式] [] [执行方式执行方式] ] 函数或事件函数或事件名(名([ [参数值表参数值表] ]))9.4.5 9.4.5 函数与事件的调用函数与事件的调用 821.1.存储过程的调用存储过程的调用 在在PBPB中调用中调用OracleOracle的存储过程主要分为如下四步:的存储过程主要分为如下四步:① ① 定义一个存储过程变量,其格式如下:定义一个存储过程变量,其格式如下: DECLARE DECLARE procedure_varietyprocedure_variety PROCEDURE FOR PROCEDURE FOR procedure_name(argumentprocedure_name(argument _value1[ _value1[,,argument _value2[argument _value2[,,……]]);]]);参数传递时也可采用名表示法。

参数传递时也可采用名表示法② ② 执行存储过程,其格式为:执行存储过程,其格式为: EXCUTE EXCUTE procedure_varietyprocedure_variety; ;③ ③ 获得存储过程执行后的返回结果集,其格式为:获得存储过程执行后的返回结果集,其格式为: FETCH FETCH procedure_varietyprocedure_variety INTO INTO variety_listvariety_list; ;9.4.6 ORACLE9.4.6 ORACLE的存储过程和函数调用的存储过程和函数调用 83④ ④ 关闭存储过程,其格式为:关闭存储过程,其格式为: CLOSE CLOSE procedure_varietyprocedure_variety; ;例例9-5 调用第调用第8章定义存储过程章定义存储过程Proc_wzbm_back1可设计如下的代码:可设计如下的代码: string vno…… vno=’010201’ declare vproc_wzbm_back1 for proc_wzbm_back1(:vno); execute vproc_wzbm_back1; close vproc_wzbm_back1;……9.4.6 ORACLE9.4.6 ORACLE的存储过程和函数调用的存储过程和函数调用 849.4.6 ORACLE9.4.6 ORACLE的存储过程和函数调用的存储过程和函数调用在上述程序代码中,因为该存储过程没有输出参数,因而没在上述程序代码中,因为该存储过程没有输出参数,因而没有第有第3步。

步在在PB中调用包中存储过程的方法与中调用包中存储过程的方法与PB中调用存储过程方法中调用存储过程方法一致,不同之处是要在存储过程名前加上包名一致,不同之处是要在存储过程名前加上包名2 2..ORACLEORACLE的函数调用的函数调用 在在PBPB中调用中调用OracleOracle的自定义函数时,只能在的自定义函数时,只能在SQLSQL语句中使语句中使用 调用调用f_datef_date函数的函数的SQLSQL命令如下:命令如下: Select Select f_datef_date() into :a from dual;() into :a from dual; 其中其中a a为变量 859.5.1 应用对象的建立应用对象的建立9.5.2 数据窗口设计数据窗口设计9.5.3 窗口设计窗口设计9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计9.5 9.5 数据插入、删除、更新设计数据插入、删除、更新设计 861. 建立工作空间建立工作空间 在在PB8中用工作空间来管理应用程序,一个工作空间中可以建立中用工作空间来管理应用程序,一个工作空间中可以建立多个应用程序,可同时开发和管理多个应用程序。

利用多个应用程序,可同时开发和管理多个应用程序利用PB开发应用开发应用程序的第一步是建立工作空间,其步骤如下:程序的第一步是建立工作空间,其步骤如下: ((1)选择)选择Powerbar上的上的New按钮(或按钮(或File菜单项中的菜单项中的New)打)打开开New对话框;对话框; ((2)选择)选择Workspace标签项中的标签项中的Workspace,按,按OK命令按钮打命令按钮打开开New Workspace对话框,在对话框中选择保存路径、文件名,对话框,在对话框中选择保存路径、文件名,例如我们将文件保存在例如我们将文件保存在D::\WZGL目录,工作空间的文件名为目录,工作空间的文件名为WZGL,单击,单击SAVE命令按钮命令按钮 这样一个工作空间已经建立,在这样一个工作空间已经建立,在D:\WZGL目录下有一个目录下有一个WZGL.PBW的文件以后我们只需使用的文件以后我们只需使用Open按钮(或按钮(或File菜单项菜单项中的中的Open)打开对话框,选择相应路径和文件名即可打开对话框,选择相应路径和文件名即可9.5.1 9.5.1 应用对象的建立应用对象的建立 872.. 建立目标和应用对象建立目标和应用对象 工作空间管理的是目标,每一目标对应一个应用程序,在建立目工作空间管理的是目标,每一目标对应一个应用程序,在建立目标时自动建立一个应用对象,建立目标的步骤为:标时自动建立一个应用对象,建立目标的步骤为:((1)选择)选择Powerbar上的上的New按钮(或按钮(或File菜单项中的菜单项中的New)打开)打开New对话框;对话框;((2)选择)选择Target标签项中的标签项中的Application,按,按OK命令按钮打开命令按钮打开Specify New Application and Library对话框,在对话框中选择应对话框,在对话框中选择应用名、库文件名、目标名,如我们输入应用名为用名、库文件名、目标名,如我们输入应用名为WZCK,其它两项,其它两项自动会加上,单击自动会加上,单击Finish命令按钮。

命令按钮 每一应用程序都有且只有一个应用对象,应用对象是应用程序的每一应用程序都有且只有一个应用对象,应用对象是应用程序的入口以后我们所建立的对象、控件、程序等都存放在入口以后我们所建立的对象、控件、程序等都存放在Wzck.pbl中,中,当然一个应用程序也可以有多个库文件,可以根据选择将不同对象当然一个应用程序也可以有多个库文件,可以根据选择将不同对象放置在不同库文件中放置在不同库文件中9.5.1 9.5.1 应用对象的建立应用对象的建立 88 数据窗口分为数据窗口对象和数据窗口控件,数据窗数据窗口分为数据窗口对象和数据窗口控件,数据窗口对象主要用于展示数据库中数据并允许用户进行增删口对象主要用于展示数据库中数据并允许用户进行增删改操作,数据窗口控件把数据窗口对象放置在窗口上并改操作,数据窗口控件把数据窗口对象放置在窗口上并呈现在用户面前在数据窗口对象中可以定义数据的显呈现在用户面前在数据窗口对象中可以定义数据的显示格式、显示风格和其它数据属性,使数据对用户更直示格式、显示风格和其它数据属性,使数据对用户更直观1.. 数据窗口显示风格数据窗口显示风格 定义数据窗口对象时需要为数据窗口选择显示风格,定义数据窗口对象时需要为数据窗口选择显示风格,它用于定义数据窗口的显示格式和外部特征。

显示风格它用于定义数据窗口的显示格式和外部特征显示风格有多种有多种:9.5.2 9.5.2 数据窗口设计数据窗口设计 89((1))Grid格式格式((2))Tabular格式格式((3))N-UP格式格式((4))Freeform格式格式((5))Label格式格式((6))Group格式格式((7))Crosstab格式格式((8))Graph格式格式((9))Composit格式格式((10))RichText格式格式9.5.2 9.5.2 数据窗口设计数据窗口设计 902.. 数据窗口数据源数据窗口数据源((1)) Quick Select数据源数据源 该数据源所对应的该数据源所对应的SELECT语句由语句由PB自动、快速生成,其自动、快速生成,其中的数据可以来自一个表中的数据可以来自一个表/视图或通过外键关联的多个表视图或通过外键关联的多个表2))SQL Select数据源数据源 该数据源可以使用任意复杂的该数据源可以使用任意复杂的SELECT语句构造数据源语句构造数据源3))Query 数据源数据源 Query数据源是利用在查询画板(数据源是利用在查询画板(Query Painter)中事先)中事先定义的查询对象作为数据源。

定义的查询对象作为数据源9.5.2 9.5.2 数据窗口设计数据窗口设计 91((4))Store Procedure数据源数据源 该数据源是利用存储在数据库中的存储过程来定义数该数据源是利用存储在数据库中的存储过程来定义数据源5))External数据源数据源 该数据源中的数据不是来自数据库,而是来自其它文该数据源中的数据不是来自数据库,而是来自其它文件或应用程序生成的数据件或应用程序生成的数据9.5.2 9.5.2 数据窗口设计数据窗口设计 923.. 数据窗口属性的设置数据窗口属性的设置 在建立数据窗口对象时,选择了数据窗口的显示风格在建立数据窗口对象时,选择了数据窗口的显示风格和数据源后,和数据源后,PB会自动生成一个具有默认属性和特征的会自动生成一个具有默认属性和特征的数据窗口对象,然后需要对一些属性进行设置这些属数据窗口对象,然后需要对一些属性进行设置这些属性包括:数据窗口对象的度量单位、内部定时器、背景性包括:数据窗口对象的度量单位、内部定时器、背景颜色、标题及标题大小、字体、数据窗口的颜色、标题及标题大小、字体、数据窗口的TAB顺序、顺序、数据窗口的更新属性、检索参数等。

其基本方法是利用数据窗口的更新属性、检索参数等其基本方法是利用Properties窗口设置所需属性窗口设置所需属性 同时也可以对数据窗口对象中添加控件,其方法为从同时也可以对数据窗口对象中添加控件,其方法为从Insert菜单中的菜单中的Control菜单中选择所需控件,在适当区菜单中选择所需控件,在适当区域用鼠标可完成控件的初步插入,然后设置其相应属性域用鼠标可完成控件的初步插入,然后设置其相应属性和特征即可和特征即可9.5.2 9.5.2 数据窗口设计数据窗口设计 939.5.2 9.5.2 数据窗口设计数据窗口设计4.. 实例实例 在此我们说明数据窗口在此我们说明数据窗口DW_WZBM和和DW_WZLK的建立过程,其它数的建立过程,其它数据窗口只在使用时作简要说明据窗口只在使用时作简要说明1)在主菜单的)在主菜单的“File”菜单项中选择菜单项中选择“New”或在或在PowerBar中选择图中选择图标标“New”,打开打开New对话框,并选择对话框,并选择“DataWindow”标签页2)从)从“DataWindow”标签页中选择数据窗口风格,在此我们选择标签页中选择数据窗口风格,在此我们选择“Grid”,单击,单击OK按钮。

按钮3)从)从“Choose Data Source For Grid DataWindow”窗口中选择数据窗口中选择数据源,我们在此选择源,我们在此选择“SQL Select”,单击,单击Next按钮4)从)从“SELECT Tables”框中选择表或视图,在此选择表框中选择表或视图,在此选择表WZBMB,单击,单击打开,然后在表中选择要出现在数据窗口中的字段,在此全选打开,然后在表中选择要出现在数据窗口中的字段,在此全选5)单击)单击PowerBar中的中的Return,连续单击两次,连续单击两次Next按钮,再单击按钮,再单击Finish按钮,此时一个初步的数据窗口已经建立按钮,此时一个初步的数据窗口已经建立6)对初步形成的数据窗口的属性和特征进行修饰后,点击)对初步形成的数据窗口的属性和特征进行修饰后,点击Powerbar上上的的Save图标,按提示输入数据窗口名,在此取名为图标,按提示输入数据窗口名,在此取名为DW_WZBM,如图,如图9.1所所示:示: 94 959.5.2 9.5.2 数据窗口设计数据窗口设计 4.. 实例实例 同样我们建立数据窗口同样我们建立数据窗口DW_WZLK,它是建立在四个表上的、自,它是建立在四个表上的、自由格式且带有参数的数据窗口。

其过程如下:由格式且带有参数的数据窗口其过程如下:((1)在主菜单的)在主菜单的“File”菜单项中选择菜单项中选择“New”或在或在PowerBar中中选择图标选择图标“New”,打开打开New对话框,并选择对话框,并选择“DataWindow”标签页2)从)从“DataWindow”标签页中选择数据窗口风格,在此我们选择标签页中选择数据窗口风格,在此我们选择“Freeform”,单击,单击OK按钮3)从)从“Choose Data Source For Grid DataWindow”窗口中选窗口中选择数据源,我们在此选择择数据源,我们在此选择“SQL Select”,单击,单击Next按钮4)从)从“SELECT Tables”框中选择表或视图,在此选择表框中选择表或视图,在此选择表WZLKB、、WZBMB、、WZCKBMB、、DWBMB,单击打开单击打开5)单击)单击PowerBar上的上的Join,建立,建立WZBMB、、WZCKBMB、、DWBMB与与WZLKB的连接,将的连接,将wzlkb表的字段表的字段wzbm与与wzbmb中的中的字段字段wzbm建立连接,将建立连接,将wzlkb表的字段表的字段dwbm与与dwbmb中的字段中的字段dwbm建立连接,将建立连接,将wzlkb表的字段表的字段wzckbm与与wzckbmb中的字段中的字段wzckbm建立连接,再单击建立连接,再单击PowerBar上的上的Join,然后在表中选择,然后在表中选择要出现在数据窗口中的字段。

要出现在数据窗口中的字段 969.5.2 9.5.2 数据窗口设计数据窗口设计4.. 实例实例((6)从菜单)从菜单Design中选择中选择Retrieval arguments,在参,在参数定义窗口中定义两个字符型(数定义窗口中定义两个字符型(String)参数)参数xx、、yy,单,单击击OK7)点击)点击Where标签,在标签,在Column中选择字段名中选择字段名rq,在,在Operator中选择或输入中选择或输入“=”,在,在Value中输入中输入“:xx”,,在在Logical中选择中选择“and”,同样使得参数,同样使得参数yy与字段与字段lkh对对应起来8)单击)单击PowerBar中的中的Return,连续单击两次,连续单击两次Next按按钮,再单击钮,再单击Finish按钮,此时一个初步的数据窗口已经建按钮,此时一个初步的数据窗口已经建立9)对初步形成的数据窗口的属性和特征进行修饰后,)对初步形成的数据窗口的属性和特征进行修饰后,点击点击Powerbar上的上的Save图标,按提示输入数据窗口名,图标,按提示输入数据窗口名,在此取名为在此取名为DW_WZLK,如图,如图9.2所示:所示: 97 98 窗口是窗口是PB应用程序的重要组成部分,是用户与应用程序的重要组成部分,是用户与PB应应用程序之间进行交互的主要界面。

窗口是用户操作应用用程序之间进行交互的主要界面窗口是用户操作应用程序、得到用户所需信息的人机交互接口在窗口中可程序、得到用户所需信息的人机交互接口在窗口中可放置控件,为应用程序和用户提供更强大的功能放置控件,为应用程序和用户提供更强大的功能1.. 窗口的类型窗口的类型 PB提供了提供了6种窗口类型:种窗口类型:Main(主窗口)、(主窗口)、Popup(弹出式窗口弹出式窗口)、、Child(子窗口子窗口)、、Response(响应窗口响应窗口)、、MDI frame(多文档界面窗口)、(多文档界面窗口)、MDI frame with Microhelp(带微帮助的多文档界面窗口带微帮助的多文档界面窗口)在不同情况下在不同情况下选用不同类型的窗口选用不同类型的窗口9.5.3 9.5.3 窗口设计窗口设计 99((1))Main窗口窗口((2))Popup窗口窗口((3))Child窗口窗口((4))Response窗口窗口((5))MDI frame窗口窗口((6))MDI frame with Microhelp窗口窗口9.5.3 9.5.3 窗口设计窗口设计 100 控件是控件是PB应用程序图形界面的重要组成部分,它是系应用程序图形界面的重要组成部分,它是系统预先定义好的可视图形对象,开发人员可将控件添加统预先定义好的可视图形对象,开发人员可将控件添加到窗口上而直接使用它们。

控件并不单独保存,而是与到窗口上而直接使用它们控件并不单独保存,而是与相应窗口一起保存在相应窗口一起保存在PB库文件中用户通过窗口上的控库文件中用户通过窗口上的控件完成所需的操作,应用程序通过控件向用户显示信息件完成所需的操作,应用程序通过控件向用户显示信息 控件按是否响应用户操作可分为两类:一类能够响应控件按是否响应用户操作可分为两类:一类能够响应用户操作,它们具有事件,如命令按钮等;另一类不响用户操作,它们具有事件,如命令按钮等;另一类不响应用户操作,它们没有事件,如绘图控件应用户操作,它们没有事件,如绘图控件9.5.3 9.5.3 窗口设计窗口设计 101 控件按功能可分为控件按功能可分为4类:类:((1)激活动作类型包括命令按钮)激活动作类型包括命令按钮((CommandButton)和图片按钮()和图片按钮(PictureButton)等 ((2)选择类型包括单选按钮()选择类型包括单选按钮(RadioButton)、复选)、复选框(框(CheckBox),还可以用选项组控件(),还可以用选项组控件(GroupBox))对这些选择项控件对行分组对这些选择项控件对行分组。

9.5.3 9.5.3 窗口设计窗口设计 1029.5.3 9.5.3 窗口设计窗口设计((3)显示数据类型包括列表框()显示数据类型包括列表框(ListBox)、图片列)、图片列表框(表框(PictureListBox)、数据窗口()、数据窗口(DataWindow)、)、下拉列表框(下拉列表框(DropDownListBox)、下拉图片列表框)、下拉图片列表框((DropDownPictureListBox)、静态文本框)、静态文本框((StaticText)、图形()、图形(Graph)、列表窗口)、列表窗口((ListView)、树状窗口()、树状窗口(TreeView)、多格式文本框)、多格式文本框((RichTextEdit)、进度条()、进度条(HprogressBar、、VprogressBar)、滚动条()、滚动条(HscrollBar、、VscrollBar)、)、单行编辑框(单行编辑框(SingleLineEdit)、多行编辑框)、多行编辑框((MultiLineEdit)、编辑掩码控件()、编辑掩码控件(EditMask)、)、OLE控件等4)修饰类型为绘图对象,如直线()修饰类型。

为绘图对象,如直线(Line)、矩形)、矩形((Rectangle)、椭圆()、椭圆(Oval)等窗口上控件的使用请参阅帮助文件窗口上控件的使用请参阅帮助文件 1033.. 窗口的设计窗口的设计 设计窗口的过程如下:设计窗口的过程如下:((1)建立窗口)建立窗口 使用工具框的使用工具框的New按钮或菜单按钮或菜单File中的中的New菜单项,菜单项,打开打开New对话框,选择对话框,选择PB Object标签页,双击其中标签页,双击其中Window图标,进入窗口编辑状态图标,进入窗口编辑状态2)设置窗口属性)设置窗口属性 输入窗口标题、选择窗口类型、调整窗口大小等输入窗口标题、选择窗口类型、调整窗口大小等9.5.3 9.5.3 窗口设计窗口设计 104((3)添加控件)添加控件 通过工具框上的控件图标或菜单通过工具框上的控件图标或菜单Insert中的菜单中的菜单Control,将所需控件添加到窗口上,并对控件的属性进,将所需控件添加到窗口上,并对控件的属性进行调整,在数据窗口控件属性中行调整,在数据窗口控件属性中General标签页的标签页的 DataObject编辑框中输入相应数据窗口对象名,以建立编辑框中输入相应数据窗口对象名,以建立与数据窗口对象的联系。

与数据窗口对象的联系4)编写窗口或控件事件的脚本)编写窗口或控件事件的脚本((5)保存窗口保存窗口 如果要对一个已存在的窗口进行修改,只需在(如果要对一个已存在的窗口进行修改,只需在(1)中)中使用工具框的使用工具框的Open按钮或菜单按钮或菜单File中的中的Open菜单项即菜单项即可9.5.3 9.5.3 窗口设计窗口设计 1059.5.3 9.5.3 窗口设计窗口设计4.. 实例实例 按窗口设计方法,在下列两个窗口中添加了按窗口设计方法,在下列两个窗口中添加了4个命令按钮和个命令按钮和一个数据窗口控件,在一个数据窗口控件,在W_WZBM中数据窗口控件的中数据窗口控件的Properties中指定中指定Dataobject 为为Dw_wzbm,,W_WZLK中数中数据窗口控件的据窗口控件的Properties中指定中指定Dataobject 为为Dw_wzlkv两窗口如下图窗口如下图9.3和和9.4所示:所示: 106 107 108 在窗口中常用事件主要为在窗口中常用事件主要为Open、、Close、、CloseQuery、、Timer等Open事件在窗口打开之后、显示之前执行,事件在窗口打开之后、显示之前执行,Close事件在关闭窗口时执行,事件在关闭窗口时执行,CloseQuery事件在关闭窗事件在关闭窗口前执行,口前执行,Timer事件在调用事件在调用Timer()函数启动定时器、设函数启动定时器、设定时间之后触发执行,它可用于定时操作。

定时间之后触发执行,它可用于定时操作 命令按钮常用事件为:命令按钮常用事件为:Clicked、、Getfocus和和Losefocus等Clicked事件在单击该控件时触发,事件在单击该控件时触发,Getfocus在该控件获得焦点前触发,在该控件获得焦点前触发,Losefocus事件在在事件在在该控件失去输入焦点时触发该控件失去输入焦点时触发 数据窗口控件的常用事件有:数据窗口控件的常用事件有:Clicked、、DoubleClicked、、 EditChanged、、ItemChanged、、ItemFocusChanged、、RetrieveEnd、、 RowFocusChanging、、RowFocusChaged、、UpdateStart、、UpdateEnd等9.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计 1099.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计 Clicked在用户单击数据窗口时触发,在用户单击数据窗口时触发,DoubleClicked在在用户双击数据窗口时触发,用户双击数据窗口时触发,EditChanged在编辑数据窗口在编辑数据窗口的数据时触发,的数据时触发,ItemChanged在数据窗口控件的数据项内在数据窗口控件的数据项内容改变并且失去焦点时触发,容改变并且失去焦点时触发,ItemFocusChanged在当前在当前数据项焦点改变时触发,数据项焦点改变时触发,RetrieveEnd在检索完成后触发,在检索完成后触发,RowFocusChanging在焦点行改变时触发,在焦点行改变时触发,RowFocusChanged在焦点行改变后触发,在焦点行改变后触发,UpdateStart在在Update()函数开始执行前触发,函数开始执行前触发,UpdateEnd在在Update()函数开始执行后触发。

函数开始执行后触发 1109.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计1.物资编码录入窗口脚本设计.物资编码录入窗口脚本设计((1))W_WZBM窗口窗口Open 事件脚本事件脚本dw_1.settransobject(sqlca)dw_1.retrieve()其中其中dw_1为窗口中数据窗口控件名,为窗口中数据窗口控件名,settransobject(sqlca)设置与数据窗口控件相关联的事务对象设置与数据窗口控件相关联的事务对象SQLCA,,retrieve()是在数据窗口中检索数据,该函数可带参数,当建立的数据是在数据窗口中检索数据,该函数可带参数,当建立的数据窗口对象带有参数时(如窗口对象带有参数时(如dw_wzlk),该函数应带有相应参),该函数应带有相应参数值 1119.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计((2))“插入插入”按钮(按钮(cb_1)的脚本)的脚本long i,iistring vwzbmi=dw_1.rowcount()//得到数据窗口中数据总行数得到数据窗口中数据总行数ii=iIF i=0 THEN//如果数据窗口中没有数据,则插入一行如果数据窗口中没有数据,则插入一行dw_1.insertrow(0)ii=ii+1ELSE//如果数据窗口中有数据,则判断是否有空行,如果数据窗口中有数据,则判断是否有空行,//如果有一空行,则光标保持不动,否则,插入一行。

如果有一空行,则光标保持不动,否则,插入一行 1129.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计dw_1.setrow(i)vwzbm=dw_1.getitemstring(i,'wzbm')IF isnull(vwzbm) OR vwzbm='' THENii=iELSEdw_1.insertrow(0) ii=ii+1END IFEND IFdw_1.setrow(ii)dw_1.setfocus()//设置焦点设置焦点 1139.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计((3))“删除删除”按钮(按钮(cb_2)的脚本)的脚本long ii=dw_1.getrow()IF i>0 AND i<=dw_1.rowcount() THENdw_1.deleterow(i)//删除第删除第i行行END IF((4))“保存保存”按钮(按钮(cb_3)的脚本)的脚本IF dw_1.update()=1 THEN//判断保存是否成功,若成功,则判断保存是否成功,若成功,则提交,否则,回退到原状态提交,否则,回退到原状态 1149.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计COMMIT;messagebox('!','保存成功!保存成功!')ELSEROLLBACK;messagebox('提示提示','保存不成功!保存不成功!')END IF((5))“退出退出”按钮(按钮(cb_4)的脚本)的脚本close(parent)//关闭当前窗口关闭当前窗口 1159.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计2.. 物资出库单窗口设计物资出库单窗口设计((1))W_WZLK窗口窗口Open 事件脚本事件脚本dw_1.settransobject(sqlca)dw_1.retrieve('99999999','0000')//按参数检索,设置检索参按参数检索,设置检索参数,使其不能检索出数据。

数,使其不能检索出数据2)) 插入、删除、保存和退出的按钮脚本插入、删除、保存和退出的按钮脚本与物资录入编码窗口对应按钮的脚本相同与物资录入编码窗口对应按钮的脚本相同 1169.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计((3)数据窗口对象)数据窗口对象dw_1的的itemchanged的脚本的脚本//该事件脚本实现当输入编码时,显示与编码有关的项,该事件脚本实现当输入编码时,显示与编码有关的项,同时进行一些简单的计算同时进行一些简单的计算long istring xx,yy,y1,y2double z,z1i=dw_1.getrow()CHOOSE CASE dw_1.getcolumnname()//得到当前列得到当前列的列名的列名 1179.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计CASE 'wzckbm'//如果当前列的列名为如果当前列的列名为wzckbm,则通过,则通过SQL语句得到仓库名称,语句得到仓库名称,//并将其写入并将其写入wzckmc项中xx=dataSELECT wzckmc INTO :yy FROM wzckbmb WHERE wzckbm=:xx;dw_1.setitem(i,'wzckmc',yy)CASE 'dwbm'//如果当前列的列名为如果当前列的列名为dmbm,则通过,则通过SQL语句语句得到单位名称,得到单位名称,//并将其写入并将其写入dwmc项中。

项中 1189.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计xx=dataSELECT dwmc INTO :yy FROM dwbmb WHERE dwbm=:xx;dw_1.setitem(i,'dwmc',yy)CASE 'wzbm'//如果当前列的列名为如果当前列的列名为wzbm,则通过,则通过SQL语句得到物资名称、语句得到物资名称、//规格型号、计量单位和价格,并将其写入对应项中规格型号、计量单位和价格,并将其写入对应项中xx=dataSELECT wzmc,xhgg,jldw,price INTO :yy ,:y1,:y2,:z FROM wzbmb WHERE wzbm=:xx; 1199.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计dw_1.setitem(i,'wzmc',yy)dw_1.setitem(i,'xhgg',y1)dw_1.setitem(i,'jldw',y2)dw_1.setitem(i,'price',z)CASE 'sfs'//如果当前列的列名为如果当前列的列名为sfs,得到价格,得到价格price的值,的值,//并将输入数量与价格的乘积写入总金额项中。

并将输入数量与价格的乘积写入总金额项中z=real(data)z1=dw_1.getitemnumber(i,'price')dw_1.setitem(i,'sum',z*z1)END CHOOSE在上述脚本中,使用了系统变量在上述脚本中,使用了系统变量data,该变量是字符型,它表示当前项中,该变量是字符型,它表示当前项中的输入值的输入值 1209.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计((4)数据窗口对象)数据窗口对象dw_1的的rowfocuschanged的脚本的脚本//该事件自动获得系统日期和数据库中的序号,并显示在相应该事件自动获得系统日期和数据库中的序号,并显示在相应位置上string vrq,vlkhlong iSELECT to_char(sysdate,'yyyymmdd') INTO :vrq FROM DUAL;//得到得到Oracle系统日期系统日期i=dw_1.getrow()dw_1.setitem(i,'rq',vrq)SELECT rl_sequence.nextval INTO :vrq FROM DUAL;//得到得到下一个序号,下一个序号, 1219.5.4 9.5.4 窗口及其控件事件脚本设计窗口及其控件事件脚本设计//rl_sequence是在是在Oracle中建立的序号中建立的序号vlkh=string(long(vrq)+1,'0000')dw_1.setitem(i,'lkh',vlkh)请读者考虑,如果将请读者考虑,如果将itemchanged事件中的脚本写到事件中的脚本写到editchanged事件中,有什么不同。

如果要使用户对事件中,有什么不同如果要使用户对sfs输入时,每输入一个数字,马上将总金额计算出来,事输入时,每输入一个数字,马上将总金额计算出来,事件脚本应作如何调整件脚本应作如何调整 1229.6.1 9.6.1 简单查询的实现简单查询的实现9.6.2 9.6.2 主从表的查询主从表的查询9.6.3 9.6.3 组合查询的实现组合查询的实现9.6 9.6 数据查询设计数据查询设计 123 简单查询的实现较为简单,首先建立一个带参数的简单查询的实现较为简单,首先建立一个带参数的数据窗口,在窗口中除添加数据窗口控件(数据窗口,在窗口中除添加数据窗口控件(dw_1dw_1)和命)和命令按钮(令按钮(cb_1cb_1)外,还需添加一个单行编辑框()外,还需添加一个单行编辑框(sle_1sle_1),),该框主要用于输入数据例如对该框主要用于输入数据例如对WzbmbWzbmb建立数据窗口,定建立数据窗口,定义一个字符型参数,并使参数与字段义一个字符型参数,并使参数与字段wzbmwzbm对应起来在对应起来在命令按钮命令按钮cb_1cb_1的的clickedclicked事件中写上:事件中写上:dw_1.retrieve(sle_1.text)dw_1.retrieve(sle_1.text)即可。

应当注意的是即可应当注意的是sle_1.textsle_1.text是字符型的,如果数据窗口参数是其它类型,是字符型的,如果数据窗口参数是其它类型,必须进行强制转换必须进行强制转换9.6.1 9.6.1 简单查询的实现简单查询的实现 124 在实际应用中会经常出现主从表的查询其实现方在实际应用中会经常出现主从表的查询其实现方法为:对主表建立一个数据窗口,对从表建立一个带参法为:对主表建立一个数据窗口,对从表建立一个带参数的数据窗口,其参数对应的字段为主从表的公共字段,数的数据窗口,其参数对应的字段为主从表的公共字段,在窗口中添加两个数据窗口控件(在窗口中添加两个数据窗口控件(dw_1dw_1、、dw_2dw_2)),dw_1,dw_1对对应主表建立的数据窗口对象,应主表建立的数据窗口对象,dw_2dw_2对应从表建立的数据对应从表建立的数据窗口对象在窗口对象在dw_1dw_1的事件的事件doubleclickeddoubleclicked中,获得当前行中,获得当前行的值,即为的值,即为dw_2dw_2的参数值,利用的参数值,利用dw_2.retrieve(dw_2.retrieve(参数值参数值) )检索数据即可。

这样程序在运行中,鼠标双击检索数据即可这样程序在运行中,鼠标双击dw_1dw_1中某中某一条记录,在一条记录,在dw_2dw_2中即可查询出与中即可查询出与dw_1dw_1中被双击记录有中被双击记录有关的从表的一些记录关的从表的一些记录9.6.2 9.6.2 主从表的查询主从表的查询 1251 1.查询的基本方法.查询的基本方法 对大型数据库的查询,都是用对大型数据库的查询,都是用SQLSQL语句来操纵后台数语句来操纵后台数据库实现的,其关键是构造合适的据库实现的,其关键是构造合适的wherewhere查询子句查询子句PBPB提提供的数据窗口和数据存储能通过调用两种查询函数供的数据窗口和数据存储能通过调用两种查询函数dwcontrol.Retrieve([argumentdwcontrol.Retrieve([argument, argument...]), argument...])与与dwcontrol.SetFilter(formatdwcontrol.SetFilter(format) )和和 dwcontrol.Filterdwcontrol.Filter( )( )的组合来实现与数据库绝大多数的交互操作的组合来实现与数据库绝大多数的交互操作。

9.6.3 9.6.3 组合查询的实现组合查询的实现 1262 2.设计思路.设计思路 通常情况下,用户对表的结构及其查询描述是不清晰通常情况下,用户对表的结构及其查询描述是不清晰的、含糊的,所以,应将表结构展示给用户,由其从中选的、含糊的,所以,应将表结构展示给用户,由其从中选择所需列名,再根据列名设置不同的模糊条件,通过模糊择所需列名,再根据列名设置不同的模糊条件,通过模糊条件的迭代后,形成综合查询条件经执行查询得到返回条件的迭代后,形成综合查询条件经执行查询得到返回结果集,最后,由用户决定是使用默认排序,还是根据需结果集,最后,由用户决定是使用默认排序,还是根据需要重新排序这其中,为了展示各表的结构,可将系统表要重新排序这其中,为了展示各表的结构,可将系统表pbcatcolpbcatcol导出为了方便用户对条件的描述和实现数据的导出为了方便用户对条件的描述和实现数据的一致性约束,采用了下拉式数据窗口的增量式输入的辅助一致性约束,采用了下拉式数据窗口的增量式输入的辅助措施为了方便用户查询结果集,采用了按字段名的适时措施为了方便用户查询结果集,采用了按字段名的适时排序方法。

而动态模糊排序方法而动态模糊SQLSQL语句的构造,则采用循环迭代的语句的构造,则采用循环迭代的查询字符串得到查询字符串得到WHEREWHERE查询子句的完整表达和默认排序,实查询子句的完整表达和默认排序,实现了查询程序的高通用性和代码的高重用性现了查询程序的高通用性和代码的高重用性9.6.3 9.6.3 组合查询的实现组合查询的实现 1273 3.通用的动态模糊查询的实现.通用的动态模糊查询的实现((1 1)) 导出系统表导出系统表pbcatcolpbcatcol以实现表中字段的自动显示以实现表中字段的自动显示((2 2)) 数据窗口中查询条件的设置数据窗口中查询条件的设置((3 3)) 动态模糊查询条件的生成动态模糊查询条件的生成((4 4)) 查询结果的显示查询结果的显示9.6.3 9.6.3 组合查询的实现组合查询的实现 1289.6.3 9.6.3 组合查询的实现组合查询的实现((1)) 导出系统表导出系统表pbcatcol以实现表中字段的自动显示以实现表中字段的自动显示 导出系统表导出系统表pbcatcol,设置检索参数为,设置检索参数为pbcatcol.pbc_owner = ‘wz’,并选取其中的,并选取其中的pbc-tnam(表(表名)名), pbc-cnam(列名)(列名), pbc-hdr(中文注释)等字段后,(中文注释)等字段后,把把pbc-tnam和和pbc-cnam剪切掉,只保留了剪切掉,只保留了pbc-hdr以构造下以构造下拉式子数据窗口拉式子数据窗口d_cxzd1,并在,并在d_cx1中挂于中挂于“zdlm”字段下,字段下,选择选择pbc-hdr为数据列和显示数据列,并通过外部数据源建立为数据列和显示数据列,并通过外部数据源建立数据窗口数据窗口d_1挂在挂在“value”字段下,字段下,dw_cx1可通过建立表或可通过建立表或通过外部数据源建立的数据窗口,其数据窗口形式如图通过外部数据源建立的数据窗口,其数据窗口形式如图9.5所所示。

示 图图9.5 数据窗口数据窗口d_cx1 1299.6.3 9.6.3 组合查询的实现组合查询的实现 建立窗口建立窗口w_queryw_query,在其中添加,在其中添加2 2个数据窗口控件个数据窗口控件dw_3dw_3和和dw_4dw_4及及3 3个命令按钮,并在个命令按钮,并在dw_3dw_3的的PropertiesProperties中指定中指定DataObjectDataObject为为d_cx1d_cx1在窗口在窗口w_queryw_query的定义全局变量如下:的定义全局变量如下:datawindowchilddatawindowchild dwc,dwc1 dwc,dwc1string string dwsyntax_str,cxbm,tablenamedwsyntax_str,cxbm,tablename datawindowdatawindow dw_all,gd_sourcedw_all,gd_source定义实例变量如下:定义实例变量如下:intint n,seln,sellong long il_lastrowil_lastrowstring lm2,lm1string lm2,lm1 1309.6.3 9.6.3 组合查询的实现组合查询的实现 窗口窗口w_query的的open事件中用脚本根据表名参数过滤事件中用脚本根据表名参数过滤出相应的表字段,并在条件设置数据窗口出相应的表字段,并在条件设置数据窗口dw_3中显示出来:中显示出来:dw_4.visible=falsetablename='wzbmb'dw_3.getchild("zdlm",dwc)//得到子数据窗口得到子数据窗口dwc.settransobject(sqlca)//设置事物对象设置事物对象dwc.setfilter("pbc_tnam = '"+tablename+"'")//根据全局根据全局变量变量tablename设置过滤条件设置过滤条件dwc.filter()//根据设置好的过滤条件过滤根据设置好的过滤条件过滤dwc.retrieve()//过滤后再检索,否则无数据过滤后再检索,否则无数据 1319.6.3 9.6.3 组合查询的实现组合查询的实现((2)) 数据窗口中查询条件的设置数据窗口中查询条件的设置 对应于不同的字段列名,有不同的属性和数据类型,而用对应于不同的字段列名,有不同的属性和数据类型,而用户很难分清具体的差别并给予正确的值的输入,所以,必须在户很难分清具体的差别并给予正确的值的输入,所以,必须在字段选好后,就把相应的属性及数据类型配置好供用户选取和字段选好后,就把相应的属性及数据类型配置好供用户选取和修改。

因此,我们采用了在数据窗口输入条件时动态地修改下修改因此,我们采用了在数据窗口输入条件时动态地修改下拉式数据窗口相关属性的方式保证用户输入的准确性,并用增拉式数据窗口相关属性的方式保证用户输入的准确性,并用增量式输入技术对用户输入数据进行适时跟踪和向导量式输入技术对用户输入数据进行适时跟踪和向导在在dw_3的的itemchanged事件里用事件里用describe()和和modify()函数组函数组合来实现动态子数据窗口功能,其主要程序段如下:合来实现动态子数据窗口功能,其主要程序段如下: 1329.6.3 9.6.3 组合查询的实现组合查询的实现IF this.getcolumnname()='zdlm' THENlm1=dataSELECT count() INTO :count FROM pbcatcol WHERE Pbcatcol.pbc_ownr = 'wz' AND pbcatcol.pbc_hdr=:lm1; IF count<=0 THEN//系统表中无此列名时系统表中无此列名时messagebox("输入错误输入错误","无此列名无此列名!") ELSE//系统表中有此列名时,赋值给系统表中有此列名时,赋值给lm2 SELECT pbcatcol.pbc_cnam INTO :lm2 FROM pbcatcol WHERE pbcatcol.pbc_OWNR = 'wz' and pbcatcol.pbc_hdr=:lm1; END IF 1339.6.3 9.6.3 组合查询的实现组合查询的实现this.modify("value.dddw.DataColumn='"+lm2+"'")//根据根据value列改变列改变dwc的数据列的数据列this.modify("value.dddw.displaycolumn='"+lm2+"'")//根据根据value列改列改变变dwc的显示列的显示列this.getchild("value",dwc1)//得到子数据窗口得到子数据窗口dwc1.settransobject(sqlca)dwc1.retrieve( )dwc1.SetRedraw(false)//关闭重绘功能关闭重绘功能dwc1.SetSort(lm2+" A")//设置设置dwc1中的排序条件(升序)中的排序条件(升序)dwc1.sort()//按排序条件排序按排序条件排序d wc1.setredraw(true) //开启重绘功能开启重绘功能END IF 1349.6.3 9.6.3 组合查询的实现组合查询的实现 在在 dw_3中用中用editchanged事件来实现增量式输入跟踪和向导功能,事件来实现增量式输入跟踪和向导功能,其主要程序段如下:其主要程序段如下:string input,condition,firstline,dddwcolIF this.getcolumnname()='value' THEN//对于选中列为对于选中列为value时才执时才执行操作行操作 dwc1.settransobject(sqlca) this.getchild("value",dwc1)// Sel 必须为实例变量,表示当前选中的必须为实例变量,表示当前选中的字符串的长度字符串的长度//用于过滤用于过滤editchanged事件中第一次对选中内容的删除操作,避免两事件中第一次对选中内容的删除操作,避免两次触发该事件次触发该事件IF Sel>0 THEN Sel=0 RETURNEND IF 1359.6.3 9.6.3 组合查询的实现组合查询的实现dddwcol=this.describe("value.dddw.displaycolumn")// value列子数列子数据窗口的当前显示列据窗口的当前显示列input=this.gettext()//得到输入数据得到输入数据IF input<>'' THEN //有输入数据时有输入数据时 input=lower(left(input,len(input) - this.selectedlength()))//除选中字除选中字符外输入字符长度符外输入字符长度 condition=dddwcol+" like '"+input+"%'" dwc1.setfilter(condition) //设置过滤条件设置过滤条件 dwc1.filter()//根据过滤条件过滤记录根据过滤条件过滤记录 IF dwc1.rowcount()>0 THEN//如果有记录时如果有记录时 firstline=dwc1.getitemstring(1,"aa")//找到过滤后子数据窗口的第一找到过滤后子数据窗口的第一行行//aa为为value字段的下拉数据窗口字段的下拉数据窗口d_1的字段名。

的字段名 1369.6.3 9.6.3 组合查询的实现组合查询的实现 this.settext(firstline) //设置浮动数据设置浮动数据 this.selecttext(len(input)+1,len(firstline))//选中选中firstline中还未输中还未输入部分入部分 Sel=this.selectedlength()//选中的字符长选中的字符长 ELSE//如果没有满足过滤条件的记录时如果没有满足过滤条件的记录时 this.selecttext(len(input),len(input))//选中没有匹配上的用户刚输选中没有匹配上的用户刚输入的字符入的字符 Sel=1 beep(1) //发出警告声发出警告声END IF END IFEND IF 1379.6.3 9.6.3 组合查询的实现组合查询的实现 对于增量式输入还可通过用户定制事件对于增量式输入还可通过用户定制事件pbm_downkey来实现,但效果不如来实现,但效果不如editchanged事件好,事件好,且还需考虑其他键值(如退格键且还需考虑其他键值(如退格键Backspace)的影响。

通)的影响通过过setfilter()和和filter()函数的搭配使用来设置过滤条件,尤函数的搭配使用来设置过滤条件,尤其在本方法中经检索函数其在本方法中经检索函数retrieve()后再过滤,是从缓冲区后再过滤,是从缓冲区而不是数据库过滤记录,不会带来额外的系统开销而不是数据库过滤记录,不会带来额外的系统开销 1389.6.3 9.6.3 组合查询的实现组合查询的实现((3)) 动态模糊查询条件的生成动态模糊查询条件的生成 先取出数据窗口先取出数据窗口dw_3中的模糊条件的相应字段,根据不同的字段类型和运算符中的模糊条件的相应字段,根据不同的字段类型和运算符进行预处理,再用循环得到最终的条件组合,构成的优化和标准的进行预处理,再用循环得到最终的条件组合,构成的优化和标准的where子句即在在"确定条件确定条件"按钮的按钮的clicked事件中,编写如下脚本:事件中,编写如下脚本:integer m,kstring data_typem=1string cnam,n1,n2,n3,n4,cxtj,errors,cxbm1,orderby,n3plusstring n3plusplus1,n3plusplus2,cxtj1datawindow dw_ylboolean netn = dw_3.rowcount()//n为行数全局变量为行数全局变量IF dw_3.getrow()=n AND n>0 THEN dw_3.setitem(n,'ljf','and')END IF 1399.6.3 9.6.3 组合查询的实现组合查询的实现FOR k=1 TO n//查看查看dw-3中条件填写是否完全中条件填写是否完全net=(isnull(dw_3.getitemstring(k,"zdlm"))=true OR isnull(dw_3.getitemstring(k,"ysf")) = true OR isnull(dw_3.getitemstring(k,"value"))= true OR isnull(dw_3.getitemstring(k,"ljf"))= true ) or net NEXTIF n>0 AND net=false THEN//完全条件数完全条件数>=1时时 DO WHILE m<=n//循环取查询条件标准化循环取查询条件标准化n1=dw_3.getitemstring(m,2,primary!,false)//取出第取出第m行的列名行的列名zdlm SELECT pbc_cnam INTO :cnam FROM pbcatcol WHERE pbc_hdr=:n1 AND pbc_tnam=:tablename;IF m=1 THENorderby=cnam//默认第默认第1条件为排序条件条件为排序条件END IF 1409.6.3 9.6.3 组合查询的实现组合查询的实现n2=dw_3.getitemstring(m,3,primary!,false) n3=dw_3.getitemstring(m,4,primary!,false)n4=dw_3.getitemstring(m,5,primary!,false) //假设只有字符型和数字型两假设只有字符型和数字型两种类型种类型SELECT data_type INTO :data_type FROM user_tab_column WHERE owner=’wz’ AND table_name=:tablename AND column_name=:cnam;IF lower(data_type)<>’number’ THENn3plus="'"ELSE n3plus=""END IFIF isnull(n4)=true OR m=n THEN//处理逻辑符处理逻辑符n4=""END IF 1419.6.3 9.6.3 组合查询的实现组合查询的实现CHOOSE CASE n2//按按ysf分类处理查询条件,分类处理查询条件,CASE '=','<','<=','>','>=','<>'n3plusplus1=""n3plusplus2=""CASE 'like','not like'n3plusplus1="%"n3plusplus2="%"END CHOOSE 1429.6.3 9.6.3 组合查询的实现组合查询的实现cxtj1=cxtj1 + cnam+ " "+ n2+ " " + n3plus+ n3plusplus1 + n3 + n3plusplus2 + n3plus+" "+n4+" “ //最终的查询条件最终的查询条件m=m+1//计数器增加计数器增加1 LOOPcxtj1="select * from "+tablename+" where "+cxtj1+" order by "+orderbydwsyntax_str=sqlca.syntaxfromsql(cxtj1,"style(type=grid)",errors)//设置数据窗口的语法设置数据窗口的语法IF Len(ERRORS) > 0 THEN//语法出错警报语法出错警报MessageBox("Caution", "SyntaxFromSQL caused these errors: " + ERRORS)RETURNEND IF 1439.6.3 9.6.3 组合查询的实现组合查询的实现dw_4.reset()dw_4.Create( dwsyntax_str, ERRORS)//根据语法动态创建一个数据窗口根据语法动态创建一个数据窗口dw_4.settransobject(sqlca)dw_4.retrieve()//检索得到最终的查询结果检索得到最终的查询结果dw_4.Object.DataWindow.ReadOnly="Yes"//设置动态的数据窗口为只读设置动态的数据窗口为只读属性属性IF dw_4.retrieve()<1 THENmessagebox("提示信息提示信息","没有找到满足条件的纪录没有找到满足条件的纪录!")ELSEdw_yl=dw_4END IFIF Len(ERRORS) > 0 THEN//创建动态数据窗口的出错警报创建动态数据窗口的出错警报MessageBox("Caution","Create causethese errors: " + ERRORS) 1449.6.3 9.6.3 组合查询的实现组合查询的实现RETURNEND IF ELSEmessagebox("提示提示:","没有或不全的查询条件,请填写完整后再查询没有或不全的查询条件,请填写完整后再查询!",stopsign!)returnEND IFdw_4.visible=truedw_4.setrowfocusindicator(hand!)以上脚本只包含基本的运算符,但可以论证余下的以上脚本只包含基本的运算符,但可以论证余下的'in', 'between', 'not'等运算符均可以通过简单运算符的组合来实现,亦即以上运算符已构成了等运算符均可以通过简单运算符的组合来实现,亦即以上运算符已构成了一个完备集,可对任何记录查询。

一个完备集,可对任何记录查询 1459.6.3 9.6.3 组合查询的实现组合查询的实现((4)) 查询结果的显示查询结果的显示 在生成查询条件时,默认按第一查询条件的升序排列,但在实际在生成查询条件时,默认按第一查询条件的升序排列,但在实际应用中,用户往往希望可以动态改变查询结果集的显示效果来找到最适应用中,用户往往希望可以动态改变查询结果集的显示效果来找到最适合的记录为此,在查询结果的显示数据窗口合的记录为此,在查询结果的显示数据窗口dw_4中,通过中,通过doubleclicked事件来实现按指定列的升序来显示记录,其脚本如下:事件来实现按指定列的升序来显示记录,其脚本如下:sort_str=this.getcolumnname()+" A"this.SetRedraw(false)//关闭重绘,防止闪烁关闭重绘,防止闪烁this.SetSort(sort_str)//设置排序条件设置排序条件this.Sort()//按排序条件排序按排序条件排序this.SetRedraw(true)//开启重绘功能开启重绘功能以上脚本中使用的是升序排列,如需要按降序排列,只需将以上脚本中使用的是升序排列,如需要按降序排列,只需将setsort()函函数中的参数改为数中的参数改为“D”,同时在窗口中加入一个单选框,其中包含升序,同时在窗口中加入一个单选框,其中包含升序和降序单选按钮。

一个查询实例如图和降序单选按钮一个查询实例如图9.6所示:所示: 146 图图9.6 组合查询结果显示组合查询结果显示 147 菜单是用户操作应用程序的主要界面,它由一系统菜单是用户操作应用程序的主要界面,它由一系统命令或菜单项构成,用户通过选择菜单项发出命令,指命令或菜单项构成,用户通过选择菜单项发出命令,指示应用程序完成用户所期待的任务除子窗口和应答窗示应用程序完成用户所期待的任务除子窗口和应答窗口外,其它窗口都可拥有菜单口外,其它窗口都可拥有菜单9.7 9.7 菜单设计菜单设计 148建立菜单的建立菜单的步骤步骤如下:如下: ((1 1)单击)单击PowerBarPowerBar上的上的NewNew按钮或按钮或FileFile菜单项下的菜单项下的NewNew选选项,打开项,打开NewNew对话框 ((2 2)在)在PB ObjectPB Object标签中选择标签中选择MenuMenu图标,并单击图标,并单击OKOK按钮打按钮打开开MenuMenu画板 ((3 3)选取菜单)选取菜单InsertInsert中的中的Submenu ItemSubmenu Item项或单击鼠标右项或单击鼠标右键从弹出的快捷键菜单中选取键从弹出的快捷键菜单中选取Insert Submenu ItemInsert Submenu Item项,此时项,此时插入了一个菜单对象的子菜单,在空的菜单项名称处输入菜插入了一个菜单对象的子菜单,在空的菜单项名称处输入菜单名称。

在对应的单名称在对应的PropertiesProperties窗口中窗口中GeneralGeneral标签页下修改默标签页下修改默认的认的NameName,将,将NameName编辑框中菜单名改为所需名称,并选中编辑框中菜单名改为所需名称,并选中Lock NameLock Name复选框禁止修改复选框禁止修改NameName属性同时可定义快捷键属性同时可定义快捷键((Shortcut KeyShortcut Key),它选择),它选择Shortcut AltShortcut Alt、、Shortcut CtrlShortcut Ctrl、、Shortcut ShiftShortcut Shift与其它键组合成为快捷键与其它键组合成为快捷键9.7.1 9.7.1 菜单建立过程菜单建立过程 149 ((4 4)如果当前子菜单项有下一级菜单,将鼠标单击)如果当前子菜单项有下一级菜单,将鼠标单击子菜单项,选取菜单子菜单项,选取菜单InsertInsert中的中的SubmenuItemSubmenuItem项或单击鼠项或单击鼠标右键从弹出的快捷菜单中选取标右键从弹出的快捷菜单中选取Insert Submenu ItemInsert Submenu Item项,项,此时可插入子菜单项的下一级菜单子项。

如果要增加一此时可插入子菜单项的下一级菜单子项如果要增加一个与当前位于同一层次的菜单项,选取菜单个与当前位于同一层次的菜单项,选取菜单InsertInsert中的中的Menu ItemMenu Item项或单击鼠标右键从弹出的快捷菜单中选取项或单击鼠标右键从弹出的快捷菜单中选取Insert Menu ItemInsert Menu Item项,即可增加位于同一层次的菜单项项,即可增加位于同一层次的菜单项 ((5 5)重复()重复(3 3)、()、(4 4)可完成菜单的设计可完成菜单的设计 ((6 6)编写菜单事件脚本编写菜单事件脚本9.7.1 9.7.1 菜单建立过程菜单建立过程 1501 1.常用的菜单对象函数.常用的菜单对象函数 常用的菜单对象函数主要有:常用的菜单对象函数主要有: ((1 1))Check()Check()与与Uncheck()Uncheck()用于在菜单项的显示文本旁边用于在菜单项的显示文本旁边显示显示/ /去掉选中标志去掉选中标志 ((2 2))Enable()Enable()使菜单项有效,用户可以选择该菜单项,使菜单项有效,用户可以选择该菜单项,而而Disable()Disable()用于关闭菜单项且使其显示为灰色,用户不能选用于关闭菜单项且使其显示为灰色,用户不能选择此菜单项。

择此菜单项 ((3 3))Hide()Hide()与与Show()Show()用于隐蔽用于隐蔽/ /显示菜单项显示菜单项 ((4 4))ClassNameClassName()()用于得到菜单项的名称用于得到菜单项的名称 ((5 5))GetparentGetparent()()用于返回菜单项父对象的指针用于返回菜单项父对象的指针9.7.2 9.7.2 菜单对象函数与菜单事件菜单对象函数与菜单事件 1512 2.菜单项常用事件.菜单项常用事件 菜单项常用事件主要有:菜单项常用事件主要有: ((1 1))ClickedClicked事件,该事件在用户选择相应菜单项时触发执行事件,该事件在用户选择相应菜单项时触发执行 ((2 2))SelectedSelected事件,该事件在用户使用箭头键或鼠标移动焦点事件,该事件在用户使用箭头键或鼠标移动焦点到相应菜单项时触发执行到相应菜单项时触发执行 ((3 3))HelpHelp事件,该事件在用户按下事件,该事件在用户按下F1F1键时触发执行键时触发执行 在这些事件中,可直接使用菜单函数,也可使用引用菜单所依在这些事件中,可直接使用菜单函数,也可使用引用菜单所依附的窗口对象。

在菜单事件中使用最多是打开窗口函数附的窗口对象在菜单事件中使用最多是打开窗口函数 在窗口中引用菜单时,只需在窗口在窗口中引用菜单时,只需在窗口PropertiesProperties的的GeneralGeneral标签页标签页下的下的MenuNameMenuName编辑框中输入编辑框中输入/ /选择相应的菜单名即可选择相应的菜单名即可但应注意:如但应注意:如果所定义的菜单中定义了工具按钮,只有果所定义的菜单中定义了工具按钮,只有MDI frame和和MDI frame with Microhelp 类型的窗口,其工具栏才会显示类型的窗口,其工具栏才会显示9.7.2 9.7.2 菜单对象函数与菜单事件菜单对象函数与菜单事件 152 PBPB提供了许多维护系统安全性的功能,其中很重要提供了许多维护系统安全性的功能,其中很重要的一点是可采用动态的一点是可采用动态SQLSQL语句对用户和角色进行维护在语句对用户和角色进行维护在应用系统中我们采用一些技术实现应用系统中我们采用一些技术实现8.68.6中提出的方法,具中提出的方法,具体过程如下:体过程如下: 在某核心用户下建立一在某核心用户下建立一UsernameUsername表表( (用户信息表用户信息表) ),,其中主要包括下列字段:其中主要包括下列字段:username(username(用户名用户名) ),,userroleuserrole( (用户角色用户角色) ),, userdwuserdw( (用户所在单位用户所在单位) ),,usersystemdmusersystemdm( (用户所使用系统代码用户所使用系统代码) ),, computer_namecomputer_name( (用户所使用机用户所使用机器器) )。

在登录界面上放置一个复选框、四个文本框和四个在登录界面上放置一个复选框、四个文本框和四个单行编辑框,文本框为提示信息,复选框选中后,显示单行编辑框,文本框为提示信息,复选框选中后,显示修改口令和重复修改口令的文本框和单行编辑框,并在修改口令和重复修改口令的文本框和单行编辑框,并在重复输入修改口令后,检验两次输入口令是否一致,如重复输入修改口令后,检验两次输入口令是否一致,如果一致,则继续,否则,果一致,则继续,否则,9.8 9.8 系统安全控制系统安全控制 153提示用户重新输入未选中时只显示用户名和用户口令提示用户重新输入未选中时只显示用户名和用户口令的文本框和单行编辑框用户输入所需信息后,按的文本框和单行编辑框用户输入所需信息后,按““确确定定””按钮或按钮或““退出退出””按钮全局变量按钮全局变量vusernamevusername、、vuserpasswordvuserpassword、、 vusernewpasswordvusernewpassword分别存储输入的用分别存储输入的用户名、口令和修改后的新口令其窗口如图户名、口令和修改后的新口令其窗口如图9.79.7所示:所示: 图图9.7 9.7 用户登录窗口用户登录窗口W_loginW_login9.8 9.8 系统安全控制系统安全控制 1549.8 9.8 系统安全控制系统安全控制 复选框复选框Cbx_1Cbx_1主要是选择修改口令时显示静态文本框主要是选择修改口令时显示静态文本框st_3st_3和和st_4st_4、单行编辑框、单行编辑框sle_3sle_3和和sle_4sle_4,否则上述四个控件不显示,,否则上述四个控件不显示,因而在窗口因而在窗口W_loginW_login的的OpenOpen事件中应使上述四个控件隐蔽,事件中应使上述四个控件隐蔽,CBX_1CBX_1的的ClickedClicked事件脚本为:事件脚本为:IF cbx_1.checked=true THEN//IF cbx_1.checked=true THEN//复选框选中后,显示控件复选框选中后,显示控件 sle_3.visible=truesle_3.visible=true sle_4.visible=true sle_4.visible=true st_3.visible=true st_3.visible=true st_4.visible=true st_4.visible=true 1559.8 9.8 系统安全控制系统安全控制ELSE//ELSE//复选框未选中,隐蔽控件复选框未选中,隐蔽控件 sle_3.visible=falsesle_3.visible=false sle_4.visible=false sle_4.visible=false st_3.visible=false st_3.visible=false st_4.visible=false st_4.visible=falseEND IFEND IF 1569.8 9.8 系统安全控制系统安全控制 在口令校验的单行编辑框在口令校验的单行编辑框sle_4sle_4的的losefocuslosefocus事件中,检验事件中,检验两次输入的口令是否一致。

其方法为先获取两次输入的口令,两次输入的口令是否一致其方法为先获取两次输入的口令,进行比较,如果相同,焦点聚集在进行比较,如果相同,焦点聚集在““确定确定””命令按钮上,否则命令按钮上,否则焦点聚集在焦点聚集在sle_4sle_4上其脚本请自己补充其脚本请自己补充窗口窗口W_loginW_login中的中的““确定确定””按钮的按钮的ClickedClicked事件的简化脚本如下:事件的简化脚本如下:SQLCA.DBMS= SQLCA.DBMS= ““O91 ORACLE9iO91 ORACLE9i””SQLCA.DatabaseSQLCA.Database=" "=" "SQLCA.UserIdSQLCA.UserId= =vusernamevusernameSQLCA.DbPassSQLCA.DbPass= =vuserpasswordvuserpasswordSQLCA.LogPassSQLCA.LogPass= =vuserpasswordvuserpasswordSQLCA.ServerNameSQLCA.ServerName="@="@wz.world"//wzwz.world"//wz为数据库的别名为数据库的别名 1579.8 9.8 系统安全控制系统安全控制SQLCA.LogIdSQLCA.LogId= =vusernamevusernameSQLCA.DBParmSQLCA.DBParm= =””””CONNECT using SQLCA;CONNECT using SQLCA;IF IF SQLCA.sqlcodeSQLCA.sqlcode= -1 THEN= -1 THENmessageboxmessagebox( (““错误错误””, , ““没有连接到数据库系统没有连接到数据库系统””) )return -1return -1END IFEND IFstring string vconnect,vrolevconnect,vrole////从表从表UsernameUsername表中获取相应的角色表中获取相应的角色 1589.8 9.8 系统安全控制系统安全控制SELECT SELECT userroleuserrole INTO : INTO :vrolevrole FROM Username FROM Username WHERR username=:WHERR username=:vusernamevusername; ;////vrolepasswdvrolepasswd是从系统表是从系统表sys.usersys.user$ $或其它途径获或其它途径获得的角色口令得的角色口令vconnectvconnect= =’’SET ROLE SET ROLE ’’+ +vrolevrole+ +’’ IDENTIFIED IDENTIFIED BY BY VALUES(VALUES(‘‘+vrolepasswd+vrolepasswd+ +’’) )’’Execute immediate :Execute immediate :vconnectvconnect using SQLCA; using SQLCA;////或设置缺省用户或设置缺省用户 1599.8 9.8 系统安全控制系统安全控制vconnectvconnect='alter user '+='alter user '+vusernamevusername +' identified by +' identified by '+'+vuserpasswordvuserpassword +' default role +' default role userdefaultrole,'+vroleuserdefaultrole,'+vroleExecute immediate :Execute immediate :vconnectvconnect using SQLCA; using SQLCA;If If SQLCA.sqlcodeSQLCA.sqlcode <>0 THEN <>0 THENMessageboxMessagebox( (““错误错误””, , ““没有激活相应的角色没有激活相应的角色””) )Disconnect Using SQLCA;Disconnect Using SQLCA;Return -1Return -1ELSEELSEDisconnect using Disconnect using sqlcasqlca; ;Connect using Connect using sqlcasqlca; ;IF cbx_1.checked=true THENIF cbx_1.checked=true THEN////修改用户口令修改用户口令 1609.8 9.8 系统安全控制系统安全控制vconnectvconnect='alter user '+='alter user '+vuservuser +' identified by +' identified by '+'+vusernewpasswordvusernewpassword Execute immediate :Execute immediate :vconnectvconnect using SQLCA; using SQLCA;If If SQLCA.sqlcodeSQLCA.sqlcode <>0 THEN <>0 THENMessageboxMessagebox( (““错误错误””, , ““口令修改不成功口令修改不成功””) )Return -1Return -1ELSEELSEVuserpasswordVuserpassword= =vusernewpasswordvusernewpasswordEND IFEND IF………… 1619.8 9.8 系统安全控制系统安全控制““退出退出””按钮的按钮的ClickedClicked的脚本为:的脚本为:lconnectlconnect= =’’SET ROLE none SET ROLE none ’’execute immediate :execute immediate :vconnectvconnect using SQLCA; using SQLCA;vconnectvconnect= =’’SET ROLE SET ROLE userdefaultroleuserdefaultrole’’execute immediate :execute immediate :vconnectvconnect using SQLCA; using SQLCA;////或设置缺省用户或设置缺省用户, ,这两种方法只需使用一个这两种方法只需使用一个 1629.8 9.8 系统安全控制系统安全控制vconnect='alter user '+vuser +' identified by '+vuserpassword +' default role userdefaulrolet'Execute immediate :vconnect using SQLCA;IF SQLCA.sqlcode <>0 THENMessagebox(“错误错误”, “没有激活相应的角色没有激活相应的角色”)Disconnect Using SQLCA;Return -1ELSEDisconnect using sqlca;END IF 1639.8 9.8 系统安全控制系统安全控制 为保证用户的非正常退出或使用其它途径退出应用系统,为保证用户的非正常退出或使用其它途径退出应用系统,对登录界面进行如下处理:对登录界面进行如下处理:((1 1)将登录窗口中的控制菜单、)将登录窗口中的控制菜单、maximize boxmaximize box、、minimize box minimize box 、、resizableresizable屏蔽掉;屏蔽掉;((2 2)将登录窗口中的)将登录窗口中的Initial State Initial State 设置为设置为Maximized;Maximized;((3 3)限制用户使用鼠标移动窗口;)限制用户使用鼠标移动窗口;((4 4)限定用户使用)限定用户使用ALT+DEL+CTRLALT+DEL+CTRL中止应用程序执行,用户按中止应用程序执行,用户按ALT+DEL+CTRLALT+DEL+CTRL键后执行键后执行““退出退出””按钮的按钮的CLICKEDCLICKED事件;事件;((5 5)) 限定同一用户使用多台计算机操作应用系统;限定同一用户使用多台计算机操作应用系统;((6 6)) 某用户在使用应用系统时,对用户密码进行修改(使用某用户在使用应用系统时,对用户密码进行修改(使用Alter user Alter user 用户名用户名 identified by values password,identified by values password,其中其中passwordpassword使用小写字母),使其不能使用另外工具(如使用小写字母),使其不能使用另外工具(如SQL SQL PLUSPLUS)对数据库进行操作,在退出应用系统之前改回原来密码。

对数据库进行操作,在退出应用系统之前改回原来密码上述过程也可以使用存储过程来实现,其上述过程也可以使用存储过程来实现,其““确定确定””按钮的按钮的ClickedClicked的简化后脚本如下:的简化后脚本如下: 1649.8 9.8 系统安全控制系统安全控制SQLCA.DBMS=" O91 ORACLE9i "SQLCA.Database=" "SQLCA.UserId=vusernameSQLCA.DbPass=vuserpasswordSQLCA.LogPass=vuserpasswordSQLCA.ServerName="@wz.world"//wz为数据库的别名为数据库的别名SQLCA.LogId=vusernameSQLCA.DBParm=””conncet using SQLCA;IF SQLCA.sqlcode= -1 THENmessagebox(“错误错误”, “没有连接到数据库系统没有连接到数据库系统”)return -1END IF 1659.8 9.8 系统安全控制系统安全控制string Vchange,vretu,vcomputer_name,ls_keyIF cbx_1.checked=true THENVchange=’T’ELSEVchange=’F’END IF//通过注册表获取计算机名通过注册表获取计算机名ls_key="HKEY_LOCAL_MACHINE\System\CurrentControlset\Control\Computername\Computername"Registryget(ls_key,"ComputerName",vcomputer_name) 1669.8 9.8 系统安全控制系统安全控制Declare vp_change PROCEDURE for P_user_change_passoword_privilege(:vusername,:vuserpassword, :vusernewpassword,:vcomputer_name,:vchang) ;//定义存储过程变量定义存储过程变量 Execute vp_change;//执行存储过程;执行存储过程; Fetch vp_change into :vretu ;//取出存储取出存储过程执行后的返回值,并赋给相应的变量过程执行后的返回值,并赋给相应的变量 1679.8 9.8 系统安全控制系统安全控制Close vp_change; //关闭存储过程关闭存储过程 If vretun=’1’ then Messagebox(“错误错误”, “你无权使用该机器!你无权使用该机器!”)End if……存储过程存储过程P_user_change_password_privilege,简化脚本,简化脚本如下:如下:CREATE OR REPLACE P_user_change_password_privilege(vusername varchar2,vuserpassword varchar2,vusernewpassword varchar2,vcomputer varchar2,vchange varchar2 ,vretu out numner) IS 1689.8 9.8 系统安全控制系统安全控制Vi number(2,0);Vrole varchar2(16);Vs varchar2(80);BEGINSELECT count(*) INTO vi FROM username WHERE username=vusername ;IF vi=0 THENVretu:=0;/*表示无此用户表示无此用户*/ELSE 1699.8 9.8 系统安全控制系统安全控制SELECT count(*) INTO vi FROM username WHERE username=vusername AND computer_name=vcomputer;IF vi=0 THENVretu:=1;/*表示用户不能在此机器上登录表示用户不能在此机器上登录*/ELSESELECT userrole INTO vrole FROM username WHERE username=vusername AND computer_name=vcomputer;IF vchange=”F” THENVs:=’ALTER USER ’ ||vusername||’ identified by ’||vuserpassword ||’ default role ’||vrole;Vi:=DBMS_SQL.open_cursor; 1709.8 9.8 系统安全控制系统安全控制DBMS_SQL.PARSE(vi,vs,DBMS_SQL.NATIVE);DBMS_SQL.excute(vi);DBNS_SQL.close_Cursor(vi);END IF;IF vchange=”T” THENVs:=’ALTER USER ’ ||vusername||’ identified by ’||vusernewpassword;Vi:=DBMS_SQL.open_cursor;//打开游标打开游标DBMS_SQL.PARSE(vi,vs,DBMS_SQL.NATIVE);//分析字符串分析字符串DBMS_SQL.excute(vi);//动态执行动态执行SQL语句语句 1719.8 9.8 系统安全控制系统安全控制DBMS_SQL.close_Cursor(vi);//关闭游标关闭游标Vs:=’ALTER USER ’ ||vusername||’ identified by ’||vusernewpassword ||’ default role ’||vrole;Vi:=DBMS_SQL.open_cursor;DBMS_SQL.PARSE(vi,vs,DBMS_SQL.NATIVE);DBMS_SQL.excute(vi);DBMS_SQL.close_Cursor(vi);END IF;END IF ;END IF; 1729.8 9.8 系统安全控制系统安全控制……END;其中其中DBMS_SQL是是Oracle中动态执行中动态执行SQL语句的程序包,语句的程序包,具体用法请参见相关资料。

具体用法请参见相关资料 1739.9.1 9.9.1 调试应用程序调试应用程序9.9.2 9.9.2 编译应用程序编译应用程序9.9.3 9.9.3 发布应用程序发布应用程序9 9..9 9 程序调试与发布程序调试与发布 174 在开发应用程序时,可能会发生所写程序代码没有达到所期望在开发应用程序时,可能会发生所写程序代码没有达到所期望的功能,此时在的功能,此时在PBPB的调试模式下执行应用程序,可以快捷地发现错的调试模式下执行应用程序,可以快捷地发现错误和改正错误在调试模式下,用户可以在程序中设置断点、单步误和改正错误在调试模式下,用户可以在程序中设置断点、单步跟踪执行程序、随时显示变量内容等跟踪执行程序、随时显示变量内容等 调试应用程序的步骤如下:调试应用程序的步骤如下: ((1 1)打开)打开DebugDebug画板画板 单击单击PowerBarPowerBar上的上的DebugDebug按钮或菜单按钮或菜单RunRun中的中的DebugDebug子菜单项子菜单项 ((2 2)设置断点)设置断点 通过菜单通过菜单ViewView中的中的Source Brower Source Brower 项来浏览和确定要定位的对项来浏览和确定要定位的对象,此时选择要调试对象的可能出错或与出错有关的事件脚本,在象,此时选择要调试对象的可能出错或与出错有关的事件脚本,在怀疑出错或与出错有关的位置上设置断点(即双击要设置断点的可怀疑出错或与出错有关的位置上设置断点(即双击要设置断点的可执行语句)。

执行语句)9.9.1 9.9.1 调试应用程序调试应用程序 175((3 3)在调试模式下执行应用程序)在调试模式下执行应用程序 单击单击Power BarPower Bar上的上的StartStart按钮或按钮或DebugDebug菜单项中的菜单项中的StartStart子项,子项,开始在调试模式下执行应用程序,当执行到第一个断点处暂停下来,开始在调试模式下执行应用程序,当执行到第一个断点处暂停下来,此时有一个红色的箭头符号说明当前执行语句位置此时有一个红色的箭头符号说明当前执行语句位置 在调试时,常用下列一些按钮或在调试时,常用下列一些按钮或DebugDebug中的菜单项:中的菜单项: ① ① Stop debuggingStop debugging:停止当前调试程序停止当前调试程序 ② ② ContinueContinue:从断点开始继续执行应用程序从断点开始继续执行应用程序 ③ ③ Step InStep In:单步跟踪,单击一次执行一条语句,如果当前语:单步跟踪,单击一次执行一条语句,如果当前语句是用户函数或调用的事件名,则进入相应的函数或事件处理程序句是用户函数或调用的事件名,则进入相应的函数或事件处理程序进行单步跟踪。

进行单步跟踪9.9.1 9.9.1 调试应用程序调试应用程序 176 ④ ④ Step OverStep Over:单步跟踪,单击一次执行一条语句,如果当前:单步跟踪,单击一次执行一条语句,如果当前语句是用户函数或调用的事件名,则将整个函数或事件处理程序作语句是用户函数或调用的事件名,则将整个函数或事件处理程序作为一条可执行语句为一条可执行语句 ⑤ ⑤ Step OutStep Out:单步跳出,如果当前在用户函数或调用的事件内,:单步跳出,如果当前在用户函数或调用的事件内,则把函数或事件处理程序剩余代码一并执行完,然后暂停在调用该则把函数或事件处理程序剩余代码一并执行完,然后暂停在调用该函数或事件的下一条语句上函数或事件的下一条语句上 ⑥ ⑥ Run To CursorRun To Cursor:执行到游标,即从断点处开始执行,一直:执行到游标,即从断点处开始执行,一直执行到游标当前所在的行执行到游标当前所在的行 ⑦ ⑦ Set Next StatementSet Next Statement:设置下一条要执行的语句设置下一条要执行的语句。

⑧ ⑧ Select ScriptSelect Script:选择程序代码窗口中显示的程序代码选择程序代码窗口中显示的程序代码 ⑨ ⑨ Edit StopEdit Stop:编辑断点编辑断点 ((4 4)观察变量的值)观察变量的值 通过观察变量值的变化判断是否有错误发生通过观察变量值的变化判断是否有错误发生9.9.1 9.9.1 调试应用程序调试应用程序 177 当应用程序调试完成后,需要编译成可执行程序当应用程序调试完成后,需要编译成可执行程序PBPB通过工程通过工程((ProjectProject)来编译生成最终的可执行程序来编译生成最终的可执行程序1 1.工程与可执行文件的编译.工程与可执行文件的编译 PBPB工程是将应用程序编译成可执行程序的对象当要编译应用程序时,工程是将应用程序编译成可执行程序的对象当要编译应用程序时,先要建立工程对象,其步骤如下:先要建立工程对象,其步骤如下: ((1 1)打开待编译的应用程序的工作区打开待编译的应用程序的工作区 ((2 2)选择)选择FileFile菜单的菜单的NewNew菜单项或单击菜单项或单击NewNew工具栏按钮,此时系统显示工具栏按钮,此时系统显示建立新对象对话框,选择建立新对象对话框,选择ProjectProject标签页中的标签页中的 Application WizardApplication Wizard或或ApplicationApplication,然后单击,然后单击OKOK按钮。

按钮 ((3 3)输入相应项主要项如下:可执行文件名及其路径、资源文件名、)输入相应项主要项如下:可执行文件名及其路径、资源文件名、是否编译为机器码、优化方式、库文件名、指定库文件的伪码动态链接库是否编译为机器码、优化方式、库文件名、指定库文件的伪码动态链接库((PBDPBD)或动态链接库()或动态链接库(DLLDLL)等9.9.2 9.9.2 编译应用程序编译应用程序 178 ((4 4)选择)选择DesignDesign菜单中的菜单中的Deploy ProjectDeploy Project或单击工程或单击工程画板工具栏上的画板工具栏上的DeployDeploy按钮,系统即开始编译按钮,系统即开始编译2 2.. 资源文件资源文件 在设计应用程序时,经常会使用一些外部资源如图标、在设计应用程序时,经常会使用一些外部资源如图标、图像等文件,这些文件在编译时不能直接编译到应用程序中,图像等文件,这些文件在编译时不能直接编译到应用程序中,但可以使用资源文件(但可以使用资源文件(PBRPBR),把这些资源发布给用户或编),把这些资源发布给用户或编译到可执行文件或动态链接库中。

资源文件是一个译到可执行文件或动态链接库中资源文件是一个ASCIIASCII码码文本文件,其中列出所有资源的名称,每个资源占一行,每文本文件,其中列出所有资源的名称,每个资源占一行,每行从第一列开始输入可以使用任何文本编辑器编辑资源文行从第一列开始输入可以使用任何文本编辑器编辑资源文件,以件,以PBRPBR扩展名保存资源文件即可扩展名保存资源文件即可9.9.2 9.9.2 编译应用程序编译应用程序 1793 3.编译模式.编译模式((1 1)独立的)独立的EXEEXE文件模式文件模式 该模式只生成一个可执行文件,所有对象和资源都编译到可执该模式只生成一个可执行文件,所有对象和资源都编译到可执行文件中该模式适用于规模较小、功能相对简单且不需要修改的行文件中该模式适用于规模较小、功能相对简单且不需要修改的应用程序要在此模式下编译,所有库文件的应用程序要在此模式下编译,所有库文件的PBDPBD或或DLLDLL复选框必须复选框必须置为未选状态,如果有资源文件,须将资源文件路径输入到可执行置为未选状态,如果有资源文件,须将资源文件路径输入到可执行文件输入域中,且将所有资源复制到资源文件所在的目录中。

文件输入域中,且将所有资源复制到资源文件所在的目录中2 2))EXEEXE文件加外部资源模式文件加外部资源模式 该模式只生成一个可执行文件,其中包含大部分资源,一些特该模式只生成一个可执行文件,其中包含大部分资源,一些特殊的资源则单独发布编译过程与独立殊的资源则单独发布编译过程与独立EXEEXE文件模式相同,只是未编文件模式相同,只是未编译到译到EXEEXE文件中的资源需与可执行文件一同发布该模式优点在于单文件中的资源需与可执行文件一同发布该模式优点在于单独发布的资源可以根据需要进行重新定义独发布的资源可以根据需要进行重新定义9.9.2 9.9.2 编译应用程序编译应用程序 180((3 3))EXEEXE文件加动态链接库模式文件加动态链接库模式 该模式生成一个可执行文件和若干个动态链接库,其中该模式生成一个可执行文件和若干个动态链接库,其中所有对象可编译到一个或多个动态链接库中,所有资源可编所有对象可编译到一个或多个动态链接库中,所有资源可编译到译到EXEEXE文件或动态链接库中该模式生成的文件或动态链接库中该模式生成的EXEEXE文件较小,文件较小,便于装入内存,动态链接库也可为多个应用程序共享。

要在便于装入内存,动态链接库也可为多个应用程序共享要在此模式下编译,所有库文件的此模式下编译,所有库文件的PBDPBD或或DLLDLL复选框必须置为选择复选框必须置为选择状态,如果有资源文件,须将资源文件路径输入到可执行文状态,如果有资源文件,须将资源文件路径输入到可执行文件输入域或库文件的资源文件输入域中,且将所有资源复制件输入域或库文件的资源文件输入域中,且将所有资源复制到资源文件所在的目录中到资源文件所在的目录中4 4))EXEEXE文件加动态链接库再加外部资源模式文件加动态链接库再加外部资源模式 该模式是第二种模式和第三种模式的综合,具有这两种该模式是第二种模式和第三种模式的综合,具有这两种模式的优点模式的优点9.9.2 9.9.2 编译应用程序编译应用程序 181 在在PBPB中生成的中生成的EXEEXE文件不是一个完全可独立执行的程文件不是一个完全可独立执行的程序,它须与序,它须与PBPB的一组动态链接库一起提供给用户这些的一组动态链接库一起提供给用户这些动态链接库被安装在动态链接库被安装在……\Shared\PowerBuilder\Shared\PowerBuilder目录下,目录下,并不是该目录下的所有文件都必须选择,而是要选择与并不是该目录下的所有文件都必须选择,而是要选择与应用程序相适应的应用程序相适应的PBPB支持文件、数据库配置文件、网络支持文件、数据库配置文件、网络环境配置文件。

环境配置文件 可以选用其它软件商提供的安装盘制作工具来制作可以选用其它软件商提供的安装盘制作工具来制作安装盘,如安装盘,如Install ShieldInstall Shield等9.9.3 9.9.3 发布应用程序发布应用程序 。

下载提示
相似文档
正为您匹配相似的精品文档