pb中datawindow常用技巧_第1页
pb中datawindow常用技巧_第2页
pb中datawindow常用技巧_第3页
pb中datawindow常用技巧_第4页
pb中datawindow常用技巧_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、pb中datawindow常用技巧一(2009-04-16 17:09:07) 转载标签: 杂谈分类: PowerBuilder pb中datawindow常用技巧一1、如何让存储文件目录的列,显示图片?答:选择对应的column的display as picture属性为true2、如何复制grid类型的所选择的行的数据到系统剪切板?答:string ls_selectedls_selected=dw_1.Object.DataWindow.Selected.Dataclipbord(ls_selected)4、如何设置的DW底色?在DW的editsource中改变color的值5、如何将G

2、rid风格改成自由格式?在DW的editsource中将processing=1的1改为06、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B风格?复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可7、如何实现gird风格的datawindow的多栏表头?答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下:x=100t integer(describe(firstcol.x) width=100tinteger(describe(lastcol.x

3、) - integer(describe(firstcol.x) +integer(describe(lastcol.width)8、如何过滤dddw编辑风格的显示值为指定值的记录?答:dw_1.setfilter(lookupdisplay(column_name)=+ls_display_value_your+)dw_1.filter()9、如何设置datawindow的某一列为空?答:string ls_tempsetnull(ls_temp)dw_1.object.columnname.primary.current=ls_temp10、如何设置datawindow的单双行不同颜色间隔

4、?答:在detail带区的color属性表达式中写上if(mod (getrow(),2)=1 ,rgb(255,0,0),rgb(0,255,0),如果是当前行以第三种颜色表示,表达式如下:if(getrow()=current(), rgb(255,0,0),if(mod(getrow(),2)=1 ,rgb(0,0,255),rgb(0,255,0)11、如何获取指定名称的datawindowobject?答:DWObject ldwo_use,ldwo_abc ldwo_use = dw_1.Object ldwo_abc = ldwo_use._get_attribute(t_1,F

5、ALSE)/t_1为datawindow中text对象的名称12、如何缩放datawindow的打印大小?答:dw_1.object.datawindow.zoom=150 or dw_1.object.datawindow.zoom=7513、如何在已过滤后的数据基础上对datawindow进行过滤?答:dw_1.setfilter(dw_1.describe(datawindow.table.filter)+your_join+your_new_filter)dw_1.filter()14、如何在datawindow中显示动态时间?答:建立一个计算域,表达式为string(datetime

6、(today(),now(),yyyy年mm月dd日 hh点mm分ss秒),同时设置datawindow的属性dw_1.Object.DataWindow.Timer_Interval=50015、如何让带用title bar的datawindow控件的标题栏诚活动窗口的颜色?答:外部函数定义:funcation logn SetActiveWindow(long hwnd ) Library user32.dlldatawindow控件的clicked事件代码:setactivewindow(handle(this)16、如何设置datawindow的当前行指示图标?答:在datawindo

7、w中建立一个计算列,expression为,并将该计算列移动为datawindow的第一个列,在datawindow控件的rowfocuschanged事件中写入代码:SetRowFocusIndicator(hand!)或setrowfucsindicator(p_1)/p_1为窗口上的picture控件名17、如何通过代码打开dddw?答:定义外部函数引用声明SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY user32.dll代码如下: constant integer VK

8、_F4 = 115dw_1.SetFocus()dw_1.SetColumn( dept_head_id ) /设置当前dddwkeybd_event( VK_F4,0,0,0 ) / 按下F4键keybd_event( VK_F4,0,2,0 ) / 释放F4键18、如何打印datawindow的内容到文件中?答: dw_1.object.datawindow.print.fileName =c:temp.prndw_1.print()19、如何设置dddw的初始值?答:dw_1.object.columnname.Initial=your_initial_value20、如何只显示不同的数

9、据?答:dw_1.filter(isnull(columnname-1) and columnnamecolumnname-1)dw_1.filter()21、如何让带有title bar的datawindow不可以移动?答:在datawindow的自定义事件ue_nchittest(pbm_nchittest)中写入如下代码:return 122、如何在N-UP显示风格中建立基于第N栏中的列的计算列?答:如column有两列,number和price ,并显示为两栏,则第一栏的cost计算列的expression为number*price,第二栏的cost_1计算列的expression为n

10、umber1*price123、如何清空ddlb或edit.codetable中项目?答:dw_1.Object.columnname.Values=24、如何实现指定的column的字体旋转90度?答:dw_1.object.columnname.font.Escapement =90025、如何获取datawindow的sql代码?答: 可以通过以下四种方法获取sql代码:string szselectszselect=dw_1.describe(datawindow.table.select)szselect=dw_1.describe(datawindow.table.sqlselec

11、t)szselect=dw_1.describe(datawindow.table.select.attribute)szselect=dw_1.getsqlselect()27、如何获取datawindow对象占有的虚拟存储的容量?答:使用datawindow.storage属性举例:在datawindow控件的retrieverow事件中,写如如下代码:long lstoragelstorage=long(dw_1.object.datawindow.storage)if lstorage50000 then dbcancel()28、如何连续在同一张纸打印两个数据窗口?答:dw_1.ob

12、ject.datawindow.print.filename=temp.prndw_2.object.datawindow.print.filename=temp.prndw_1.print()dw_2.print()29、如何设置datawindow分组后每个分组中的记录号?答:建立一个计算列,expression为 getrow() - first(getrow() for group 1)+130、如何实现在datawindow中只有新增的行,才可以编辑?答:在所有的column的protect属性表达式中写入以下表达式:if(isrownew(),0,1)31、除了循环以外,有没有更好

13、的方法统计数据窗口中处于选中状态的行数?一般习惯于使用循环来统计数据窗口中处于选中状态的行数,有没有更好的方法?其实此问题在应用上用处不大,讨论一下,活跃一下思维还是有好处的。方法一: long ll_Selected ll_Selected = long(dw_1.describe(evaluate(sum( if(IsSelected(), 1, 0) for all),1)方法二: long ll_Selected ll_Selected = long(dw_1.describe(evaluate(count(IsSelected() for all),1)方法三:upperbound(

14、dw_1.Object.Data.Selected)32、问:怎么让PB只打印当前记录,是用Free格式制作的数据窗口!-答:DataStore ldt_templong ll_Row , ll_Rowsll_Rows = dw_XX.Rowcount()If ll_Rows = 0 Then GoTo the_endIf ll_Rows = 1 Thendw_XX.Print()GoTo the_endEnd ifdw_XX.SetRedraw(False)ldt_temp = Create DataStoreldt_temp.DataObject = dw_XX.DataObjectll_

15、Row = dw_XX.GetRow()dw_XX.RowsMove(1 , ll_Rows , Primary! , ldt_temp , 1 , Primary!)ldt_temp.RowsMove(ll_Row , ll_Row , Primary! , dw_XX , 1 , Primary!)dw_XX.Print()dw_XX.RowsMove(1 , 1 , Primary! , ldt_temp , ll_Row , Primary!)ldt_temp.RowsMove(1 , ll_Rows , Primary! , dw_XX , 1 , Primary!)Destroy

16、ldt_tempdw_XX.SetRedraw(True)the_end:/ 只用将上述脚本拷入到打印部分即可,dw_XX为被打印的free型数据窗口,该方法可保证dw_XX中的数据在打印前后包括sort等属性均不发生任何改变,但效率较低,不宜用在数据量太大的数据窗口中,当然,考虑到打印本身速度就比较慢,所以3000行数据是可以采用这种方法并让用户接受的。若在同一窗口上存在与dw_XX共享的grid数据窗口并且与dw_XX同时显示,则需要与dw_one一起SetRedraw()38、字段如何自动换行的同时且自动高度?答:将数据窗口中相应列的auto horz scroll 为不选中,选中aut

17、osize height 将detail的autosize height选中。在数据窗口retrieve 后调用下面函数即可 uf_set_text(datawindow adw_content,string as_columns,boolean,ab_ignoreblank) if (not isvalid(adw_content) or isnull(as_columns) or len(as_columns)1 or isnull(ab_ignoreblank) then return -1 n_cst_string lnv_string string ls_column , ls_wi

18、dth ,as_source,as_replaced ,ls_temp int li_upperbound , li_width , li_column , li_fontWidth, li_counter long ll_rowcount , ll_row , ll_totalstep int li_yield lnv_string.of_parsetoarray(as_columns,ls_column) li_upperbound = upperbound(ls_column) ll_rowcount = adw_content.rowcount() if li_upperbound1

19、or ll_rowcount1 then return -1 openwithparm(w_waiting,this) ib_cancel = false iw_frame.enabled = false ll_totalstep = ll_rowcount * li_upperbound w_waiting.uf_register(ll_totalstep) for li_column = 1 to li_upperbound ls_width = adw_content.describe(ls_columnli_column+.width) li_width = integer(ls_wi

20、dth) if ls_width=! or ls_width=? or li_width=0 then continue end if /ls_temp = adw_content.describe(ls_columnli_column+.Fperty = width ) /messagebox(ls_columnli_column+.Fperty = width ,ls_temp) /return 1 li_fontwidth = 27 li_counter = li_width / li_fontWidth for ll_row=1 to ll_rowcount

21、 if ib_cancel then iw_frame.enabled = true return 0 /pressed cancel button end if as_source = adw_content.getitemstring(ll_row,ls_columnli_column) as_replaced = uf_insertstring(as_source,li_counter, ,false) if as_replacedas_source then adw_content.setitem(ll_row,ls_columnli_column,as_replaced) end i

22、f w_waiting.uf_stepit() next next close(w_waiting) iw_frame.enabled = true return 139、如何使dw的列不可移动,不可调整列宽?答:在datawindow的cilcked事件写 if row=0 then return 1 end if40.光标跳转到数据窗口的某一行某一列dw_1.scrolltorow(ll_row) dw_1.setcolumn(ll_column)41 如何使光标指向每页第一行?long ll_firstrowonpage=long(dw_1.describe(datawindow.fir

23、strowonpage)dw_1.scrolltorow(ll_firstrowonpage)dw_1.setrow(ll_firstrowonpage)42. Grid的窗口如何使第一列固定不动?选上data OBJECT的HSplitScroll属性 在constructor事件中: dw_1.Object.DataWindow.HorizontalScrollSplit=integer(dw_1.describe(#1.width) /第一列的宽度 在scrollhorizontal事件中: int iif pane = 1 theni = integer(this.OBJECT.dat

24、awindow.horizontalscrollposition2)if i 0 thenthis.OBJECT.datawindow.horizontalScrollPosition = 0end ifelsei = integer(this.Object.DataWindow.HorizontalScrollSplit)if i scrollpos thenthis.OBJECT.datawindow.horizontalScrollPosition2 = iend ifend ifpb中datawindow常用技巧二(2009-04-16 17:11:40) 转载标签: 杂谈分类: Po

25、werBuilder 1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Protect 属性设置为:If( IsRowNew(), 0, 1) )在 PowerScript 中可以动态修改 Protect 属性:dw_1.Modify(column_name_here.Protect=1tIf(IsRowNew(),0,1)这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。2 如何在DataWindow中实现列的自动折行我们在P

26、owerBuilder应用程序的开发过程中, 使用DataWindow时, 经常会遇到某列的数据太长, 不能同时全部显示的情况. 若采用自动水平滚动, 操作起来又不够简便. 下面介绍一种方法, 实现列数据多行显示, 即实现列数据的自动折行.具体步骤如下:1) 在DataWindow Painter中打开此DataWindow.2) 在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口.3) 选择Position标签, 选中Autosize Height 多选框.4) 选择Edit标签, 不选中Auto Horz Scroll多选框.5) 单击OK按钮, 保存所做的修改.6) 点中Detail

27、Band (即写有Detail的灰色长带), 单击鼠标右键, 选择Properties. 菜单项.7) 选中Autosize Height多选框.8) 单击OK按钮, 保存所做的修改.9) 保存此DataWindow.注意:连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不会自动进行折行.3 在数据窗口中实现动画要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在TimerInterval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。比如要改变某字段的背景颜色,可设ackgound.color=RGB(I

28、nteger(Right(string(now(),hhmmssf),1)*256/10,Integer(Right(string(now(),hhmmssf),1)*256/10,0)当然,您不仅可以改变背景颜色,而且可以改变字体等等任何属性,使他可以动起来!4 使数据窗口中的被选中行具有更好的外观大家都知道,在选择数据窗口中的某一行时,如果使用pb提供的选择函数SelectRow(),那么的外观真是不能恭维,单调而古板的蓝色背景,可能和您的漂亮而生动的应用程序格格不入。有没有办法改变呢?当然有啰,请听我慢慢道来。改变某一行的背景比较简单,改变每一列的背景属性(backgroundcolor

29、)即可,可要根据鼠标选择情况自动改变,并可以返回被选中的行可能还需要一定的技巧。下面分单行选择和多行选择分辨说明。单行选择单行选择比较简单,我们只要将所有字段的背景色的表达式改为:if(GetRow()=CurrentRow(),RGB(255,126,0),RGB(0,0,0)其中第一个颜色为被选中的颜色,第二个颜色未被选中的颜色。然后用GetRow()代替GetSelectedRow()函数来得到被选中的行。多行选择多行选择比较复杂,如果单纯依靠改变数据窗口的属性没法实现,我们必须使用数据窗口属性和代码结合起来才能实现 首先,改变数据窗口的SQL语句,增加一个计算字段:0 asflag,S

30、elect 语句改为:Select col1,col2 ,1 as flag from tablename where .,当返回数据窗口painter时,您就会发现多了一个字段flag,我们就是利用这个字段保存行被选中的信息。其次,修改各个字段的背景颜色属性,设置为:if(flag=1,RGB(255,126,0),RGB(255,255,255)第三:在数据窗口控件中,增加对clicked 事件的处理,代码如下:if row1 then return / setredraw(false)if this.o b j e c t.flagrow=1 then /如果该行被选中,撤销选择,否则选

31、中该行this.Object.flagrow=0elsethis.Object.flagrow=1end ifsetredraw(true)您还可以定制本选中行的字体,文本属性等等。原理相同,不再赘述。5 将日期型字段初始化为当天的日期 使用 Column Specifications 对话框来设置数据的初始值是一个比较好又比较通用的方法。为了将日期型字段初始化为当天的日期,只要设置初始化值为today,而不是today()即可。同样设置初始值为NUll,可以使用null,而不是null()。6 在DataWindow中调整列顺序在 Gird 风格的 DataWindow 中,列的排列顺序是按

32、照你选择 Column 的顺序排列的,并且不能改变.要改变列的顺序则必须重新制作 DataWindow.最近我发现一个办法可以改变列的顺序: 在 DataWindow画板中打开要修改的 DataWindow,然后按Preview 按钮切换到预览模式下,选择要移动的列标题并拖动到预定位置,然后返回 DataWindow 画板,存盘即可.7 Retrieve时不清除原有Datawindow数据当你调用Retrieve函数,PowerBuilder自动清除原有DataWindow然后Retrieve数据。在Datawindow RetrieveStart事件中,使用Return 2,这样PowerB

33、uilder不会清除原有数据而是追加新数据。8 美化DataWindow的显示效果使DataWindow 的单双行显示颜色不同,不仅仅可以使你的应用程序更显专业性,并使数据的可读性增强。先调出你需要改动的DataWindow,在Detail band按下右键选择Properties,选择Tab页中的Expressions,在color属性中输入下面内容:(注意是在Detail明细显示段按右键,而不是在Column上) IF(MOD(GETROW(),2)=0,RGB(192, 192,192), RGB(255, 255, 255) 马上Preview一下,看一看效果如何。9 用Line建立漂

34、亮的Grid DataWindow的技巧虽然PowerBuilder有Grid风格的DataWindow,但不够灵活,如果想打印一张边框粗线条或双线,内框为细线条的表格直接使用Grid 风 格的DataWindow就不能实现。因此许多人都用Tabular风格的DataWindow,然后自己用Line来实现Grid。在调整线条位置是一个即伤脑筋又伤眼睛的事件,而一旦需要调整行高,所有工作都得重来,试一试用下面方法,会大大减轻你的工作量:在vertical lines,改变它的属性,在ExpressionsTab上,y1行上输入0,y2行上输入rowheight() - 1 在horizontal

35、 lines, 设置 y1 和 y2 = rowheight() - 5 这样PowerBuilder会自动调整线的坐标,你只需要设置横线的长度和x1,x2的坐标即可。 马上Preview一下,看一看效果!你再也不需要因为行的高度发生改变而重新调整线条位置。10 如何创建一个报表,如下形式Quantity Running Total5,000 5,0002,500 7,5003,000 10,50012,000 22,500对于Running Total列,我们可使用计算列:CumulativeSum(Quantity for all),即可达到逐渐递增求和的功能。11 数据窗口的数据送缓冲区

36、之前确认的四个步骤判断数据类型是否正确。如不正确则触发ItemError事件。判断数据是否符合有效性规则。如不符合有效性规则,同样触发ItemError事件。判断是否有数据被改动。判断数据是否通过ItemChanged事件,如果数据和ItemChanged相斥,将触发ItemError事件。12 如何在DataWindow中用数据类型为Datetime的列为条件进行查找1当要查找的日期条件是一常数时使用如下表达式:ls_Find = datetime_col = DateTime (1/1/1999)2当要查找的日期条件是一个变量时使用如下的表达式:ls_Find = datetime_col

37、 = DateTime ( +ls_Date + )3当要查找的日期条件是一个DateTime数据类型时使用如下表达式:ls_Find = datetime_col = DateTime ( +String (ldt_DateTime) + )13 设置数据窗口Boolean型属性的三种方法PowerBuilder提供了三种方法设置数据窗口的布尔型属性,分别是True/False, 1/0, Yes/No。例如:dw_1.Object.address.Visible = 0 dw_1.Object.address.Visible = Falsedw_1.Object.address.Visib

38、le = NoPowerBuilder在处理上以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用带双引号的数字来表达。14 如何在DataWindow中快速删除多行在开发过程中可能经常有要进行多行删除的操作,一般都使用循环语句进行操作:FOR ll_RowOn = 1 TO dw_1.RowCount() dw_1.DeleteRow(ll_RowOn) NEXT一个快速的删除方法是把要删除的行从主缓冲区中移到删除缓冲区中。例如,删除缓冲区中所有的行:dw_1.RowsMove(dw_1,

39、1, dw_1.RowCount, Primary!, dw_1, 1, Delete!)不过不要忘了过滤的行在不同的缓冲区中。15 如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行起先对你要显示唯一值的列进行排序:city A,然后增加如下过滤字符串: city city -1 or GetRow () = 116 如何在分组形式的DataWindow中分别显示各组的行号当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为GetRo

40、w() - First(GetRow() for Group 1) + 1的计算列。17 如何改变列的字体颜色,提醒用户此列已做修改在列的Color属性中,输入如下表达式IF (column_name column_name.Original, RGB(255, 0, 0), RGB(0, 0, 0)。在这个条件中,如果此列已改变,则显示红色字体,否则显示黑色字体。这个表达式主要用column_name column_name.Original比较当前列的值和原始列的值是否相同来达到判断的目的。18 在数据窗口中移走行,但不是去做过滤或删除操作RowsDiscard()函数可做到这一点,它在数

41、据窗口中执行移除工作,但被移走的行它不可被删除或做任何修改性的保存。19 如何在多行显示的DataWindow 中的FooterBand中显示当前数据的首行和最后行的行号我们先看两个计算列的表达式: IF (GetRow() = First(GetRow() FORPage), 1, 0) / 1 为当前页的第一行IF (GetRow() 1 AND GetRow() = Last(GetRow() FOR Page), 1, 0) / 1 为当前页的最后一行由上面可知,在Footer Band中设置如下计算列表达式:Rows + String(First(GetRow() FOR Page)

42、 + to + String(Last(GetRow() FORPage) + are displayed。即可达到这项功能。20 使可编辑的数据窗口只读有时,你可能需要将一个用于编程的数据窗口用作显示目的,可以有以下几种方法来实现这一要求:1.建立两个数据窗口,一个用于编辑,一个用于显示2.将数据窗口中的全部对象的taborder设置为0.3.也可以将数据窗口中的列的protect属性设为On或Off,但你不能使用protect属性进行编辑操作4.数据窗口有一个将datawindow设为只读的属性(readonly),使用它最方便。21 数据窗口检查重复行dw_1.SetSort (user

43、_id A)dw_1.Sort()dw_1.SetFilter (user_id = user_id-1)dw_1.Filter()if dw_1.RowCount() 0 then Messagebox(注意, 用户编码重复.)end ifdw_1.SetFilter ()dw_1.Filter()22 如何在分组形式的DataWindow中分别显示各组的行号- 当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()- 计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为GetRow() - First(GetRow() for

44、 Group 1) + 1的计算列。23 如何能让数据窗口的某几列在其他列横拉时固定不动/ 功能说明:用于冻结左边的滚动栏/ 变更记录: 变更或版本更新的时候/int iif pane = 1 theni = integer(this.o b j e c t.datawindow.horizontalscrollposition2)if i 0 thenthis.o b j e c t.datawindow.horizontalScrollPosition = 0end ifelsei = integer(this.Object.DataWindow.HorizontalScrollSplit

45、)if i scrollpos thenthis.o b j e c t.datawindow.horizontalScrollPosition2 = iend ifend if24 在数据窗口中如果要使其中一列的属性为只读,也就是不允许用户修改,那么只需简单地将这一列的TableOrder 设置成0就可。然而,在有些情况下需要对这一列的某些行修改,而某些行不能修改,这就要用到这一列的protect属性了。打开列的属性中的Expressions,在protect中输入条件判别式。例如:允许用户修改新增加的记录,而检索出来的记录则不允许修改。条件判别式可以写成如下:if(isRowNew(),0

46、,1)在 PowerScript 中可以动态修改 Protect 属性:dw_1.Modify(column_name_here.Protect=1tIf(IsRowNew(),0,1)这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。25 控制DATAWINDOW里每页显示的行数1、在Datawindow中增加一个计算域,起名为:ceil_page,此计算域必须放在Detail段中,Expression中输入 ceiling(getrow()/25) 25表示每页打印25行,也可以是一个参数。2、分组,选择菜单RowsCreate Group,选择ceil_page按

47、ceil_page分组,并选中New Page OnGroup Break(意思是新组开始时换页)。3、将此计算域设为隐藏(在属性页中的expression页中在visible属性中写0)。4、补空行:在窗口的open事件中写如下代码:long li_count,li_ili_count=dw_1.retrieve()if mod(li_count,25)0 thenfor li_i=1 to 25 - mod(li_count,25)dw_1.insertrow(0)nextend if26 数据窗口的closeQuery事件:提示保存数据dw_1.AcceptText()IF dw_1.M

48、odifiedCount() + dw_1.DeletedCount() 0 THENCHOOSE CASE MessageBox(操作提示,数据已经发生变化,是否保存?,Question!,YesNoCancel!,1)CASE 1cb_save.TriggerEvent(clicked!)CASE 2Return 0/不做任何操作直接关闭窗口CASE 3Return 1/不会运行Close Event,维持原来的情况END CHOOSEEND IF27 Getchild函数主要被用来得到一个数据窗口的子数据窗口该函数在两种情况下可以使用,1、取出数据窗口对象的下拉式数据窗口;2、取出复合风

49、格(composite)数据窗口对象里所嵌入的子数据窗口对象。语法:integer dwcontrol.GetChild (string name, REFDataWindowChild dwchildvariable )例子1 这段程序取出一个composite数据窗口对象的两个子数据窗口,并对他们进行过滤,和排序的操作。String ls_filterDataWindowChild dwc_czrw,dwc_czx/定义子数据窗口变量dw_dy.Settranso b j e c t(sqlca)dw_dy.Retrieve()dw_dy.GetChild(dw_2,dwc_czrw)dw

50、_dy.Getchild(dw_1,dwc_czx)ls_filter = czrw_bh =+dw_3.GetItemString(dw_3.GetRow(),czrw_bh)+/过滤条件dwc_czrw.SetFilter(ls_filter)dwc_czrw.Filter()ls_filter = czx_rwbh =+dw_3.GetItemString(dw_3.GetRow(),czrw_bh)+dwc_czx.SetSort(czx_sx A)dwc_czx.Sort()dwc_czx.SetFilter(ls_filter)dwc_czx.filter()当然也可以通过数据共享

51、(ShareData)等方式操作子数据窗口中的数据。访问复合数据窗口对象.方法 :dw_dy.o b j e ct.dw_1.o b j e c t.对象例子2 下拉数据窗口动态过滤 在数据窗口dw_1的ItemFocusChanged事件中写入如下脚本:Integer rtncodeString ls_nowFld,ls_deptid,ls_sqlDataWindowChild fld_childrtncode = dw_1.GetChild(Unit_id,fld_child) /获得Unit_id字段名下拉数据窗口的句柄If rtncode = -1 Then MessageBox(错误

52、!, 不是下拉数据窗口!)fld_child.SetTransObject(SQLCA) /设置事务对象ls_sql = Lower(fld_child.GetSQLSelect()/ 获得DDDW的SQL语句/ 去除Sql 语句中的Where条件子句, 如原Sql 语句中须有Where条件子句,此处则需进行较/复杂的处理,应视具体情况而定。if Pos(ls_sql, where )0 then ls_sql = Left(ls_sql,Pos(ls_sql, where )/重新设置Sql 语句中的Where条件子句ls_deptid=dw_1.Object.dept_idGetRow()

53、 /取得当前dept_id选定值ls_sql = ls_sql + Where dept_id = +Trim(ls_deptid)+/重新设置Sql 语句fld_child.SetSQLSelect(ls_sql)fld_child.Retrieve()/取得满足条件的数据28 从数据窗口中获取数据 单条:假设我们要读取dept_id字段的第一笔数据,可以用下列方式表示li_id = dw_1.o b j e c t.dept_id1假设我们要读取第一行中第二个字段的数据,可以用下列方式表示ls_name = dw_1.o bj e c t.DATA1,2假设我们要读取dept_id字段的所有数据,可以用下列方式表示li_array = dw_1.o b j e c t.dept_id.CURRENT假设我们要读取过滤缓冲区 (filter buffer) 内dept_id字段的第一笔数据,可以用下列方式表示li_id = dw_1.o b je c t.dept_id.Filter1假设我们要读取从第二笔数据的第一个字段到第三笔数据的二个字段之间的数据,表示lstr_array= dw_1.o b j e c t.DATA2,1,3,2假设我们要读取整个第二笔的数据,可以用下列方式表示lstr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论