PB的小技巧
1.如何使DataWindow中的数据只能追加新记录而不能修改。
利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:
将每一列的 Protect 属性设置为:
If( IsRowNew(), 0, 1) )
在 PowerScript 中可以动态修改 Protect 属性:
dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")
2. 允许从空的非字符字段跳离
string s
s = this.dwDescribe(this.GetColumnName()+".coltype")
//s = this.dwDescribe("#"+String(this.GetColumn())+".coltype")
CHOOSE CASE s
CASE "number"
IF Trim(this.GetText()) = "" THEN
int null_num
SetNull(null_num)
this.SetItem(this.GetRow(),this.GetColumn(),null_num)
this.SetActionCode(3)
END IF
CASE "date"
IF Trim(this.GetText()) = "" THEN
date null_date
SetNull(null_date)
this.SetItem(this.GetRow(),this.GetColumn(),null_date)
this.SetActionCode(3)
END IF
CASE "time"
IF Trim(this.GetText()) = "" THEN
time null_time
SetNull(null_time)
this.SetItem(this.GetRow(),this.GetColumn(),null_time)
this.SetActionCode(3)
END IF
CASE "datetime"
IF Trim(this.GetText()) = "" THEN
date null_datetime
SetNull(null_datetime)
this.SetItem(this.GetRow(),this.GetColumn(),null_datetime)
this.SetActionCode(3)
END IF
END CHOOSE
3. 当我们为Datawindow的每一行显示行号时
可以简单的放一个表达式为GetRow() -- 计算列。
但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为
GetRow() - First(GetRow() for Group 1) + 1的计算列。
4.多 用 户 安 全 访 问 数 据 库 的 实 现
---- 数 据 窗 口 的 并 发 性 控 制 可 以 用“rows” 菜 单 的“Update Properties” 项 进 行 设 定。
---- 1.Allow Updates: 如 果 选 中, 则 整 个 数 据 窗 口 允 许 修 改, 否 则 不 允 许;
---- 2.Table to Update: 在 多 表 查 询 时, 用 该 项 选 择 要 设 置 的 表 名;
---- 3.Where Clause for Update/Delete: 这 项 设 置 是 对 数 据 库 并 发 控 制 最 重 要 的 一 项, 要 仔 细 设 置。
---- 当 调 用 数 据 窗 口 的Update 方 法 时,数据窗 口 使 用SQL 语 句 将 数 据 结 果 传 递 到 数 据 库 系 统, 这 项 设 置 决 定 在SQL 语 句 的where 子 句 中 使 用 哪 些 列 作 为 整 条 记 录 的 标 志。
---- (a)Key Columns: 仅 仅 使 用 关 键 字 作 为 整 条 记 录 的 标 志。 在 网 络 环 境
下 不 推 荐 使 用 此 选 项。 如 果 两 个 用 户 同 时 修 改 了 同 一 条 记 录, 后 进 行 保 存 操 作 的 人 会 把 先 保 存 的 人 所 做 的 修 改“ 抹 掉” 而 毫 无 察 觉。
---- (b)Key and Updatable Columns: 使 用 关 键 字 和 所 有 可 更 新rows函数的使用方法及实例 列 作 为 记 录 的 标 志。
---- 在 这 种 情 况 下, 后 一 个 用 户 的Update 将 不 能 成 功 执 行。
---- (c)Key and Modified Columns: 使 用 关 键 字 和 所 有 已 更 新 列 作 为 记 录 的 标 志。
---- 功 能 和(b) 很 相 似, 不 同 点 在 于(b) 的 前 端 执 行 速 度 快, 数 据 库 端 慢; 而(c) 则 刚 好 相 反。
---- 4.Key Modification: 该 项 设 置 决 定 了 更 新 数 据 库 的 方 法。
---- (a)Use Delete then Insert: 先 删 除, 再 插 入。
---- (b)Use Update: 直 接 修 改。
---- 建 议 使 用(b) 选 项。
---- 5. Updatable Columns: 用 来 选 择“ 可 更 新 列”, 这 里 所 做 的 选 择 与3.(b) 对 应, 没 有 选 中 的 列 将 不 会 出 现 在Update 语 句 中。
---- 6.Unique Key Columns: 用 来 选 择 关 键 字, 这 里 所 做 的 选 择 与3.(a) 对 应, 没 有 选 中 的 列 将 不 会 出 现 在Update 语 句 中。 ◎
5. 使DW自动折行
你可以在Datawindow中使列象MultiLineEdit Control,方法如下: 在Datawindow
Painter中,把列的Edit Styles选为Edit,取消Auto H Scroll并且选择V Scroll
Bar.确信Limit是字符的确实个数。单击OK.现在你可以改变列的高度和宽度了。
但用户敲到一行的末尾时,会自动跳到下一行。也可以敲Enter来结束。注意:
连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不 会自动进行折行
6. 当你创建一个编辑风格为drop-down DataWindow(or drop-down listbox) 时,并且实际字段允许为空(empty string is null),你必须让用户可以删除选中的值.
如果required选项选中,你不可能去掉dddw中的值,因此,required不能选中。
在DW中定义事件:pbm_dwnkey(PFC does this for you with the key event in u_dw.)
脚本:
string s_null
long l_row
IF key = KeyDelete! THEN
IF This.GetColumnName() = 'dept_id' THEN
l_row = This.GetRow()
IF l_row < 1 THEN
Return
ENDIF
SetNull(s_null)
This.SetItem(l_row, 'dept_id', s_null)
ENDIF
ENDIF
7.取出列的显示内容
string ls_value
ls_value=dw_1.describe("Evaluate('lookupdisplay(column_name)',1)")
column_name=列名 ,'1'表示第一行;看看Help中的Describe
8.每页打印固定行
第一步:增加一个计算列,此计算列必须放在Detail段,Expression中输入: ceiling(getrow()/20)
<--这里20还可以用全局函数取代,这样可以允许用户任意设置每页打印多少行.
第二步:定义分组,选择菜单Rows->
按计算列字段分组,并一定将check box-->New Page On Group Break选中。
第三步:将此计算列设为不可视。
另外,如果需要最后一页不足补空行。也很简单,如下:
long ll_pagerow = 6 //每页打印行数
long ll_count, ll_row ll_count = ieve(...)
//取得现有报表的总行数
ll_count = ll_pagerow - mod(ll_count, ll_pagerow)
If ll_count < ll_pagerow Then for ll_row = 1 to ll_count
dw_print.insertrow(0) //补足空行
next
end If
9.PowerBuilder提供了一种使用函数的方法来高亮度显示数据窗口中细节栏
但有时你需要高亮度显示分组条及细节栏,
这时你需要增加一个long类型的实例变量(假设为Il_LastRow),
并且在数据窗口中增加一个额外的列(假设为highlight),
并在rowfoucs事件增加以下代码:
SetItem( il_LastRow, 'highlight', 0 ) SetItem( currentrow, 'highlight', 1 )
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论