1、 + ls_column + + ls_orderif dw_1.setsqlselect(ls_newsql)=1 then messagebox(警告,数据设置失败,stopsign!) dw_1.settransobject(sqlca) dw_1.reset() dw_1.retrieve() dw_1.setsqlselect(ls_oldsql)方法2:用describe()和modify()string ls_mod,ls_order,ls_old,ls_columnls_old=dw_1.describe(datawindow.table.selectdw_1.settrans
2、object(sqlca)ls_column=end choose ls_mod=datawindow.table.select= + ls_old + ORDER BY + ls_column + + ls_order + dw_1.modify(ls_mod)dw_1.retrieve()dw_1.modify(datawindow.table.select= + ls_old + 方法3:用setsort()和sort()string ls_sort,ls_order,ls_column12345ADls_sort=ls_column + dw_1.setsort(ls_sort)dw_
3、1.sort()如何检测数据窗口中数据是否被修改integer li_retif dw_wh.deletedcount() + dw_wh.modifiedcount() 0 then li_ret = messagebox(注意数据已经被修改,是否存盘?,Question!,YesNoCancel! choose case li_ret case 1 if dw_wh.update() = 1 then commit; return 0 else rollback; messagebox(出错存盘时出错!请检查数据的正确性。 return 1 end if case 2 case 3 end
4、 chooseend if 在PB下实现圆形的窗口 首先在窗口定义下列局部外部函数(Local External Functions.)FUNCTION ulong CreateEllipticRgn(ulong X1,ulong Y1,ulong X2,ulong Y2) LIBRARY gdi32.dllFUNCTION ulong SetWindowRgn(ulong hWnd,ulong hRgn,boolean bRedraw) LIBRARY user32.dll在窗口的open事件中加上:long hrgnlong lreshrgn=createellipticrgn(20,20
5、,400,400)/其中参数为左上到右下的坐标值,可修改。lres=setwindowRgn(handle(this),hrgn,true)/记得在窗口中放置一个按钮关闭窗口/在窗口处放置一幅图片即可实现圆形的窗口了。查阅API函数手册中有如下函数定义,应该是用来定义多边形窗口的,但不知如何使用。FUNCTION ulong CreateEllipticRgnIndirect(ref Rect lpRect) LIBRARY 动态实现下拉数据窗口DDDW的设定假设所设定列为部门号department_id,相关连的子数据窗口为d_dddw_dep,显示列为部门名称dept_name,数据列为部
6、门号dept_id,实现方法如下:dw_1.Modify(department_id.DDDW.Name=d_dddw_dep department_id.DDDW.DisplayColumn=dept_namedepartment_id.DDDW.DataColumn=dept_id或:dw_1.object.department_id.dddw.name = dw_1.object.department_id.DDDW.DisplayColumn = dw_1.object.department_id.DDDW.DataColumn = 注:PowerBuilder有一个小工具DWSynt
7、ax(程序名为:dwsyn60.exe),提供了获得及修改数据窗口、列等的各项属性值的语法,对编程非常有帮助.PB中表的修改对数据窗口和报表的影响的解决办法数据窗口(DataWindow)是PB最强大的功能之一,Datawindow是PB中获取专利技术的控件,它对数据的处理方法相当简洁,能处理各种显示格式和快速的报表制作能力。深受PB开发者的喜爱。但一件产品不可能十全十美,DataWindow也有不少缺点,其中对datawindow的所关联的数据表的一些变动,可能就会使辛辛苦苦做出的数据录入、维护界面、报表得重新做,特别是复杂中国式的报表,是令许多开发人员头痛的事情,而在其它开发语言如Delp
8、hi就不会存在此类问题。现在采用原型模型的开发的不少,使得开发中表的修改变得比较平常,为了解决已做的报表、数据界面主体不必重做,下面提出一些解决的方法,希望能对碰到此类问题的开发人员有所帮助,同时也希望能起到抛砖引玉的作用。1、问题一:表的字段增减。此问题比较容易解决。表的字段增加,打开DataWindow窗口,点击Data Source图标,将新字段在DataWindow窗口的Selection List选中,然后新的字段就会在添加到原datawindow窗口中,问题也就解决了。不过值得提醒的是若在输入数据DataWindow中添加字段,记得在数据窗口的Update Properties属性
9、中,将新字段在Updateable Columns列表中选中,否则新字段值不能提交;表的字段删除,打开DataWindow窗口,点击Data Source图标,先执行表的弹出菜单Seselect All,再执行Select All即可。2、问题二:表中字段的数据长度的修改打开DataWindow窗口,点击Data Source图标,先执行表的弹出菜单Seselect All,再执行Select All即可在数据窗口的Column Specification中看到修改长度的字段已为新的长度。不过别急,对于字符类型的字段,问题还未完全解决,选中已修改长度的字符类型字段,按鼠标右键,选择Proper
10、ties,再选择Edit属性中Limit的值为新的长度值,问题才解决。3、问题三:表中字段的数据类型的修改打开DataWindow窗口,点击Data Source图标,先执行表的弹出菜单Seselect All,再执行Select All即可。4、问题四:表的名称改变字段不变 4.1 点击Library库画板,选中要修改的数据窗口或报表。 4.2 按鼠标右键,选择弹出菜单项Export,或选择Entry菜单的Export项将数据窗口或报表到出后缀为.srd的文件,文件名默认为数据窗口或报表的名字。 4.3 在Powerbar工具条中选择Edit图标,打开刚存的文件。 4.4在File Edit
11、or中使用Replace替换按钮,将被修改文件中的含有老的表名字符串全部替换成新的表名,然后保存。 4.5选择Entry菜单的Import项,将刚修改过的文件导入,覆盖原来的数据窗口或报表,问题解决。对于问题4,若原数据窗口有检索参数(Retrieval Arguments)和Where子句,应先将它们删除,能后再进行操作,否则转换会失败,使用数据窗口的Previwe会报“select error 无效列名”。转换成功后再手工增加检索参数和Where子句。对于一些稍微复杂的表的变动,可通过上述的方法组合解决。如改变了表名又增加了字段并修改了原有字段长度的数据表,则解决步骤可为:先建与原表一样只
12、是表名不同的过度表,然后采用方法4;在过度表增加了字段,然后采用方法1;修改过度表中的某些字段长度形成新表,最后采用方法2,问题解决。本人在用PB开发MIS系统中使用以上方法,能比较快的复用开发原型中的报表和数据维护窗口,不过值得提醒大家的是,使用以上方法最好应先将原数据窗口进行备份,以防止误操作破坏了报表和数据维护窗口。PB中动态DataWindow的技术应用在PowerBuilder的应用程序开发过程中,对数据库中数据进行操作的对象是数据窗口对象(DataWindow),利用数据窗口对象,我们可以十分方便地完成对数据库中已经存在的表中数据进行检索、查询、插入、删除和更新。但是,在实际问题中
13、,我们常常遇到数据库中的一些表是用户在程序运行期间动态生成的,若要对这样表中的数据进行操作,就要运用动态数据窗口对象,值得提到的一点是,在动态数据窗口对象生成时,其标题区(Header Band)中的文本不能直接显示成汉字,这的确是一点遗憾,不过这个问题可以通过映射的方法得到解决。一、问题的提出设有如下两张表:A表中的记录是用户可以在程序运行期间进行自由增加、修改、删除和更新的,B表中的属性(即:字段)由A表中的记录决定并动态创建,而且,能够方便地对B表中的数据提供汉化的操作界面。当然,将B表创建为下表也是可以的,但是,在动态生成数据窗口对象时,其标题区(Header Band)中的文本不会显
14、示成汉字,而是一些乱码,反而不利于问题的解决。二、问题的解决1、动态创建B表的解决我们要动态创建B表,就要构建动态SQL语句。何谓动态SQL语句?数据库应用程序通常进行确定的工作,因此在编写和编译时,就可以确定完整的SQL语句,但当需要使用PowerBuilder不支持的嵌入SQL语句(如DDL语句),或者在编译时不知道语句的具体格式或参数,则在运行时构成SQL语句,这类语句被称为动态SQL语句。动态SQL语句的格式:EXECUTE IMMEDIATE SQL statement Using Transation Object;参数说明:SQL statement 包含一条有SQL语句的字符串
15、Transation Object事务对象2、动态数据窗口对象创建及标题区(Header Band)中文本汉化的解决(1)在程序运行时,我们可以调用Create函数动态生成数据窗口对象。格式如下:DataWindowControl.Create(Syntax,Errorbuffer)DataWindowControl 将在其中创建数据窗口对象的数据窗口控件名Syntax 数据窗口对象源代码Errorbuffer 用于保存错误信息的字符串(2)由于标题区(Header Band)中文本框的名称是对应细目区(Detail Band)中相应列的名称加上_t构成的,而细目区(Detail Band)中
16、列的名称又是相应表的属性的名称。因此,我们能够使用游标(Cursor)取出A表中的ywm和zwm的值,然后使用映射的方式替换标题区(Header Band)中文本框的文本(Text)属性,从而使标题区(Header Band)中文本框的文本显示为相应的汉字。三、一个简单的例子在PowerBuilder 6.5和MS SQL Server 6.5的环境下,使用一个简单的例子实现上述的观点,限于篇幅,只列出主要界面及关键程序。1、动态创建B表按钮对应的代码是:int li_i=1,li_countstring ywm,zdlx,ls_temp,ls_sql/使用游标(Cursor)从数据库的表中获
17、取ywm和zdlx的值并存储于数组ywm和zdlx中select count(*) into :li_count from a;DECLARE a_cur CURSOR FOR SELECT ywm,zdlx FROM a order by ywm;OPEN a_cur ;FETCH a_cur INTO :ywmli_i, :zdlxli_i ;do while sqlca.sqlcode=0 ls_temp = trim(zdlxli_i) choose case ls_temp case 1 ls_temp = char(10)2numeric(7,2) zdlxli_i = ls_te
18、mp ywmli_i = trim(ywmli_i) li_i + FETCH a_cur INTO :loopclose a_cur;/创建B表和主键(Primary Key)ls_sql = create table b + (+ywm1 + + zdlx1 + not null,constraint pk_b primary key ( + ywm1 + )execute immediate :ls_sql;/增加B表的列for li_i=2 to li_count ls_sql=alter table b add + ywmli_i + + zdlxli_i execute immed
19、iate :end for2、动态创建数据窗口对象string syntax, sqlselect, errmsg, ls_col1, ls_col2, ls_name, ls_b;/动态创建数据窗口对象DataWindowls_b = bsqlselect = select * from + ls_b;syntax = sqlca.syntaxfromsql(sqlselect, style(type=grid), errmsg);dw_1.create(syntax)/汉化标题区(Header Band)文本DECLARE v_cur CURSOR FOR SELECT ywm, zwm
20、FROM a order by ywm;OPEN v_cur ;FETCH v_cur INTO :ls_col1, :ls_col2 ;do while sqlca.sqlcode = 0 ls_name = ls_col1 + _ + t.text= + ls_col2 + dw_1.modify(ls_name) FETCH v_cur INTO :close v_cur;dw_1.settransobject(sqlca);PowerBuilder制作IE风格的图标按钮 本文介绍在PowerBuilder中实现IE风格的图标按钮的技巧。在C+ Builder开发工具中,有一种图标按钮(
21、SpeedButton),这种按钮可以在鼠标移入按钮后,在图片的周围会出现凸出的边框,鼠标移出按钮后边框消失。而在PowerBuilder中没有提供这种功能的按钮,为了使开发的应用程序界面更丰富,我们使用自定义图形控件(Picture)扩展并实现了此功能,这种方法设计出的程序简洁实用。一、实现功能 按钮可以显示四种状态图形: 1、Normal状态; 2、Disabled状态; 3、MouseOver状态(鼠标进入按钮区); 4、ClickDown状态(鼠标按下)。 二、关键方法 1、当鼠标进入按钮区域时,控件图片改换成MouseOver状态的图片,并设置状态信号; 2、鼠标滑入按钮区域后用Wi
22、ndows API函数SetCapture来捕获鼠标输入消息,跟踪鼠标位置; 3、当监测到鼠标滑出按钮区域时,用ReleaseCapture函数释放鼠标捕获,恢复按钮图片到Normal状态并设置状态信号; 4、改变控件的图片(PictureName)前,先用ReleaseCapture释放鼠标捕获,然后改变PictureName属性值,接着重新调用SetCapture函数,因为改变图片后PowerBuilder重新建立了控件窗口,窗口的句柄(hWnd)也随之改变了。 三、设计过程 1、新建“User Object” -选择Visual的Standard类 -选择“Picture”; 2、定义全
23、局的或局部的外部函数:/ * / Declare External Functions function ulong SetCapture (ulong hwnd) library function boolean ReleaseCapture (ulong hwnd) library function boolean DrawEdge(ulong hdc, ref rect qrc, uint edge, uint grfFlags) library 3、定义结构数据类型 RECT long left long top long right long bottom 4、定义控件共享变量:/
24、Declare Shared Variables boolean sb_SuppressHoverBorder 5、定义控件实例变量:/ Declare Instance Variables Private:boolean ib_MouseCaptured Public:string is_PicNormal string is_PicDisabled string is_PicMouseOver string is_PicClickDown int in_State 6、定义用户事件:/ Declare User Events Event Name=mousemove, ID=pbm_mousemovelbuttondownpbm_lbuttondownlbuttonuppbm_lbuttonup 7、编写事件代码:/ “Constructor” 事件代码 / * begin constructor event * / is_PicNormal = this.PictureName is_PicDisabled = Disabled状态图片.bmpis_PicMouseOver = MouseOver状态图片.bmpis_PicClickDown = ClickDown状态图片.bmpin_State = 0 sb_SuppressHoverBorder = FAL
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1