2023年12月13日发(作者:)
pb中datawindow常用技巧一
(2009-04-16 17:09:07)
转载▼
标签: 分类: PowerBuilder
杂谈
pb中datawindow常用技巧一
1、如何让存储文件目录的列,显示图片?
答:选择对应的column的display as picture属性为true
2、如何复制grid类型的所选择的行的数据到系统剪切板?
答:string ls_selected
ls_selected=dw_
clipbord(ls_selected)
4、如何设置的DW底色?
在DW的editsource中改变color的值
5、如何将Grid风格改成自由格式?
在DW的editsource中将processing=1的1改为0
6、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B风格?
复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可
7、如何实现gird风格的datawindow的多栏表头?
答:添加 text到header带区,并设置band属性为foreground保存,edit source
修改text的x和width属性表达式如下:
x="100~t integer(describe('firstcol.x')"
width="100~tinteger(describe('lastcol.x')) -
integer(describe('firstcol.x')) +integer(describe(''))
8、如何过滤dddw编辑风格的显示值为指定值的记录? 答:dw_ter("lookupdisplay('column_name')='"+ls_display_value_your+"'")
dw_()
9、如何设置datawindow的某一列为空?
答:string ls_temp[]
setnull(ls_temp)
dw_t=ls_temp
10、如何设置datawindow的单双行不同颜色间隔?
答:在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_ ldwo_abc =
ldwo_use.__get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称
12、如何缩放datawindow的打印大小?
答:dw_=150 or dw_=75
13、如何在已过滤后的数据基础上对datawindow进行过滤?
答:dw_ter(dw_be("")+your_join+your_new_filter)
dw_()
14、如何在datawindow中显示动态时间?
答:建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日 hh点mm分ss秒'),同时设置datawindow的属性dw__Interval=500
15、如何让带用title bar的datawindow控件的标题栏诚活动窗口的颜色?
答:外部函数定义:
funcation logn SetActiveWindow(long hwnd ) Library ""
datawindow控件的clicked事件代码:
setactivewindow(handle(this)) 16、如何设置datawindow的当前行指示图标?
答:在datawindow中建立一个计算列,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 ""
代码如下: [constant integer VK_F4 = 115
dw_us()
dw_umn( "dept_head_id" ) //设置当前dddw
keybd_event( VK_F4,0,0,0 ) // 按下F4键
keybd_event( VK_F4,0,2,0 ) // 释放F4键
18、如何打印datawindow的内容到文件中?
答: dw_me ="c:"
dw_()
19、如何设置dddw的初始值?
答:dw_l="your_initial_value"
20、如何只显示不同的数据?
答:dw_("isnull(columnname[-1]) and columnname<>columnname[-1]")
dw_()
21、如何让带有title bar的datawindow不可以移动?
答:在datawindow的自定义事件ue_nchittest(pbm_nchittest)中写入如下代码:
return 1
22、如何在N-UP显示风格中建立基于第N栏中的列的计算列?
答:如column有两列,number和price ,并显示为两栏,则第一栏的cost计算列的expression为number*price,第二栏的cost_1计算列的expression为number[1]*price[1]
23、如何清空ddlb或ble中项目?
答:dw_=""
24、如何实现指定的column的字体旋转90度?
答:dw_ment ="900" 25、如何获取datawindow的sql代码?
答: 可以通过以下四种方法获取sql代码:
string szselect
szselect=dw_be("")
szselect=dw_be("ect")
szselect=dw_be("ute")
szselect=dw_select()
27、如何获取datawindow对象占有的虚拟存储的容量?
答:使用e属性
举例:在datawindow控件的retrieverow事件中,写如如下代码:
long lstorage
lstorage=long(dw_e)
if lstorage>50000 then dbcancel()
28、如何连续在同一张纸打印两个数据窗口?
答:dw_me=""
dw_me=""
dw_()
dw_()
29、如何设置datawindow分组后每个分组中的记录号?
答:建立一个计算列,expression为 getrow() - first(getrow() for group 1)+1
30、如何实现在datawindow中只有新增的行,才可以编辑?
答:在所有的column的protect属性表达式中写入以下表达式:
if(isrownew(),'0','1')
31、除了循环以外,有没有更好的方法统计数据窗口中处于选中状态的行数?
一般习惯于使用循环来统计数据窗口中处于选中状态的行数,有没有更好的方法?其实此问题在应用上用处不大,讨论一下,活跃一下思维还是有好处的。
方法一: long ll_Selected ll_Selected =
long(dw_be("evaluate('sum( if(IsSelected(), 1, 0) for
all)',1)"))
方法二: long ll_Selected ll_Selected =
long(dw_be("evaluate('count(IsSelected() for all)',1)"))
方法三:upperbound(dw_ed)
32、问:怎么让PB只打印当前记录,是用Free格式制作的数据窗口!
---------------------------------------------------------------
答:
DataStore ldt_temp
long ll_Row , ll_Rows
ll_Rows = dw_nt()
If ll_Rows = 0 Then GoTo the_end If ll_Rows = 1 Then
dw_()
GoTo the_end
End if
dw_raw(False)
ldt_temp = Create DataStore
ldt_ject = dw_ject
ll_Row = dw_()
dw_ve(1 , ll_Rows , Primary! , ldt_temp , 1 , Primary!)
ldt_ve(ll_Row , ll_Row , Primary! , dw_XX , 1 , Primary!)
dw_()
dw_ve(1 , 1 , Primary! , ldt_temp , ll_Row , Primary!)
ldt_ve(1 , ll_Rows , Primary! , dw_XX , 1 , Primary!)
Destroy ldt_temp
dw_raw(True)
the_end:
// 只用将上述脚本拷入到打印部分即可,dw_XX为被打印的free型数据窗口,该方法可保证dw_XX中的数据在打印前后包括sort等属性均不发生任何改变,但效率较低,不宜用在数据量太大的数据窗口中,当然,考虑到打印本身速度就比较慢,所以3000行数据是可以采用这种方法并让用户接受的。若在同一窗口上存在与dw_XX共享的grid数据窗口并且与dw_XX同时显示,则需要与dw_one一起SetRedraw()
38、字段如何自动换行的同时且自动高度?
答:将数据窗口中相应列的auto horz scroll 为不选中,选中autosize 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_width ,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__parsetoarray(as_columns,',',ls_column) li_upperbound =
upperbound(ls_column) ll_rowcount = adw_nt() if
li_upperbound<1 or ll_rowcount<1 then return -1
openwithparm(w_waiting,this) ib_cancel = false iw_d = false
ll_totalstep = ll_rowcount * li_upperbound
w__register(ll_totalstep) for li_column = 1 to li_upperbound
ls_width = adw_be(ls_column[li_column]+".width")
li_width = integer(ls_width) if ls_width='!' or ls_width='?' or
li_width=0 then continue end if //ls_temp =
adw_be(ls_column[li_column]+".ty { =
'width' }") //messagebox(ls_column[li_column]+".ty { = 'width' }",ls_temp) //return 1 li_fontwidth = 27 li_counter = li_width
/ li_fontWidth for ll_row=1 to ll_rowcount if ib_cancel then
iw_d = true return 0 //pressed cancel button end if as_source
= adw_mstring(ll_row,ls_column[li_column]) as_replaced =
uf_insertstring(as_source,li_counter,' ',false) if
as_replaced<>as_source then
adw_m(ll_row,ls_column[li_column],as_replaced) end if
w__stepit() next next close(w_waiting) iw_d = true
return 1
39、如何使dw的列不可移动,不可调整列宽?
答:在datawindow的cilcked事件写 if row=0 then return 1 end if
40.光标跳转到数据窗口的某一行某一列
dw_torow(ll_row) dw_umn(ll_column)
41 如何使光标指向每页第一行?
long
ll_firstrowonpage=long(dw_be("owonpage"))
dw_torow(ll_firstrowonpage)
dw_(ll_firstrowonpage)
42. Grid的窗口如何使第一列固定不动?
①选上data OBJECT的HSplitScroll属性 ②在constructor事件中:
dw_ntalScrollSplit=integer(dw_be("#")) //第一列的宽度 ③在scrollhorizontal事件中: int i
if pane = 1 then
i = integer(ntalscrollposition2)
if i < 1 or isnull(i) then return
if scrollpos > 0 then
ntalScrollPosition = 0
end if
else
i = integer(ntalScrollSplit)
if i < 1 or isnull(i) then return
if i > scrollpos then
ntalScrollPosition2 = i
end if
end if
pb中datawindow常用技巧二
(2009-04-16 17:11:40)
转载▼
标签: 分类: PowerBuilder
杂谈
1 使DataWindow列只能追加不能修改
如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的
Protect 属性可以很方便的做到这一点,方法如下:
将每一列的 Protect 属性设置为:
If( IsRowNew(), 0, 1) )
在 PowerScript 中可以动态修改 Protect 属性:
dw_("column_name_t='1~tIf(IsRowNew(),0,1)'")
这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。
2 如何在DataWindow中实现列的自动折行
我们在PowerBuilder应用程序的开发过程中, 使用DataWindow时, 经常会遇
到某列的数据太长, 不能同时全部显示的情况. 若采用自动水平滚动, 操作起
来又不够简便. 下面介绍一种方法, 实现列数据多行显示, 即实现列数据的自
动折行.具体步骤如下:
1) 在DataWindow Painter中打开此DataWindow.
2) 在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口.
3) 选择Position标签, 选中Autosize Height 多选框.
4) 选择Edit标签, 不选中Auto Horz Scroll多选框.
5) 单击OK按钮, 保存所做的修改.
6) 点中Detail Band (即写有Detail的灰色长带), 单击鼠标右键, 选择
< 菜单项.7) 选中Autosize Height多选框.
8) 单击OK按钮, 保存所做的修改.
9) 保存此DataWindow.
注意:
连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不
会自动进行折行.
3 在数据窗口中实现动画
要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在TimerInterval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。比如要改变某字段的背景颜色,可设
=RGB(Integer(Right(string(now(),'hhmmssf'),1))*256/10,Integer(Right(string(now(),'hhmmssf'),1))*256/10,0) 当然,您不仅可以改变背景颜色,而且可以改变字体等等任何属性,使他可以动起来!
4 使数据窗口中的被选中行具有更好的外观
大家都知道,在选择数据窗口中的某一行时,如果使用pb提供的选择函数SelectRow(),那么的外观真是不能恭维,单调而古板的蓝色背景,可能和您的漂亮而生动的应用程序格格不入。有没有办法改变呢?当然有啰,请听我慢慢道来。
改变某一行的背景比较简单,改变每一列的背景属性(backgroundcolor)即可,可要根据鼠标选择情况自动改变,并可以返回被选中的行可能还需要一定的技巧。下面分单行选择和多行选择分辨说明。
单行选择
单行选择比较简单,我们只要将所有字段的背景色的表达式改为:
if(GetRow()=CurrentRow(),RGB(255,126,0),RGB(0,0,0))
其中第一个颜色为被选中的颜色,第二个颜色未被选中的颜色。然后用GetRow()代替GetSelectedRow()函数来得到被选中的行。
多行选择
多行选择比较复杂,如果单纯依靠改变数据窗口的属性没法实现,我们必须使用数据窗口属性和代码结合起来才能实现
首先,改变数据窗口的SQL语句,增加一个计算字段:0 asflag,Select 语句改为:
Select col1,col2 ,1 as flag from tablename where .....,
当返回数据窗口painter时,您就会发现多了一个字段flag,我们就是利用这个字段保存行被选中的信息。
其次,修改各个字段的背景颜色属性,设置为:if(flag=1,RGB(255,126,0),RGB(255,255,255))
第三:在数据窗口控件中,增加对clicked 事件的处理,代码如下:
if row<1 then return // setredraw(false)
if this.o b j e c [row]=1 then //如果该行被选中,撤销选择,否则选中该行
[row]=0
else
[row]=1
end if
setredraw(true)
您还可以定制本选中行的字体,文本属性等等。原理相同,不再赘述。
5 将日期型字段初始化为当天的日期
使用 Column Specifications 对话框来设置数据的初始值是一个比较好又比较通用的方法。为了将日期型字段初始化为当天的日期,只要设置初始化值为today,而不是today()即可。同样设置初始值为NUll,可以使用null,而不是null()。
6 在DataWindow中调整列顺序
在 Gird 风格的 DataWindow 中,列的排列顺序是按照你选择 Column 的顺序排列的,并且不能改变.要改变列的顺序则必须重新制作 DataWindow.
最近我发现一个办法可以改变列的顺序: 在 DataWindow画板中打开要修改的
DataWindow,然后按'Preview' 按钮切换到预览模式下,选择要移动的列标题并拖动到预定位置,然后返回 DataWindow 画板,存盘即可.
7 Retrieve时不清除原有Datawindow数据
当你调用Retrieve函数,PowerBuilder自动清除原有DataWindow然后Retrieve数据。在Datawindow RetrieveStart事件中,使用Return 2,这样PowerBuilder不会清除原有数据而是追加新数据。
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建立漂亮的Grid DataWindow的技巧
虽然PowerBuilder有Grid风格的DataWindow,但不够灵活,如果想打印一张边框粗线条或双线,内框为细线条的表格直接使用Grid 风 格的DataWindow就不能实现。因此许多人都用Tabular风格的DataWindow,然后自己用Line来实现Grid。在调整线条位置是一个即伤脑筋又伤眼睛的事件,而一旦需要调整行高,所有工作都得重来,试一试用下面方法,会大大减轻你的工作量:在vertical
lines,改变它的属性,在ExpressionsTab上,y1行上输入0,y2行上输入rowheight() - 1 在horizontal lines, 设置 y1 和 y2 = rowheight() - 5 这样PowerBuilder会自动调整线的坐标,你只需要设置横线的长度和x1,x2的坐标即可。 马上Preview一下,看一看效果!你再也不需要因为行的高度发生改变而重新调整线条位置。
10 如何创建一个报表,如下形式
Quantity Running Total
5,000 5,000
2,500 7,500
3,000 10,500
12,000 22,500
对于Running Total列,我们可使用计算列:CumulativeSum(Quantity for
all),即可达到逐渐递增求和的功能。
11 数据窗口的数据送缓冲区之前确认的四个步骤判断数据类型是否正确。如不正确则触发ItemError事件。判断数据是否符合有效性规则。如不符合有效性规则,同样触发ItemError事件。判断是否有数据被改动。判断数据是否通过ItemChanged事件,如果数据和ItemChanged相斥,将触发ItemError事件。
12 如何在DataWindow中用数据类型为Datetime的列为条件进行查找
1.当要查找的日期条件是一常数时使用如下表达式:
ls_Find = "datetime_col
= DateTime ('1/1/1999')"
2.当要查找的日期条件是一个变量时使用如下的表达式:
ls_Find = "datetime_col = DateTime ('" +ls_Date + "')"
3.当要查找的日期条件是一个DateTime数据类型时使用如下表达式:
ls_Find = "datetime_col = DateTime ('" +String (ldt_DateTime) +
"')"
13 设置数据窗口Boolean型属性的三种方法
PowerBuilder提供了三种方法设置数据窗口的布尔型属性,分别是True/False, 1/0, 'Yes'/'No'。例如:
dw_e = 0 dw_e =
Falsedw_e = 'No'
PowerBuilder在处理上以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。
为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用带双引
号的数字来表达。
14 如何在DataWindow中快速删除多行
在开发过程中可能经常有要进行多行删除的操作,一般都使用循环语句进行操作:
FOR ll_RowOn = 1 TO dw_nt() dw_Row(ll_RowOn) NEXT
一个快速的删除方法是把要删除的行从主缓冲区中移到删除缓冲区中。例如,删除缓冲区中所有的行:
dw_ve(dw_1, 1, dw_nt, Primary!, dw_1, 1, Delete!)
不过不要忘了过滤的行在不同的缓冲区中。
15 如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行
起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1"
16 如何在分组形式的DataWindow中分别显示各组的行号
当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为
GetRow() - First(GetRow() for Group 1) + 1的计算列。
17 如何改变列的字体颜色,提醒用户此列已做修改
在列的Color属性中,输入如下表达式 IF (column_name < >column_al, RGB(255, 0, 0), RGB(0, 0, 0))。
在这个条件中,如果此列已改变,则显示红色字体,否则显示黑色字体。这个表达式主要用column_name< > column_al比较当前列的值和原始列的值是否相同来达到判断的目的。
18 在数据窗口中移走行,但不是去做过滤或删除操作
RowsDiscard()函数可做到这一点,它在数据窗口中执行移除工作,但被移走的行它不可被删除或做任何修改性的保存。
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)) + ' to ' + String(Last(GetRow()
FORPage)) + ' are displayed'。
即可达到这项功能。
20 使可编辑的数据窗口只读
有时,你可能需要将一个用于编程的数据窗口用作显示目的,可以有以下几种方法来实现这一要求:
1.建立两个数据窗口,一个用于编辑,一个用于显示
2.将数据窗口中的全部对象的taborder设置为0.
3.也可以将数据窗口中的列的protect属性设为On或Off,但你不能使用protect属性进行编辑操作
4.数据窗口有一个将datawindow设为只读的属性(readonly),使用它最方便。
21 数据窗口检查重复行
dw_t ("user_id A")
dw_()
dw_ter ("user_id = user_id[-1]")
dw_()
if dw_nt() > 0 then
Messagebox("注意", "用户编码重复.")
end if
dw_ter ("")
dw_()
22 如何在分组形式的DataWindow中分别显示各组的行号
---- 当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()
---- 计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为
GetRow() - First(GetRow() for Group 1) + 1的计算列。
23 如何能让数据窗口的某几列在其他列横拉时固定不动
////////////////////////////////////////////////////////////////
// 功能说明:用于冻结左边的滚动栏
// 变更记录: 变更或版本更新的时候
//
////////////////////////////////////////////////////////////////
int i
if pane = 1 then
i = integer(this.o b j e c ntalscrollposition2)
if i < 1 or isnull(i) then return
if scrollpos > 0 then
this.o b j e c ntalScrollPosition = 0
end if
else
i = integer(ntalScrollSplit)
if i < 1 or isnull(i) then return
if i > scrollpos then
this.o b j e c ntalScrollPosition2 = i
end if
end if
24 在数据窗口中如果要使其中一列的属性为只读,也就是不允许用户修改,那么只需简单地将这一列的TableOrder 设置成0就可。然而,在有些情况下
需要对这一列的某些行修改,而某些行不能修改,这就要用到这一列的protect属性了。打开列的属性中的Expressions,在protect中输入条件判别
式。例如:允许用户修改新增加的记录,而检索出来的记录则不允许修改。条件判别式可以写成如下:
if(isRowNew(),0,1)
在 PowerScript 中可以动态修改 Protect 属性:
dw_("column_name_t='1~tIf(IsRowNew(),0,1)'")
这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。
25 控制DATAWINDOW里每页显示的行数
1、在Datawindow中增加一个计算域,起名为:ceil_page,此计算域必须放在Detail段中,
Expression中输入 ceiling(getrow()/25) 25表示每页打印25行,也可以是一个参数。
2、分组,选择菜单RowsCreate Group,选择ceil_page
按ceil_page分组,并选中New Page OnGroup Break(意思是新组开始时换页)。
3、将此计算域设为隐藏(在属性页中的expression页中在visible属性中写0)。 4、补空行:
在窗口的open事件中写如下代码:
long li_count,li_i
li_count=dw_ve()
if mod(li_count,25)<>0 then
for li_i=1 to 25 - mod(li_count,25)
dw_row(0)
next
end if
26 数据窗口的closeQuery事件:提示保存数据
dw_Text()
IF dw_edCount() + dw_dCount() > 0 THEN
CHOOSE CASE MessageBox("操作提示","数据已经发生变化,是否保存?",Question!,YesNoCancel!,1)
CASE 1
cb_rEvent(clicked!)
CASE 2
Return 0//不做任何操作直接关闭窗口
CASE 3
Return 1//不会运行Close Event,维持原来的情况
END CHOOSE
END IF
27 Getchild函数主要被用来得到一个数据窗口的子数据窗口
该函数在两种情况下可以使用,1、取出数据窗口对象的下拉式数据窗口;
2、取出复合风格(composite)数据窗口对象里所嵌入的子数据窗口对象。
语法:integer ld (string name, REFDataWindowChild
dwchildvariable )
例子1 这段程序取出一个composite数据窗口对象的两个子数据窗口,并对他们进行过滤,和排序的操作。
String ls_filter
DataWindowChild dwc_czrw,dwc_czx//定义子数据窗口变量
dw_nso b j e c t(sqlca)
dw_ve()
dw_ld("dw_2",dwc_czrw)
dw_ld("dw_1",dwc_czx)
ls_filter = "czrw_bh
='"+dw_mString(dw_(),"czrw_bh")+"'"//过滤条件
dwc_ter(ls_filter) dwc_()
ls_filter = "czx_rwbh
='"+dw_mString(dw_(),"czrw_bh")+"'"
dwc_t("czx_sx A")
dwc_()
dwc_ter(ls_filter)
dwc_()
当然也可以通过数据共享(ShareData)等方式操作子数据窗口中的数据。
访问复合数据窗口对象.方法 :dw_dy.o b j e _1.o b j e c t.对象
例子2 下拉数据窗口动态过滤
在数据窗口dw_1的ItemFocusChanged事件中写入如下脚本:
Integer rtncode
String ls_nowFld,ls_deptid,ls_sql
DataWindowChild fld_child
rtncode = dw_ld("Unit_id",fld_child) //获得Unit_id字段名下拉数据窗口的句柄
If rtncode = -1 Then MessageBox("错误!", "不是下拉数据窗口!")
fld_nsObject(SQLCA) //设置事务对象
ls_sql = Lower(fld_Select())// 获得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__id[GetRow()] //取得当前dept_id选定值
ls_sql = ls_sql + " Where dept_id = '" +Trim(ls_deptid)+"'"
//重新设置Sql 语句
fld_Select(ls_sql)
fld_ve()//取得满足条件的数据
28 从数据窗口中获取数据
单条:假设我们要读取dept_id字段的第一笔数据,可以用下列方式表示∶li_id = dw_1.o b j e c _id[1]
假设我们要读取第一行中第二个字段的数据,可以用下列方式表示∶ls_name
= dw_1.o bj e c [1,2]
假设我们要读取dept_id字段的所有数据,可以用下列方式表示∶li_array =
dw_1.o b j e c _T
假设我们要读取过滤缓冲区 (filter buffer) 内dept_id字段的第一笔数据,可以用下列方式表示∶li_id = dw_1.o b je c _
[1]
假设我们要读取从第二笔数据的第一个字段到第三笔数据的二个字段之间的数据,表示∶lstr_array= dw_1.o b j e c [2,1,3,2]
假设我们要读取整个第二笔的数据,可以用下列方式表示∶lstr_dept = dw_1.o b je c [2]
使用GetItemX ( )函数 x为string number等
lstr_name = dw_mstring (li_count , "emp_name") li_count为哪一条
多条:string ls_name[ ]
ls_name = dw_ 1.o b j e _t
数据的读取 一般格式∶数据窗口控件.Retrieve ( ) 返回个数 ,-1为错误
增加数据 数据窗口控件.InsertRow(行数) 参数为0加到最后
数据的删除 数据窗口控件.Deleterow (行数)
数据的过滤l 数据窗口控件.SetFilter(条件字符串).
数据窗口控件.Filter ( ) 用法∶将主要缓冲区 (Primary Buffer) 内不符合过滤条件的数据移到过滤缓冲区 (FilterBuffer)
内。
例子:string ls_exp ls_exp = "dept_id
=100" dw_ter (ls_exp) dw_ ( )
排序 dw_t("dept_id") dw_ ( )
将数据从所有的缓冲区 (Buffer) 中清除 dw_ ( )
计算数据数目。例如∶dw_nt ( ) 类似: .DeletedCount
( ) .ModifiedCount ( ) .FilteredCount ( )
数据窗口的滚动 数据窗口控件.ScrollToRow(行数)
29 数据窗口属性改变:
描述数据窗口对象本身颜色,可以表示如下∶long
ll_color ll_color = dw_be ("")
描述数据窗口对象内标题 dept_id_t 的颜色,可以表示如下∶long
ll_color ll_color = dw_be("dept_id_")
修改数据窗口对象本身颜色,可以表示如下:dw_(" = 255")
修改数据窗口对象内标题 dept_id 的颜色,可以表示如下∶dw_ ("dept_id_ = 255")
假设当我们希望在程序运行阶段才给予下行条件∶薪水超过 50000 时显示红色,低于 50000 时显示黑色。程序的写法如下∶
ls_modstring = " = '0~tIf(Salary > 50000,255,0)'"
dw_ (ls_modstring)
30 得到当前鼠标所指对象所在的带区
string str_band
str_band=GetBandAtPointer() //得到当前鼠标所指对象所在的带区
str_band=left(str_band,(pos(str_band,'~t') - 1))//得到"header"、"detail"等
if str_band<>'header' thenreturn //单击非头区,退出
31 得到鼠标指向的列对象名 str_o b j e c t=GetObjectAtPointer() //得到当前鼠标所指对象名
str_o b j e c t=left(str_o b j e c t,(pos(str_o b j e c t,'~t') - 1))
//得到列对象名(默认为列名_t为列标题)
str_column=left(str_o b j e c t,(len(str_title) - 2))
//判断该名称是否为列名字
if be(str_column+".band")='!' then return //非是列名,即列标题不是按正常规律起名的。
32 得到当前行、列,总行、列 //this 针对数据窗口而言
li_col = umn()
li_ColCount
=long(describe(this,""))
ll_row =()
ll_RowCount = nt()
//设置当前行、列
scrolltorow(this,ll_Row)
setrow(this,ll_Row)
setcolumn(this,li_col)
us()
33得到所有列标题
ll_colnum = Long(dw_1.o b j e c )
for i = 1 to ll_colnum
//得到标题头的名字
ls_colname = dw_be('#' + string(i) + ".name") +"_t"
ls_value =dw_be(ls_colname + ".text")
next
34 如何用代码取得数据窗口汇总带计算列的值?
String ls_value
ls_value = dw_be("Evaluate("'compute_1',1)")
如果是数值型,要转换。
35 取得单击的列标题、列名、数据库字段名
string ls_dwo
long ll_pos
string ls_type
string ls_title
string ls_column
string ls_dbname
if Not KeyDown(KeyControl!) then return
ls_dwo =
if trim(ls_dwo) = '' or isnull(ls_dwo) then return ls_type = be(ls_dwo + '.type')
if ls_type = 'column' then
ls_title = be(ls_dwo + '_')//标题
ls_column = be(ls_dwo + '.Name') //数据窗口列名
ls_dbname = be(ls_dwo + '.dbname') //数据库中字段名
messagebox('信息', '标 题 文 本 :' + ls_title + &
'~r~n数据窗口列名 :' + ls_column + &
'~r~n数据库中字段名:' +ls_dbname )
end if
36 窗口为w_gcde内,放入一个DW_1,如何得到dw_1内的某列值yuonghu_id列的内容
方法:
long lng_column_count
integer i
stringstr_column[] //列名
string str_column_text[] //text的名字
//得到数据窗口的总列数
lng_column_count = long(dw_be(""))
//循环依次读取
for i = 1 to lng_column_count
str_column[i] =dw_be("#"+string(i)+".name")
str_column_text[i] =dw_be(str_column[i] +
"_")
next
37 在DDDW中实现当前高亮行随鼠标移动
DataWindowChild ldwc_Child
String ls_Pointer
Long ll_Row
GetChild( "dept_id", ldwc_Child ) // Replace thecolumn name "dept_id" as
you needed
IF hwndchild = Handle( ldwc_child ) THEN
if notificationcode = 2311 then //DDDW的mousemove事件
//得到鼠标所在行
ls_Pointer =ldwc_ectAtPointer()
ll_Row=Long( Mid( ls_Pointer, Pos(ls_Pointer, "~t" ) + 1 ))
//移到鼠标所在行
IF ldwc_() <>ll_Row AND ll_Row > 0 THEN
ldwc_ToRow( ll_Row )
END IF
end if
END IF
38 实现打印完一个DataWindow后不换页
首先将datawindow的print输出到一个打印文件中,把其他的print也输入这个prn,然后,打印这个打印文件就行了。
如:
datawindow_me="c:printfilepathexam_"
datawindow_me="c:printfilepathexam_"
dw_()
dw_()
run("print //d:printservenamesharename"c:printfilepathexam_")
//d:printservenamesharename打印机名


发布评论