PowerBuilder 中高级

上传人:无*** 文档编号:244607966 上传时间:2024-10-05 格式:PPT 页数:63 大小:1.24MB
返回 下载 相关 举报
PowerBuilder 中高级_第1页
第1页 / 共63页
PowerBuilder 中高级_第2页
第2页 / 共63页
PowerBuilder 中高级_第3页
第3页 / 共63页
点击查看更多>>
资源描述
PowerBuilder,编程技巧与注意事项,夏仲方,培训内容,事务(,Transaction,),事件(,Event,),函数(,Function,),窗口(,Window,),数据窗口(,DataWindow),用户对象,(,User Object,),继承,嵌入式,SQL,事务,事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为,ACID(,原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:,原子性,事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。,一致,性,事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如,B,树索引或双向链表)都必须是正确的。,隔离性,由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。,持久性,事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。,事务,PB,中的事务介绍,PB,中事务对象:,transaction object:,sqlca,可以自定义事务对象,Transaction,gTrans_yzcx,gTrans_yzcx,= Create Transaction,gTrans_yzcx.DBMS,= “”,DBMS,String,数据库厂商的名称,DataBase,String,要连接的数据库名称,UserID,String,与数据库连接的用户名或用户标识,DbPass,String,对应,UserID,的密码,Lock,String,用于连接数据库的隔离层,LogID,String,登录数据库服务器所需的用户名,LogPass,String,对应,LogID,的密码,ServerName,String,数据库服务器所在的网络名称,AutoCommit,Boolean,定义应用程序是自动提交事务还是手工提交事务,DBParm,String,与具体数据库管理系统相关的一组连接参数,SqlCode,Long,指示最近一次,SQL,语句是否操作成功(,0,-1,100,),SqlnRows,Long,最近一次,SQL,操作的影响的行数,SqlDbCode,Long,由数据库厂商提供的数据库错误代码,SqlErrText,String,由数据库厂商提供的出错信息,SqlReturnData,String,返回,DBMS,想告诉用户的任何附加信息,PB,中事务对象的属性,事务,PB,中事务控制原理,原理:,sqlca.AutoCommit,开始一个事务:,sqlca.AutoCommit,= False,结束一个事务:,sqlca.AutoCommit,= True,提交一个事务:,commit,回滚一个事务:,rollback,注意:,开始一个事务后,必须有相应的语句结束一个事务;,开始事务、结束事务的语句必须在同一个函数或事件中。,事务,HIS,中的事务控制实现,Gf_Begin_TransAction(Sqlca,),ao_Environment.AutoCommit,=,False,if,ao_Environment.SQLCode,0,then return False,return True,Gf_Commit_TransAction(sqlca,),Commit Using,ao_Environment,;,if,ao_Environment.SQLCode,0,then return False,ao_Environment.AutoCommit,=,True,if,ao_Environment.SQLCode,0,then return False,return True,Gf_Rollback_TrnasAction(sqlca,),Rollback Using,ao_Environment,;,if,ao_Environment.SQLCode,0,then return False,ao_Environment.AutoCommit,=,True,if,ao_Environment.SQLCode,0,then return False,return True,注意事项,避免太多的连接,即同一个程序与数据库建立的连接不要太多,也不要用,SETTRANS(),函数设置,DATAWINDOW,的事务对象;应该用,SETTRANSOBJECT(),;,在程序中,不要动不动就用,CONNECT,和,DISCONNECT,在不更新数据时保持,SQLCA.AUTOCOMMIT,为,TRUE,,避免当前事务一直处于激活状态,影响别的事务。,缩短一个事务更新数据的时延,若在事务中有运算,应先在本地全部做好,再用,DataWindow,一次性更新。,避免在事务中使用类似,Messagebox,等需要用户响应的函数,防止锁表的发生。,培训内容,事务(,Transaction,),事件(,Event,),函数(,Function,),窗口(,Window,),数据窗口(,DataWindow),用户对象(,User Object,),继承,嵌入式,SQL,事件,用户事件,PowerBuilder,的窗口、控件、用户对象等都有一组系统预先定义好的事件,打开某对象相关联的代码编辑器后,在事件列表框中就会看到这组事件。一般来说,这些系统预定义事件能够满足应用程序的大多数需求。然而,有时候应用程序中对象间需要灵活的通讯,此时,开发人员可以根据需要为对象定义自己的事件,这类事件就称做用户事件。,事件,用户事件,用户事件的使用场合,解决用户对象与窗口之间的通讯问题。用户事件可以通过参数进行信息传递。,响应特殊操作,这些操作没有相应的,PowerBuilder,预定义事件。例如,我们希望用户按下,Enter,键后将输入焦点从一个单行编辑框移动到下一个单行编辑框(正常情况下需要按,Tab,键);再如,在数据窗口控件中,当用户输入焦点定位在最后一行后,再按,Enter,键时插入一个空行等。,支持用户通过多种方式完成同一个功能。如在更新数据库时,即充许用户通过单击窗口上的按钮完成,也允许用户通过选择菜单项完成。,事件,用户事件,事件标识(,Event ID,),事件标识是系统预先定义的标识符,它对应于某个事件。,PB,使用以,pbm,_,为前缀的事件标识,每个事件标识都对应于特定的,windows,消息。这样当应用程序运行时, 通过触发,Windows,消息,从而触发,PB,中相应的事件。,当不需要和,Windows,中的消息对应时,可以选择,pbm_custom01,到,pbm_custom75,之间的定制事件;也可以不选,(让,Event ID,空着,或选择,None),注意:,Other,事件对应所有未映射成,PB,事件的,Windows,消息,因此,在,Other,事件中编写代码将显著地降低应用程序的性能。,事件,用户事件,用户事件的使用,对应于某个,Windows,消息的,当相应动作在应用程序上发生时,该事件会被自动触发。,不对应于任何,windows,消息的,必须由代码触发该事件。,事件,用户事件,触发用户事件的方法,TriggerEvent,(),PostEvent,(),Objectname.,Trigger, ,Static,|,Dynamic,Event,EventName(argumentlist,),Objectname.,Post,Static,|,Dynamic,Event,EventName(argumentlist,),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 ,word,long,),TriggerEvent,(),与,PostEvent,(),的区别:,TriggerEvent,(),如同函数调用,它等待被调用者执行完毕后才继续运行;通常称这种调用为同步调用;,PostEvent,(),相当于发送一个请求执行的信号,接着还是执行自己的程序段。当自己的程序段执行完后才执行被调用者的代码,即邮寄一个事件。通常也称为异步调用。,PostEvent,(),不能用于应用对象(,Application,),当需要使用事件的返回值时,不能使用,PostEvent,(),两者都不能用于没有事件的对象如绘图对象(直线、椭圆等),函数或事件的处理程序,Cb_Ok,.,PostEvent(Clicked,!),Clicked,事件处理程序,Objectname.,Trigger, ,Static|Dynamic,Event,EventName(argumentlist,),表示立即执行指定事件的事件处理程序,然后再执行该语句后面的代码;,Trigger,可省略不写;,Static,和,Dynamic,选项只能选择一个,缺省时为,Static,。,Static,表示编译时指定事件必须存在,系统要进行返回值类型的检查;,Dynamic,表示编译时指定事件可以不存在,系统把返回值类型的检查推迟到应用程序运行时进行。,Trigger,Static|Dynamic, Event,三者次序可以任意放置,Objectname.,Post,Static|Dynamic,Event,EventName(argumentlist,),表示将指定的事件放在对象的事件队列中,然后继续执行该语句后面的代码,至于发出去的事件的事件处理程序何时执行,由操作系统决定。,Static,和,Dynamic,选项只能选择一个,缺省时为,Static,。,Static,表示编译时指定事件必须存在,系统要进行返回值类型的检查;,Dynamic,表示编译时指定事件可以不存在,系统把返回值类型的检查推迟到应用程序运行时进行。,Post,Static|Dynamic, Event,三者次序可以任意放置,Trigger、Post,的使用实例,Gf_Center_Window(,this,),Dw_1.SetTransobject(sqlca),Dw_1.Retrieve(),窗口,Open,事件中的代码,Gf_Center_Window(,this,),Dw_1.SetTransobject(sqlca),Dw_1.,Post,Retrieve(),培训内容,事务(,Transaction,),事件(,Event,),函数(,Function,),窗口(,Window,),数据窗口(,DataWindow),用户对象(,User Object,),继承,嵌入式,SQL,函数,如同事件,可以用,trigger、post,触发函数中的程序段;,函数的返回值最多只能指定一个,当需要有多个返回值时,可以使用参数,以传址方式定义。,参数传递方式说明:,Value:,传值,将实际参数的值传递给函数;,Reference:,传地址,把实际参数的地址传递给函数,Readonly,:,传地址,不允许修改参数的值。,函数,同名异构函数,全局函数不能使用同名异构函数,主要使用于窗口函数、用户自定义对象中的函数。,培训内容,事务(,Transaction,),事件(,Event,),函数(,Function,),窗口,(,Window,),数据窗口(,DataWindow),用户对象(,User Object,),继承,嵌入式,SQL,窗口,窗口的类型:,Main:,主窗口,Popup:,弹出式窗口,Response:,响应窗口,窗口的位置:,平铺,居中,窗口的大小:使用,resize,事件,培训内容,事务(,Transaction,),事件(,Event,),函数(,Function,),窗口(,Window,),数据窗口(,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 YK_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 = 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 = ,青霉素钠,针,Where YPXH = 5 AND YPMC = ,青霉素,;,Update YK_TYPK set YPMC = ,青霉素,钠,Where YPXH = 5 AND YPMC = ,青霉素,;,特点:,可同时修改同一行不同列的数据,提高操作的并发性;,当修改不同行或同一行同一列的数据时,不能保证数据的完整性。,数据窗口,灵活控制,数据窗口,导入导出,数据窗口对象的容器,数据窗口控件,Gf_Begin_Transaction(sqlca,),If,dw_1.,Update,() 1,then,gf_Rollback_Transaction(sqlca,),Messagebox,(,提示, ,数据保存错误,请与管理员联系!,Return,End If,Gf_commit_Transaction(sqlca,),第一步:定义实例变量,第二步:在数据窗口的,dberror,事件中编写脚本,Gf_Begin_Transaction(sqlca,),If,dw_1.,Update,() 1,then,gf_Rollback_Transaction(sqlca,),Messagebox,(,提示, ,数据保存错误,请与管理员联系!,+,is_ErrorText,),Return,End If,Gf_commit_Transaction(sqlca,),第三步:修改保存按钮中的提示语句,思考,:,DataStore,Update,时,如何显示错误消息?,Gf_Begin_Transaction(sqlca,),If,lds_ypxx.,Update,() ,1,then,gf_Rollback_Transaction(sqlca,),Messagebox,(,提示, ,数据保存错误,请与管理员联系!,),Return,End If,Gf_commit_Transaction(sqlca,),DataStore,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,用户对象的概念,用户对象是封装了一组相关代码和属性、完成特定功能的对象。,用户对象只需定义一次,就能反复使用多次,并且修改一次,就能把修改结果反映到所有使用该用户对象的地方。,用户对象的优势,避免了在应用程序的不同地方编写功能相同或相近代码的麻烦,提高了应用程序的可维护性。,用户对象可以把一组总在一起使用的可视控件组合在一起,构成一个完成特定功能的控件,应用程序可以在需要的地方随时使用它。,用户对象提供了构造具有一致外观可视部件的方法。,用户对象能够把相关功能封装在一起。,用户对象允许开发人员扩展某些,PB,系统对象(比如事务对象)的功能,用户对象的创建,用户对象的分类,类用户对象,可视用户对象,用户对象,类用户对象,使用时需要先定义对象的类型,并,用,Create,语句创建。,不再使用时,用,destory,语句删除对象,以释放内存空间,u_hzyb,lu_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,then,gf_Rollback_Transaction(sqlca,),Messagebox,(,提示, ,数据保存错误,请与管理员联系!,),Return,End If,Gf_commit_Transaction(sqlca,),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,更新数据时,使用如下方法,Gf_Begin_Transaction(sqlca,),If,lds_ypxx.,Update,() ,1,then,gf_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_ypxx.DataObject,= ,d_typk,lds_ypxx.SetTransobject(sqlca,),lds_ypxx.Retrieve,(),培训内容,事务(,Transaction,),事件(,Event,),函数,(,Function,),窗口,(,Window,),数据窗口,(,DataWindow),用户对象(,User Object,),继承,嵌入式,SQL,关于继承,可继承的对象:窗口、菜单、用户对象,事件的执行顺序:从祖先到子孙,事件的重载:,函数的重载:增加一同名同构函数,培训内容,事务(,Transaction,),事件,(,Event,),函数(,Function,),窗口,(,Window,),数据窗口(,DataWindow),用户对象(,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,优化的,Sql,语句:,/,变量申明,datetime,ldt_datebegin,ldt_dateend,ldt_datebegin,=,datetime(date(gf_server_date,(), time(“0:0:0”),ldt_dateend,=,datetime(date(gf_server_date,(), time(“23:59:59”),/,Sql,TZSJ = :,ldt_datebegin,AND TZSJ = :,ldt_dateend,少用字符串类型字段,多用数值型字段,要与其他表作连接用的字段,最好用数值型。因为,一般字符型位数相对数值型较长。用数值型字段,可减少,Sql,Server,检索比较的时间。,少用,/,不用,Cursor,,,多用,DataWindow,或,DataStore,。Cursor,在执行,Fetch,时始终与服务器保持通信,若在,Fetch,语句中嵌入查询或其他比较耗时的语句,将导致整个查询很慢。替代的办法是:先用,DataWindow,一次性检索数据到本地,再用循环替代,Fetch,。,尽量少用,OR,子句,OR,子句将导致,Sql,Server,用,Nested Loop,的方法检索数据,IN,子句中若为常量,,Sql,Server,实际上是转化为,OR,语句来实现。,IN,子句中应为常量,避免用子查询,如:医嘱项目执行模块,原来的,Sql,语句片段为:,(,ZXKS=0 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,谢谢!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!