数据窗口技巧

大量数据窗口使用小技巧 序列号:XINCHENONONLDDFOLLNR
使DataWindow列只能追加不能修改


如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:

将每一列的 Protect 属性设置为:
If( IsRowNew(), 0, 1) )


在 PowerScript 中可以动态修改 Protect 属性:
dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")

这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。






使数据窗口中的被选中行具有更好的外观
大家都知道,在选择数据窗口中的某一行时,如果使用pb提供的选择函数SelectRow(),那么的外观真是不能恭维,单调而古板的蓝色背景,可能和您的漂亮而生动的应用程序格格不入。有没有办法改变呢?当然有啰,请听我慢慢道来。
改变某一行的背景比较简单,改变每一列的背景属性(backgroundcolor)即可,可要根据鼠标选择情况自动改变,并可以返回被选中的行可能还需要一定的技巧。下面分单行选择和多行选择分辨说明。
单行选择
单行选择比较简单,我们只要将所有字段的背景色的表达式改为:


if(GetRow()=CurrentRow(),RGB(255,126,0),RGB(0,0,0))

其中第一个颜色为被选中的颜色,第二个颜色未被选中的颜色。然后用GetRow()代替GetSelectedRow()函数来得到被选中的行。

多行选择

多行选择比较复杂,如果单纯依靠改变数据窗口的属性没法实现,我们必须使用数据窗口属性和代码结合起来才能实现

首先,改变数据窗口的SQL语句,增加一个计算字段:0 as flag,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 t.flag[row]=1 then //如果该行被选中,撤销选择,否则选中该行
 this.Object.flag[row]=0
else
 this.Object.flag[row]=1
end if
setredraw(true)

您还可以定制本选中行的字体,文本属性等等。原理相同,不再赘述。


Retrieve时不清除原有Datawindow数据
当你调用Retrieve函数,PowerBuilder自动清除原有DataWindow然后Retrieve数据。在Datawindow RetrieveStart事件中,使用Return 2,这样PowerBuilder不会清除原有数据而是追加新数据。


美化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一下,看一看效果如何。


一.如何创建一个报表,如下形式
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),即可达到逐渐递增求和的功能。

二.数据窗口的数据送缓冲区之前确认的四个步骤 判断数据类型是否正确。如不正确则触发ItemError事件。判断数据是否符合有效性规则。如不符合有效性规则,同样触发ItemError事件。 判断是否有数据被改动。判断数据是否通过ItemChanged事件,如果数据和ItemChanged相斥,将触发ItemError事件。

三.如何在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) + "')"

四.设置数据窗口Boolean型属性的三种方法
PowerBuilder提供了三种方法设置数据窗口的布尔型属性,分别是True/False, 1/0, 'Yes'/'No'。例如:
dw_1.Object.address.Visible = 0 dw_1.Object.address.Visible = False dw_1.Object.address.Visible = 'No'
PowerBuilder在处理上以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。
为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用带双引
号的数字来表达。

五.如何在DataWindow中快速删除多行
在开发过程中可能经常有要进行多行删除的操作,一般都使用循环语句进行操作:

FOR ll_RowOn = 1 TO dw_1.RowCount() dw_1.DeleteRow(ll_RowOn) NEXT

一个快速的删除方法是把要删除的行从主缓冲区中移到删除缓冲区中。例如,删除缓冲区中所有的行:

dw_1.RowsMove(dw_1, 1, dw_1.RowCount, Primary!, dw_1, 1, Delete!)

不过不要忘了过滤的行在不同的缓冲区中。

六.如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行
起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1"

七.如何在分组形式的DataWindow中分别显

示各组的行号
当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为
GetRow() - First(GetRow() for Group 1) + 1的计算列。

八.如何改变列的字体颜色,提醒用户此列已做修改
在列的Color属性中,输入如下表达式

IF (column_name < >column_name.Original, RGB(255, 0, 0), RGB(0, 0, 0))。

在这个条件中,如果此列已改变,则显示红色字体,否则显示黑色字体。这个表达式主要用column_name < > column_name.Original比较当前列的值和原始列的值是否相同来达到判断的目的。

九.在数据窗口中移走行,但不是去做过滤或删除操作
RowsDiscard()函数可做到这一点,它在数据窗口中执行移除工作,但被移走的行它不可被删除或做任何修改性的保存。

十.如何在多行显示的DataWindow 中的Footer Band中显示当前数据的首行和最后行的行号
我们先看两个计算列的表达式: IF (GetRow() = First(GetRow() FOR Page), 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() FOR Page)) + ' are displayed'。

即可达到这项功能。




数据窗口检查重复行
dw_1.SetSort ("user_id A")
dw_1.Sort()
dw_1.SetFilter ("user_id = user_id[-1]")
dw_1.Filter()

if dw_1.RowCount() > 0 then
Messagebox("注意", "用户编码重复.")
end if

dw_1.SetFilter ("")
dw_1.Filter()





//数据窗口的closeQuery事件:提示保存数据
dw_1.AcceptText()
IF dw_1.ModifiedCount() + dw_1.DeletedCount() > 0 THEN
CHOOSE CASE MessageBox("操作提示","数据已经发生变化,是否保存?",Question!,YesNoCancel!,1)
CASE 1
cb_save.TriggerEvent(clicked!)
CASE 2
Return 0//不做任何操作直接关闭窗口
CASE 3
Return 1//不会运行Close Event,维持原来的情况
END CHOOSE
END IF




Getchild函数主要被用来得到一个数据窗口的子数据窗口
该函数在两种情况下可以使用,1、取出数据窗口对象的下拉式数据窗口;
2、取出复合风格(composite)数据窗口对象里所嵌入的子数据窗口对象。
语法:integer dwcontrol.GetChild (string name, REF DataWindowChild
dwchildvariable )

例子1 这段程序取出一个composite数据窗口对象的两个子数据窗口,并对他们进行过滤,和排序的操作。

/*dw_dy是连接一个composite数据窗口对象的一个数据窗口控件。dw_1、dw_2分别是嵌套的数据窗口的NAME*/

String ls_filter
DataWindowChild dwc_czrw,dwc_czx//定义子数据窗口变量
dw_dy.Settra

nso b j e c t(sqlca)
dw_dy.Retrieve()
dw_dy.GetChild("dw_2",dwc_czrw)
dw_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()

当然也可以通过数据共享(ShareData)等方式操作子数据窗口中的数据。
访问复合数据窗口对象.方法 :dw_dy.o b j e c t.dw_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_1.GetChild("Unit_id",fld_child) //获得Unit_id字段名下拉数据窗口的句柄

If rtncode = -1 Then MessageBox("错误!", "不是下拉数据窗口!")

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_id[GetRow()] //取得当前dept_id选定值

ls_sql = ls_sql + " Where dept_id = '" +Trim(ls_deptid)+"'"


//重新设置Sql 语句

fld_child.SetSQLSelect(ls_sql)

fld_child.Retrieve()//取得满足条件的数据






数据窗口属性改变:
描述数据窗口对象本身颜色,可以表示如下∶long ll_color ll_color = dw_emplist.Describe ("DataWindow.Color")
描述数据窗口对象内标题 dept_id_t 的颜色,可以表示如下∶long ll_color ll_color = dw_emplist.Describe ("dept_id_t.Color")
修改数据窗口对象本身颜色,可以表示如下:dw_emplist.Modify ("DataWindow.Color = 255")
修改数据窗口对象内标题 dept_id 的颜色,可以表示如下∶dw_emplist.Modify ("dept_id_t.Color = 255")
假设当我们希望在程序运行阶段才给予下行条件∶薪水超过 50000 时显示红色,低于 50000 时显示黑色。程序的写法如下∶
ls_modstring = "Salary.Color = '0~tIf (Salary > 50000,255,0) '"
dw_1.modify (ls_modstring)





1、得到当前鼠标所指对象所在的带区
string str_band
str_band=GetBandAtPointer() //得到当前鼠标所指对象所在的带区
str_band=left(str_band,(pos(str_band,'~t') - 1))//得到"header"、"detail"等
if str_band<>'header' then return //单击非头区,退出
2、 得到鼠标指向的列对象名
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 this.describe(str_column+".band")='!' then return //非是列名,即列标题不是按正常规律起名的。

3、得到当前行、列,总行、列 //this 针对数据窗口而言
li_col = this.GetColumn()
li_ColCount = long(describe(this,"datawindow.column.count"))
ll_row = this.GetRow()
ll_RowCount = this.RowCount()
//设置当前行、列
scrolltorow(this,ll_Row)
setrow(this,ll_Row)
setcolumn(this,li_col)
this.SetFocus()
4、得到所有列标题
ll_colnum = Long(dw_1.o b j e c t.datawindow.column.count)
for i = 1 to ll_colnum
//得到标题头的名字
ls_colname = dw_1.describe('#' + string(i) + ".name") + "_t"
ls_value = dw_1.describe(ls_colname + ".text")
next

5、如何用代码取得数据窗口汇总带计算列的值?
String ls_value
ls_value = dw_1.Describe("Evaluate("'compute_1',1)")
如果是数值型,要转换。
6、取得单击的列标题、列名、数据库字段名
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 = https://www.360docs.net/doc/142794732.html,
if trim(ls_dwo) = '' or isnull(ls_dwo) then return
ls_type = This.describe(ls_dwo + '.type')
if ls_type = 'column' then
ls_title = This.describe(ls_dwo + '_t.text')//标题
ls_column = This.describe(ls_dwo + '.Name') //数据窗口列名
ls_dbname = This.describe(ls_dwo + '.dbname') //数据库中字段名
messagebox('信息', '标 题 文 本 :' + ls_title + &
'~r~n数据窗口列名 :' + ls_column + &
'~r~n数据库中字段名:' + ls_dbname )
end if

7。窗口为w_gcde内,放入一个DW_1,如何得到dw_1内的某列值yuonghu_id列的内容
方法:


long lng_column_count
integer i
string str_column[] //列名
string str_column_text[] //text的名字
//得到数据窗口的总列数
lng_column_count = long(dw_1.Describe("DataWindow.Column.Count"))
//循环依次读取
for i = 1 to lng_column_count
str_column[i] = dw_1.Describe("#"+string(i)+".name")
str_column_text[i] = dw_1.Describe(str_column[i] + "_t.text")
next





忘记Sybase的sa密码怎么办?

1、在sybase目录的install子目录的启动server文件
RUN_server名,编辑该文件,在末尾增加-psa,
保存该文件。

2、如果服务器已经启动,先停止之。

3、执行第1步批处理文件以启动server,在启动最后
显示信息出现sa的新口令,记录之。

4、切换到SQL Advangtage以sa帐号登录,口令为新
记录之口令。

5、进入server以后,用命令sp_password修改sa口令


6、回到第1步,去掉增加的选项-psa,保存退出。


相关文档
最新文档