收藏 分享(赏)

PowerBuilder培训 中高级.ppt

上传人:yjrm16270 文档编号:4789799 上传时间:2019-01-13 格式:PPT 页数:63 大小:1.24MB
下载 相关 举报
PowerBuilder培训 中高级.ppt_第1页
第1页 / 共63页
PowerBuilder培训 中高级.ppt_第2页
第2页 / 共63页
PowerBuilder培训 中高级.ppt_第3页
第3页 / 共63页
PowerBuilder培训 中高级.ppt_第4页
第4页 / 共63页
PowerBuilder培训 中高级.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、PowerBuilder,编程技巧与注意事项,夏仲方,培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window) 数据窗口(DataWindow) 用户对象(User Object) 继承 嵌入式SQL,事务,事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务: 原子性事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 一致性事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保

2、持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。 隔离性由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。 持久性事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。,事务,PB中的事务介绍 PB中事务对象:transaction object:sqlca 可以自定义事务对象Tran

3、saction gTrans_yzcxgTrans_yzcx = Create TransactiongTrans_yzcx.DBMS = “”,PB中事务对象的属性,事务,PB中事务控制原理 原理:sqlca.AutoCommit 开始一个事务: sqlca.AutoCommit = False 结束一个事务: sqlca.AutoCommit = True 提交一个事务:commit 回滚一个事务:rollback 注意: 开始一个事务后,必须有相应的语句结束一个事务; 开始事务、结束事务的语句必须在同一个函数或事件中。,事务,HIS中的事务控制实现 Gf_Begin_TransActio

4、n(Sqlca) ao_Environment.AutoCommit = False if ao_Environment.SQLCode0 then return False return True Gf_Commit_TransAction(sqlca) Commit Using ao_Environment; if ao_Environment.SQLCode0 then return False ao_Environment.AutoCommit = True if ao_Environment.SQLCode0 then return False return True Gf_Roll

5、back_TrnasAction(sqlca) Rollback Using ao_Environment; if ao_Environment.SQLCode0 then return False ao_Environment.AutoCommit = True if ao_Environment.SQLCode0 then return False return True,注意事项,避免太多的连接,即同一个程序与数据库建立的连接不要太多,也不要用 SETTRANS()函数设置 DATAWINDOW 的事务对象;应该用 SETTRANSOBJECT();在程序中,不要动不动就用 CONNEC

6、T 和 DISCONNECT 在不更新数据时保持 SQLCA.AUTOCOMMIT 为 TRUE,避免当前事务一直处于激活状态,影响别的事务。 缩短一个事务更新数据的时延,若在事务中有运算,应先在本地全部做好,再用 DataWindow 一次性更新。 避免在事务中使用类似Messagebox等需要用户响应的函数,防止锁表的发生。,培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window) 数据窗口(DataWindow) 用户对象(User Object) 继承 嵌入式SQL,事件用户事件,PowerBuilder的窗口、控件、用户对象等都有一

7、组系统预先定义好的事件,打开某对象相关联的代码编辑器后,在事件列表框中就会看到这组事件。一般来说,这些系统预定义事件能够满足应用程序的大多数需求。然而,有时候应用程序中对象间需要灵活的通讯,此时,开发人员可以根据需要为对象定义自己的事件,这类事件就称做用户事件。,事件用户事件,用户事件的使用场合 解决用户对象与窗口之间的通讯问题。用户事件可以通过参数进行信息传递。 响应特殊操作,这些操作没有相应的PowerBuilder预定义事件。例如,我们希望用户按下Enter键后将输入焦点从一个单行编辑框移动到下一个单行编辑框(正常情况下需要按Tab键);再如,在数据窗口控件中,当用户输入焦点定位在最后一

8、行后,再按Enter键时插入一个空行等。 支持用户通过多种方式完成同一个功能。如在更新数据库时,即充许用户通过单击窗口上的按钮完成,也允许用户通过选择菜单项完成。,事件用户事件,事件标识(Event ID)事件标识是系统预先定义的标识符,它对应于某个事件。PB使用以pbm_为前缀的事件标识,每个事件标识都对应于特定的windows消息。这样当应用程序运行时, 通过触发Windows消息,从而触发PB中相应的事件。当不需要和Windows中的消息对应时,可以选择pbm_custom01到pbm_custom75之间的定制事件;也可以不选(让Event ID空着,或选择None) 注意:Other

9、 事件对应所有未映射成PB事件的Windows消息,因此,在Other事件中编写代码将显著地降低应用程序的性能。,事件用户事件,用户事件的使用 对应于某个Windows消息的,当相应动作在应用程序上发生时,该事件会被自动触发。 不对应于任何windows消息的,必须由代码触发该事件。,事件用户事件,触发用户事件的方法 TriggerEvent() PostEvent() Objectname.Trigger Static|Dynamic Event EventName(argumentlist) Objectname.Post Static|Dynamic Event EventName(ar

10、gumentlist),TriggerEvent() 语法:objectname.TriggerEvent( Event ,word,long) 例如:cb_Ok.TriggerEvent(Clicked!),或Parent.TriggerEvent(“ue_Init”) Word和long是两个可选参数,触发事件后其值将分别保存到系统全局对象message的wordparm和longParm属性中。,函数或事件的处理程序,Cb_Ok.TriggerEvent(Clicked!),Clicked事件处理程序,PostEvent() 语法:objectname. PostEvent( Event

11、 ,word,long) TriggerEvent()与PostEvent()的区别: TriggerEvent()如同函数调用,它等待被调用者执行完毕后才继续运行;通常称这种调用为同步调用; PostEvent()相当于发送一个请求执行的信号,接着还是执行自己的程序段。当自己的程序段执行完后才执行被调用者的代码,即邮寄一个事件。通常也称为异步调用。 PostEvent()不能用于应用对象(Application) 当需要使用事件的返回值时,不能使用PostEvent() 两者都不能用于没有事件的对象如绘图对象(直线、椭圆等),函数或事件的处理程序,Cb_Ok. PostEvent(Click

12、ed!),Clicked事件处理程序,Objectname.Trigger Static|Dynamic Event EventName(argumentlist) 表示立即执行指定事件的事件处理程序,然后再执行该语句后面的代码; Trigger可省略不写; Static和Dynamic选项只能选择一个,缺省时为Static。 Static表示编译时指定事件必须存在,系统要进行返回值类型的检查; Dynamic表示编译时指定事件可以不存在,系统把返回值类型的检查推迟到应用程序运行时进行。 Trigger, Static|Dynamic, Event三者次序可以任意放置,Objectname.P

13、ost Static|Dynamic Event EventName(argumentlist) 表示将指定的事件放在对象的事件队列中,然后继续执行该语句后面的代码,至于发出去的事件的事件处理程序何时执行,由操作系统决定。 Static和Dynamic选项只能选择一个,缺省时为Static。 Static表示编译时指定事件必须存在,系统要进行返回值类型的检查; Dynamic表示编译时指定事件可以不存在,系统把返回值类型的检查推迟到应用程序运行时进行。 Post, Static|Dynamic, Event三者次序可以任意放置,Trigger、Post的使用实例,Gf_Center_Windo

14、w(this)Dw_1.SetTransobject(sqlca) Dw_1.Retrieve() ,窗口Open事件中的代码,培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window) 数据窗口(DataWindow) 用户对象(User Object) 继承 嵌入式SQL,函数,如同事件,可以用trigger、post触发函数中的程序段; 函数的返回值最多只能指定一个,当需要有多个返回值时,可以使用参数,以传址方式定义。 参数传递方式说明: Value:传值,将实际参数的值传递给函数; Reference:传地址,把实际参数的地址传递给函数

15、 Readonly:传地址,不允许修改参数的值。,函数同名异构函数,全局函数不能使用同名异构函数 主要使用于窗口函数、用户自定义对象中的函数。,培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window) 数据窗口(DataWindow) 用户对象(User Object) 继承 嵌入式SQL,窗口,窗口的类型: Main:主窗口 Popup:弹出式窗口 Response:响应窗口 窗口的位置: 平铺 居中 窗口的大小:使用resize事件,培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window

16、) 数据窗口(DataWindow) 用户对象(User Object) 继承 嵌入式SQL,数据窗口类型,数据源,显示风格,数据窗口更新方式,数据窗口更新方式,WHERE Clause for Update/Delete:告诉PB如何生成SQL语句的WHERE子句; Key Columns Key and Updateable Columns Key and Modified Columns,数据窗口更新方式,Key Columns数据窗口只使用“Unique Key Columns ”列表框中选择的主键列来构造WHERE子句。该选项经常在单用户应用程序环境中使用。 举例: Update Y

17、K_TYPK SET YPMC = 青霉素钠针 Where YPXH = 5;Update YK_TYPK SET YPMC = 青霉素钠 Where YPXH = 5; 特点: 多个用户可以同时访问和修改数据库,保证了高并发性; 不能保证数据的完整性,数据窗口更新方式,Key and Updateable Columns数据窗口使用“Unique Key Columns ”列表框中选择的主键列和“Updateable columns”中选定的更新列来构造WHERE子句。 举例: Update YK_TYPK set YPMC = 青霉素钠针 Where YPXH = 5 and XTSB =

18、 1 AND YPMC = 青霉素 and YPGG = 80万u; Update YK_TYPK set YPMC = 青霉素钠 Where YPXH = 5 and XTSB = 1 AND YPMC = 青霉素 and YPGG = 80万u; 特点: 降低并发性,保证数据的完整性。,数据窗口更新方式,Key and Modified Columns数据窗口使用“Unique Key Columns ”列表框中选择的主键列和“Updateable columns”中选定的更新列中已修改过的列来构造WHERE子句。 举例: Update YK_TYPK set YPMC = 青霉素钠针 W

19、here YPXH = 5 AND YPMC = 青霉素; Update YK_TYPK set YPMC = 青霉素钠 Where YPXH = 5 AND YPMC = 青霉素; 特点: 可同时修改同一行不同列的数据,提高操作的并发性; 当修改不同行或同一行同一列的数据时,不能保证数据的完整性。,数据窗口灵活控制,数据窗口导入导出,数据窗口对象的容器数据窗口控件,第一步:定义实例变量,第二步:在数据窗口的dberror事件中编写脚本,Gf_Begin_Transaction(sqlca) If dw_1.Update() 1 thengf_Rollback_Transaction(sqlc

20、a)Messagebox(提示, 数据保存错误,请与管理员联系! + is_ErrorText)Return End If Gf_commit_Transaction(sqlca),第三步:修改保存按钮中的提示语句,思考:DataStore Update时,如何显示错误消息?,Gf_Begin_Transaction(sqlca) If lds_ypxx.Update() 1 thengf_Rollback_Transaction(sqlca)Messagebox(提示, 数据保存错误,请与管理员联系!)Return End If Gf_commit_Transaction(sqlca),Da

21、taStore lds_ypxx Lds_ypxx = Create DataStore Lds_ypxx.DataObject = d_typk Lds_ypxx.SetTransobject(sqlca) Lds_ypxx.Retrieve(),培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window) 数据窗口(DataWindow) 用户对象(User Object) 继承 嵌入式SQL,用户对象的概念,用户对象是封装了一组相关代码和属性、完成特定功能的对象。 用户对象只需定义一次,就能反复使用多次,并且修改一次,就能把修改结果反映到所

22、有使用该用户对象的地方。,用户对象的优势,避免了在应用程序的不同地方编写功能相同或相近代码的麻烦,提高了应用程序的可维护性。 用户对象可以把一组总在一起使用的可视控件组合在一起,构成一个完成特定功能的控件,应用程序可以在需要的地方随时使用它。 用户对象提供了构造具有一致外观可视部件的方法。 用户对象能够把相关功能封装在一起。 用户对象允许开发人员扩展某些PB系统对象(比如事务对象)的功能,用户对象的创建,用户对象的分类,类用户对象,可视用户对象,用户对象类用户对象,使用时需要先定义对象的类型,并用Create语句创建。 不再使用时,用destory语句删除对象,以释放内存空间,u_hzyb l

23、u_hzyb lu_hzyb = Create u_hzyb Destroy lu_hzyb,自动实例化,u_hzyb lu_hzyb /lu_hzyb = Create u_hzyb /Destroy lu_hzyb,思考:DataStore Update时,如何显示错误消息?,Gf_Begin_Transaction(sqlca) If lds_ypxx.Update() 1 thengf_Rollback_Transaction(sqlca)Messagebox(提示, 数据保存错误,请与管理员联系!)Return End If Gf_commit_Transaction(sqlca),

24、DataStore lds_ypxx Lds_ypxx = Create DataStore Lds_ypxx.DataObject = d_typk Lds_ypxx.SetTransobject(sqlca) Lds_ypxx.Retrieve(),1、做一个用户对象(标准类),选择,,选择DataStore,点OK就生成一个标准类,用户对象。然后定义一个实例变量:is_ErrorText,并在事件列表 中,选择dberror事件,写上以下代码:Is_ErrorText = errortext Return 1,保存该用户对象,并命名为u_datastore,2、当使用datastore更

25、新数据时,使用如下方法,Gf_Begin_Transaction(sqlca) If lds_ypxx.Update() 1 thengf_Rollback_Transaction(sqlca)Messagebox(提示, 数据保存时出现以下错误: + lds_ypxx.is_ErrorText )Return End If Gf_commit_Transaction(sqlca),/DataStore lds_ypxx /Lds_ypxx = Create DataStore u_DataStore lds_ypxx lds_ypxx = Create u_DataStore lds_ypx

26、x.DataObject = d_typk lds_ypxx.SetTransobject(sqlca) lds_ypxx.Retrieve(),培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window) 数据窗口(DataWindow) 用户对象(User Object) 继承 嵌入式SQL,关于继承,可继承的对象:窗口、菜单、用户对象事件的执行顺序:从祖先到子孙 事件的重载: 函数的重载:增加一同名同构函数,培训内容,事务(Transaction) 事件(Event) 函数(Function) 窗口(Window) 数据窗口(DataWin

27、dow) 用户对象(User Object) 继承 嵌入式SQL,书写嵌入式SQL时的注意事项,在 Where 字句中检索字段上加索引,若为多字段联合检索,可在这些字段上加复合索引。并且在书写SQL语句时,And语句中的字段应按复合索引中的字段的先后顺序,否则索引会失效。例如:在ZY_BQYZ表中加了在XMLX,YPLX复合索引,检索语句应写型如:XMLX=1 AND YPLX=0,而不是YPLX=0 AND XMLX=1,避免使用 Sql Server 函数,如 DateDiff(),函数会使索引失效。 例:原SQL语句:DATEDIFF(DAY, TZSJ, GETDATE()=0 优化的

28、Sql 语句:/ 变量申明datetime ldt_datebegin, ldt_dateendldt_datebegin = datetime(date(gf_server_date(), time(“0:0:0”)ldt_dateend = datetime(date(gf_server_date(), time(“23:59:59”)/ SqlTZSJ = :ldt_datebegin AND TZSJ = :ldt_dateend,少用字符串类型字段,多用数值型字段要与其他表作连接用的字段,最好用数值型。因为,一般字符型位数相对数值型较长。用数值型字段,可减少 Sql Server 检

29、索比较的时间。 少用/不用Cursor,多用DataWindow 或 DataStore。Cursor 在执行 Fetch 时始终与服务器保持通信,若在 Fetch 语句中嵌入查询或其他比较耗时的语句,将导致整个查询很慢。替代的办法是:先用 DataWindow 一次性检索数据到本地,再用循环替代 Fetch。,尽量少用 OR 子句 OR 子句将导致 Sql Server 用 Nested Loop 的方法检索数据IN 子句中若为常量,Sql Server 实际上是转化为 OR 语句来实现。 IN 子句中应为常量,避免用子查询 如:医嘱项目执行模块,原来的 Sql 语句片段为: (ZXKS=0

30、 OR ZXKS IS NULL OR ZXKS IN (SELECT KSDM AS ZXKS FROM GY_KSWK WHERE WKDZ=:as_wkdz) 优化为:(ZXKS=0 OR ZXKS IS NULL OR ZXKS IN (:ala_ksdm))其中,ALA_KSDM 为数值数组,避免用 IS NULL 或 ISNULL(FYDJ*FYSL,0)=0 类似的语句在表设计时,要有初值(BSHIS2.2已考虑此问题)。ISNULL() 将使索引失效。如果一定要用,请使用 IS NULL,而不使用 ISNULL() 函数。,附:PBComment的使用,自动产生注释格式 自动产生函数参数及返回值类型 自动产生修改日期、修改人,修改人可设置 与PB开发界面混为一体,PBComment的效果,PBComment的设置,点右键,选择“new”,选择“powerbar2” 选择cu stom,并从上面拉一个图标到下面 双击该图标志,并在command line 中输入文件的路径和文件名以及需要的参数 点OK,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报