PB的小技巧.docx
- 文档编号:6274550
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:41
- 大小:61.76KB
PB的小技巧.docx
《PB的小技巧.docx》由会员分享,可在线阅读,更多相关《PB的小技巧.docx(41页珍藏版)》请在冰豆网上搜索。
PB的小技巧
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.允许从空的非字符字段跳离
strings
s=this.dwDescribe(this.GetColumnName()+".coltype")
//s=this.dwDescribe("#"+String(this.GetColumn())+".coltype")
CHOOSECASEs
CASE"number"
IFTrim(this.GetText())=""THEN
intnull_num
SetNull(null_num)
this.SetItem(this.GetRow(),this.GetColumn(),null_num)
this.SetActionCode(3)
ENDIF
CASE"date"
IFTrim(this.GetText())=""THEN
datenull_date
SetNull(null_date)
this.SetItem(this.GetRow(),this.GetColumn(),null_date)
this.SetActionCode(3)
ENDIF
CASE"time"
IFTrim(this.GetText())=""THEN
timenull_time
SetNull(null_time)
this.SetItem(this.GetRow(),this.GetColumn(),null_time)
this.SetActionCode(3)
ENDIF
CASE"datetime"
IFTrim(this.GetText())=""THEN
datenull_datetime
SetNull(null_datetime)
this.SetItem(this.GetRow(),this.GetColumn(),null_datetime)
this.SetActionCode(3)
ENDIF
ENDCHOOSE
3.当我们为Datawindow的每一行显示行号时
可以简单的放一个表达式为GetRow()--计算列。
但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为
GetRow()-First(GetRow()forGroup1)+1的计算列。
4.多用户安全访问数据库的实现
----数据窗口的并发性控制可以用“rows”菜单的“UpdateProperties”项进行设定。
----1.AllowUpdates:
如果选中,则整个数据窗口允许修改,否则不允许;
----2.TabletoUpdate:
在多表查询时,用该项选择要设置的表名;
----3.WhereClauseforUpdate/Delete:
这项设置是对数据库并发控制最重要的一项,要仔细设置。
----当调用数据窗口的Update方法时,数据窗口使用SQL语句将数据结果传递到数据库系统,这项设置决定在SQL语句的where子句中使用哪些列作为整条记录的标志。
----(a)KeyColumns:
仅仅使用关键字作为整条记录的标志。
在网络环境下不推荐使用此选项。
如果两个用户同时修改了同一条记录,后进行保存操作的人会把先保存的人所做的修改“抹掉”而毫无察觉。
----(b)KeyandUpdatableColumns:
使用关键字和所有可更新列作为记录的标志。
----在这种情况下,后一个用户的Update将不能成功执行。
----(c)KeyandModifiedColumns:
使用关键字和所有已更新列作为记录的标志。
----功能和(b)很相似,不同点在于(b)的前端执行速度快,数据库端慢;而(c)则刚好相反。
----4.KeyModification:
该项设置决定了更新数据库的方法。
----(a)UseDeletethenInsert:
先删除,再插入。
----(b)UseUpdate:
直接修改。
----建议使用(b)选项。
----5.UpdatableColumns:
用来选择“可更新列”,这里所做的选择与3.(b)对应,没有选中的列将不会出现在Update语句中。
----6.UniqueKeyColumns:
用来选择关键字,这里所做的选择与3.(a)对应,没有选中的列将不会出现在Update语句中。
◎
5.使DW自动折行
你可以在Datawindow中使列象MultiLineEditControl,方法如下:
在Datawindow
Painter中,把列的EditStyles选为Edit,取消AutoHScroll并且选择VScroll
Bar.确信Limit是字符的确实个数。
单击OK.现在你可以改变列的高度和宽度了。
但用户敲到一行的末尾时,会自动跳到下一行。
也可以敲Enter来结束。
注意:
连在一起的汉字(中间没有标点或空格分隔),系统将认为是一个单词,不会自动进行折行
6.当你创建一个编辑风格为drop-downDataWindow(ordrop-downlistbox)时,并且实际字段允许为空(emptystringisnull),你必须让用户可以删除选中的值.
如果required选项选中,你不可能去掉dddw中的值,因此,required不能选中。
在DW中定义事件:
pbm_dwnkey(PFCdoesthisforyouwiththekeyeventinu_dw.)
脚本:
strings_null
longl_row
IFkey=KeyDelete!
THEN
IFThis.GetColumnName()='dept_id'THEN
l_row=This.GetRow()
IFl_row<1THEN
Return
ENDIF
SetNull(s_null)
This.SetItem(l_row,'dept_id',s_null)
ENDIF
ENDIF
7.取出列的显示内容
stringls_value
ls_value=dw_1.describe("Evaluate('lookupdisplay(column_name)',1)")
column_name=列名,'1'表示第一行;看看Help中的Describe
8.每页打印固定行
第一步:
增加一个计算列,此计算列必须放在Detail段,Expression中输入:
ceiling(getrow()/20)
<--这里20还可以用全局函数取代,这样可以允许用户任意设置每页打印多少行.
第二步:
定义分组,选择菜单Rows->CreateGroup...
按计算列字段分组,并一定将checkbox-->NewPageOnGroupBreak选中。
第三步:
将此计算列设为不可视。
另外,如果需要最后一页不足补空行。
也很简单,如下:
longll_pagerow=6//每页打印行数
longll_count,ll_rowll_count=dw_report.retrieve(...)
//取得现有报表的总行数
ll_count=ll_pagerow-mod(ll_count,ll_pagerow)
Ifll_count dw_print.insertrow(0)//补足空行 next endIf 9.PowerBuilder提供了一种使用函数的方法来高亮度显示数据窗口中细节栏 但有时你需要高亮度显示分组条及细节栏, 这时你需要增加一个long类型的实例变量(假设为Il_LastRow), 并且在数据窗口中增加一个额外的列(假设为highlight), 并在rowfoucs事件增加以下代码: SetItem(il_LastRow,'highlight',0)SetItem(currentrow,'highlight',1) il_LastRow=CurrentRow 然后在细节栏中增加一个矩形框,并将下列表达式加入到背景色之中: if(sum(highlightFORGROUP1)>0,65535,16777215) 10.在特殊应用中需要取得某窗口内部需要有多少控件及这些控件的属性,以下是取控件的script: longll_control_count,ll_index//控件数量,当前控件 Objectlobj_type//控件类型 ll_control_count=upperbound(parent.control[]) messagebox('Object','共有'+string(ll_control_count)+'个对象') forll_index=1toll_control_count lobj_type=parent.control[ll_index].TypeOf() choosecaselobj_type caseCheckBox! checkboxlch_temp lch_temp=parent.control[ll_index] messagebox('CheckBox: '+lch_temp.classname(),lch_temp.width) casestatictext! statictextlst_temp lst_temp=parent.control[ll_index] messagebox('Statictext: '+lst_temp.classname(),lst_temp.width) casecommandbutton! commandbuttonlcm_temp lcm_temp=parent.control[ll_index] messagebox('CommandButton: '+lcm_temp.classname(),lcm_temp.width) caseline! linelli_temp lli_temp=parent.control[ll_index] messagebox('Line: '+lli_temp.classname(),lli_Temp.endx-lli_Temp.beginx) endchoose endfor 11.数据窗口根据不同的内容自动检索 datawindowchilddwChild Choosecasedwo.name case"province"//省份发生改变,需要动态更新城市下拉窗口 Ifthis.GetChild("city",dwChild)<>1Then MessageBox("Error","GetChildError! ") Return0 EndIf dwChild.Settransobject(sqlca) //----第一种方法使用setfilter过滤数据,宜于数据较少300行以下 dwChild.Setfilter("province="+data) //如果是字符型,用下面代码 //dwChild.Setfilter("province='"+data+"'") dwChild.filter() //---------------------------------------------------------------------------------------// //---或使用第二种方法使用带参数的Datawindow,宜用于数据行较多情况 dwChild.Retrieve(data) //-----------------------------------------------------------------------------------------------// EndChoose 12.美化DataWindow的显示效果 使DataWindow的单双行显示颜色不同,不仅仅可以使你的应用程序更显专业性,并使数据的可读性增强。 先调出你需要改动的DataWindow,在Detailband按下右键选择Properties,选择Tab页中的Expressions,在color属性中输入下面内容: (注意是在Detail明细显示段按右键,而不是在Column上) IF(MOD(GETROW(),2)=0,RGB(192,192,192),RGB(255,255,255)) 13.当表(Table)的定义发生改变以后同步DataWindowcolumns 有许多普遍现象是当DataWindow建立以后发现原来字段长度不够而改动Table。 例如: 将原字段由Char (2)改为Char(4),同步的方法是打开原Datawindow,选择菜单Design->DataSource,先单击此字段(改为不选择状态)紧接着再次单击此字段(重新选择此字段);如果你的DataSource使用的是SQL语法而不是图形方式,则先将此字段加亮选择以后,用“剪切”然后“粘贴”的方法同步。 返回DataWindow设计窗口,PowerBuilder已经自动将Column的Type改正,可以通过菜单Row->Columnspecifications...查看结果。 另外,如果此字段可编辑,还需要查看它的编辑风格(EditStyles)是否正确,特别改动是Limit,应从2改为4。 14.使用Line建立漂亮的GridDataWindow的技巧 虽然PowerBuilder有Grid风格的DataWindow,但不够灵活,如果想打印一张边框粗线条或双线,内框为细线条的表格直接使用Grid风格的DataWindow就不能实现。 因此许多人都用Tabular风格的DataWindow,然后自己用Line来实现Grid。 在调整线条位置是一个即伤脑筋又伤眼睛的事件,而一旦需要调整行高,所有工作都得重来,试一试用下面方法,会大大减轻你的工作量: 在verticallines,改变它的属性,在ExpressionsTab上,y1行上输入0,y2行上输入rowheight()-1 在horizontallines,设置y1和y2=rowheight()-5 这样PowerBuilder会自动调整线的坐标,你只需要设置横线的长度和x1,x2的坐标即可。 16.用户按控制菜单中的Close按钮(窗口右上角)关闭窗口时会触发 pbm_syscommand 事件,定义事件如下: ue_closepbm_syscommand在事件中加入如下代码: IFMessage.WordParm=61536THENMessageBox("","窗口将关闭") ENDIF 17.当鼠标拖动时Windows首先会向鼠标下的窗口发送一个wm_nchittest消息, 窗口收到这个消息后再由窗口的消息处理函数进行处理,消息处理函数将 会返回一个整数表示鼠标正处于窗口的什么部位。 大家只需要知道的是处理函数 返回2,表示鼠标正处于窗口的标题栏上。 根据这一点,我们只要截获这条消息, 然后直接返回2。 这样不管鼠标真正位于窗口的什么部位,WINDOWS一律认为 鼠标位于标题栏上。 因此,用户自然可以拖动窗口。 下面是具体的步骤: 1为窗口定义用户自定义事件 EventName: ue_nchittest EventID: pbm_nchittest 在事件ue_nchittest中编写代码 Return2 可用这种方法为Button、Text等可视控件也加上上述的事件与代码 (关于WM-NCHITTEST可参考winuser.h)
在窗口的MouseDown事件中编写如下脚本
Send(Handle(this),274,61458,0)
(在pbm_mousemoveevent中有何效果?
)
18.为Datawindow的每一行显示行号
可以简单的放一个表达式为GetRow()--计算列。
但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为GetRow()-First(GetRow()forGroup1)+1的计算列。
19.数据窗口自动折行
你可以在Datawindow中使列象MultiLineEditControl,方法如下:
在DatawindowPainter中,把列的EditStyles选为Edit,取消AutoHScroll并且选择VScrollBar.确信Limit是字符的确实个数。
单击OK.现在你可以改变列的高度和宽度了。
但用户敲到一行的末尾时,会自动跳到下一行。
也可以敲Enter来结束。
注意:
连在一起的汉字(中间没有标点或空格分隔),系统将认为是一个单词,不会自动进行折行。
20.
我们先看两个计算列的表达式:
IF(GetRow()=First(GetRow()FORPage),1,0)//1,为当前页的第一行IF(GetRow()<>1ANDGetRow()=Last(GetRow()FORPage),1,0)//1,为当前页的最后一行由上面可知,在FooterBand中设置如下计算列表达式:
'Rows'+String(First(GetRow()FORPage))+'to'+String(Last(GetRow()FORPage))+'aredisplayed'。
即可达到这项功能。
21.允许用户任意设置每页打印多少行
第一步:
增加一个计算列,此计算列必须放在Detail段,
Expression中输入:
ceiling(getrow()/20)
这里20还可以用全局函数取代,这样可以允许用户任意设置每页打印多少行.
第二步:
定义分组,选择菜单Rows->CreateGroup...
按计算列字段分组,并一定将checkbox-->NewPageOnGroupBreak选中。
第三步:
将此计算列设为不可视。
另外,如果需要最后一页不足补空行。
也很简单,
如下:
longll_pagerow=6//每页打印行数
longll_count,ll_rowll_count=dw_report.retrieve(...)
//取得现有报表的总行数
ll_count=ll_pagerow-mod(ll_count,ll_pagerow)
Ifll_count dw_print.insertrow(0)//补足空行 next endIf 22.Pb中定制打印页长 ----在使用连续纸打印数据窗口的情况下,需要定制打印的页长,以保证打印机走纸正确,不用人工干预,实现连续打印。 在PB中须调用外部函数来自定义纸张长度,比较繁琐。 本文介绍一种直接对打印机的控制方法,简单实现对页长的设定。 一、预备知识 ----计算机与打印机的通讯使用ASCII码进行,其中标准ASCII码包括可打印字符及非打印字符(控制码),打印机使用控制码来定制打印机。 大多数打印机指令使用控制码escape作为其指令序列的第一个序列码。 下面介绍本文用到的几个指令码序列: 设置换行量(行距)1/8英寸,ASCII码ESC0十进制码2748,设置以行为单位的页长ASCII码ESCCn,十进制码2767n其中n为每页行数范围(1-127) ----二、PB中控制码的传送及定制页长的实现 ----在PB中通过函数Printsend(printjobnumber,string,{zerochar})来实现向打印机发送控制码。 各参数定义如下: printjobnumber: 由printjob()函数返回的打印作业号; string: 控制字符串,使用ASCII码; zerochar: 用来替代string中的数字0; ----由于字符串中,0终止字符串,如果string中包含0,则需利用其他字符来表示0,参数zerochar即为此用途而设,当PB发送控制字符串给打印机时,把替代的字符zerochar转化为0。 ----下面是具体的完成定制页长打印数据窗口的程序(定制页长为2.75英寸): longll_job dw_print.reset() ll_job=printopen() ifll_job=-1then messagebox(gs_title,"打印机未准备好") return endif //定制行距1/8英寸 PrintSend(ll_job,CHAR(27)+CHAR(48)) //设定页长22行 PrintSend(ll_job,CHAR(27)+CHAR(67)+CHAR(22)) printdatawindow(ll_job,dw_print) printclose(ll_job) 23.PB中如何得到Crosstab中的列名
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PB 技巧