|
以下的[数据库]代表Database, [表]代表Table,[字段]代表Field或Column。
在设置DataWindow的过滤条件时注意比较符and or not like的先后顺序,最后以括号明显的表示顺序为好,提高可读性,确保结果万无一失。
例如下面的语法就是错误的 dw_1.setFilter("name like '赵%' and sex = 0") 因为and的级别比like优先,所以需要改为 dw_1.setFilter("(name like '赵%') and (sex = 0)")
复制和粘贴Text对象以节约时间
在Datawindow中往会有许多Text对象用于显示一些报表的其他信息,为了节约时间,当有一个text已设置好字体,颜色,你只用简单的用Mouse右键选择此Text,然后从弹出菜单中选择“复制”和“粘贴”即可生成一个同样风格和外观的Text对象,如果需要的话,简单的设置此文本的名称即可。
方便编程,去掉Column名称讨厌的table前缀字符串
在DataWindow数据源中如果有多于一张表,在生成的Column名称会以tablename_field1形式出现,这样在使用Setitem, GetItemxxxxx等函数时免不了要多键入一些字符,如果你在选择数据源时先选择一张主表(通常是需要update的表,使用Setitem,GetItemxxxx函数机会最多的),然后选择需要的列生成Datawindow以后,再改动data source,加入新的表,这样只有新加入表的Column名称才会以tablename_field1形式出现。
用记事本查看Datawindow数据
dw_1.SaveAs("c:\sample.txt", Text!, TRUE) Run ("Notepad.exe c:\sample.txt", Maximized!) 可以将这段代码放在DoubleClicked(鼠标双击)事件中,实现快速数据转换 利用Query对象快速建立二个具有相同数据源不同表现风格的DataWindow
打开已有的datawindow,然后在Data Source菜单中选择File->Save Query将数据源保存为query对象,这样生成新datawindow时,在出现Select Table 对话框时单击cancel按钮,然后选择菜单File->Open Query调出相应对象,这样就快速生成了Datawindow,这种方法在Data Source由多张表组成的时候很方便。
关于Datawindow每页打印固定行的问题 第一步:增加一个计算列,此计算列必须放在Detail段,Expression中输入: ceiling(getrow()/20) <--这里20还可以用全局函数取代,这样可以允许用户任意设置每页打印多少行。 第二步:定义分组,选择菜单Rows->Create Group... 按计算列字段分组,并一定将check box-->New Page On Group Break选中。 第三步:将此计算列设为不可视。
另外,如果需要最后一页不足补空行。也很简单,如下: long ll_pagerow = 6 //每页打印行数 long ll_count, ll_row ll_count = dw_report.retrieve(...) //取得现有报表的总行数 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
如何动态地使DataWindow中的DropDownDW按某一条件显示内容
关键:使用GetChild,然后使用Retrieve或Setfilter方法即可。
详细说明:Datawindow有两个字段,一个为省份c,一个为城市city,城市为DropDownDw,需要根据省份的动态改变城市的显示内容,编程方法如下(pb6版本):
datawindowchild dwChild Choose case dwo.name case "province" //省份发生改变,需要动态更新城市下拉窗口 If this.GetChild("city", dwChild) <> 1 Then MessageBox("Error", "GetChild Error!") Return 0 End If dwChild.Settransobject(sqlca) //---- 第一种方法 使用setfilter 过滤数据,宜于数据较少300行以下 dwChild.Setfilter(" province = " + data) //如果是字符型,用下面代码 //dwChild.Setfilter(" province = '" + data + "'") dwChild.filter() //---------------------------------------------------------------------------------------// //--- 或使用第二种方法 使用带参数的 Datawindow,宜用于数据行较多情况 dwChild.Retrieve(data) //-----------------------------------------------------------------------------------------------// End Choose
对于已有DataWindow增加新的字段需要手工设置Edit limit属性,保证应用程序对用户的友好性。 在你建立一个新的DataWindow时,你通常是选择一个或多个Table,然后选择一个或多个字段,返回Design状态后,Powerbuilder自动设置每一个字符型的字段输入长度限制,例如char(10)的字段,edit limit自动为10。
但是当你返回SQL中选择你漏掉的字段,PowerBuilder不会自动设置输入长度限制Edit limit和Auto Selection选择,这样用户可以输入超过最大长度的字符,而导致弹出不友好的错误提示框。所以需要你自己手工设置Edit Limit。
初始化字段默认值的方法:
使用菜单 Rows -> Column Specifications对话框可以设置字段的初始值,当使用InsertRow函数时PB会自动根据设置来初始化此字段,最常见的用法:
使用Today来对日期型字段赋初值,使用0,1等来初始化一些表示某状态的字段
下面有一些特殊值的设置方法你是否知道呢:
Empty — 0长度的字符串(很有用,免除你在保存数据之前,需要同时判断此字段是否为Null或长度是否为0,即未输入有效值的情况) Null — 无值(不等同于0长度的字符串) Spaces — 以空格填充(空格长度根据字段在数据库中的定义自动填充)
在初始值需要根据程序运行时确定,也可以在程序中动态设置,方法是:
dw_contro.object.columnName.initial = 'xxxx'
解决PB中自定义纸张的问题
建议用PowerPrint DLL来解决,或用下面方法:
许多朋友都提到PB对于自定义纸张的问题,在VB中可通过Printer对象来控件纸张的大小,虽然PB有Printer对象,但没有控制纸张大小的属性,只有另寻办法!
下面是一种解决方法,有其它办法的朋友请在留言板中提出或发Email给我,多谢:
需要自定义纸张的程序,一般都是打印票据,而在某些报表又需要按标准纸张打印,所以很多朋友都希望将自定义纸张大小定好,不允许用户改动。首先,可以在Windows95中增加二个打印机(它们除名称不一样,都使用同一个打印端口,同一个打印机驱动程序),名称固定下来(如"票据专用打印机"和"报表专用打印机"),当然,并不是需要大家真正安装二个打印机,根据你的需要分别对这二个打印机设置不同的打印纸张大小,然后在程序中根据需要使用API动态改变当前打印机。最后如果你的系统是作为项目需要卖给其他公司,在安装好以后,为防止非专业人员改动配置,你要以使用Window提供的系统策略管理器设置权限。
美化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一下,看一看效果如何。
当Retrieve时不清除原有Datawindow数据
当你调用Retrieve函数,PowerBuilder自动清除原有DataWindow然后Retrieve数据。在Datawindow RetrieveStart事件中,使用Return 2,这样PowerBuilder不会清除原有数据而是追加新数据。
当表(Table)的定义发生改变以后同步DataWindow columns有许多普遍现象是当DataWindow建立以后发现原来字段长度不够而改动Table。例如:将原字段由Char(2)改为Char(4),同步的方法是打开原Datawindow,选择菜单Design->Data Source,先单击此字段(改为不选择状态)紧接着再次单击此字段(重新选择此字段);如果你的Data Source使用的是SQL语法而不是图形方式,则先将此字段加亮选择以后,用“剪切”然后“粘贴”的方法同步。
返回DataWindow设计窗口,PowerBuilder已经自动将Column的Type改正,可以通过菜单Row->Column specifications...查看结果。
另外,如果此字段可编辑,还需要查看它的编辑风格(Edit Styles)是否正确,特别改动是Limit,应从2改为4。
在表格(Grid)风格的DataWindow移动Column
当你建立一个表格风格的DataWindow,你可能需要调整Column的先后顺序,PowerBuilder不允许你在设计状态拖动Column的位置。
窍门是先进入预览(preview)状态,然后就可以拖动Column调整成为你需要的先后顺序。
在表格(Grid)风格的DataWindow放入标题
在国内企业的报表表现形式通常以表格居多,PowerBuilder提供了表格风格的DataWindow,但打印表头需要稍稍下一点功夫。
第一步:先放一个Text(文本框)对象到DataWindow的表头上,在此Text上点击鼠标右键选择Properties->Postion->layer,将layer改为Foreground,这样你就可以改变Text的位置和宽度,然后将此Text的内容改为正确的报表标题即可,注意还需要将此Text的背景改为非透明色,否则会看到表线。
第二步:按第一步做完以后,当用户拖动Column改变宽度时,Text框是不会自动变化大小,可以有两种方法处理此问题。一是改动DataWindow的设置,不允许用户改动Column宽度,这种方法可用于报表为固定格式,另一种方法是通过读取DataWindow的Syntax.Modified属性来动态设置Text的宽度。需要详细解决方法的发Email给我。
使用Line建立漂亮的Grid DataWindow的技巧
虽然PowerBuilder有Grid风格的DataWindow,但不够灵活,如果想打印一张边框粗线条或双线,内框为细线条的表格直接使用Grid风格的DataWindow就不能实现。因此许多人都用Tabular风格的DataWindow,然后自己用Line来实现Grid。
在调整线条位置是一个即伤脑筋又伤眼睛的事件,而一旦需要调整行高,所有工作都得重来,试一试用下面方法,会大大减轻你的工作量:
在vertical lines,改变它的属性,在Expressions Tab上,y1行上输入0,y2行上输入rowheight() - 1
在 horizontal lines, 设置 y1 和 y2 = rowheight() - 5
这样PowerBuilder会自动调整线的坐标,你只需要设置横线的长度和x1,x2的坐标即可。
马上Preview一下,看一看效果!
你再也不需要因为行的高度发生改变而重新调整线条位置。 |