PB_DataWindow_38个技巧

合集下载

DataWindow高级应用

DataWindow高级应用

4 使資料視窗中的被選中行具有更好的外觀
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) 您還可以定制本選中行的字體,文本屬性等等。原理 相同,不再贅述。
如何在DataWindow中用資料類型為Datetime DataWindow中用資料類型為Datetime的列 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) + "')"
4 使資料視窗中的被選中行具有更好的外觀
多行選擇 多行選擇比較複雜,如果單純依靠改變資料視窗的屬性 沒法實現,我們必須使用資料視窗屬性和代碼結合起來才 能實現 首先,改變資料視窗的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 事件的處 理,代碼如下:

PB动态数据窗口

PB动态数据窗口

[PB]-动态数据窗口〓创建动态数据窗口若要动态创建数据窗口,需要使用函数Create,该函数的语法如下:dw_1.Create(syntax{,errorbuffer})其中,dw_1是数据窗口控件的名称,该数据窗口控件要和新创建的数据窗口对象相关联。

syntax是用来描述创建数据窗口对象的确切语法的字符串。

errorburrer是可选项,用来保存创建数据窗口对象过程中发生的错误信息。

如果不指定该参数,就会在发生错误时显示一个错误信息的提示窗口。

如果创建成功该函数返回1,否则返回-1,如果参数为null则函数返回null。

由于Create函数成功创建数据窗口对象后,要改变dw_1数据窗口控件所关联的数据窗口对象,因此,需要重新为数据窗口设置事务对象(使用函数SetTransObject或者SetTrans)。

获取创建数据窗口的语法有多种方法,可以对相关的SQL语句使用SyntaxFromSQL函数,也可以使用对已经创建好的数据窗口对象使用LibraryExport函数。

因为创建数据窗口的语法比较复杂,即使使用了LibraryExport输出已有数据窗口对象的语法,操作起来也相当费劲。

所以,更为通用的是前面一种方法。

这种方法配合一定的编程技巧,让用户指定要创建的数据窗口对象的SQL语句,使用户有更多的自由和选择。

使用这种方法,肯定用到函数SyntaxFromSQL,它的语法是:transaction.SyntaxFromSQL(SQLselect,presetation,err)其中,transaction是事务对象的名称,该事务对象必须正确地设置了相关参数,并且和数据库建立了联结。

SQLselect是用来创建数据窗口的SQL语句,为String 类型。

presentation是要创建的数据窗口对象的显示风格,为String类型。

简单的格式是:Style(Type=presentationstyle)其中Style和Type都是保留字,presentationstyle的取值有Tabular,Grid,Form,Graph,Group,Label和Nup,其中Tabular是缺省类型。

在PB中利用DataStore实现查询条件的记忆

在PB中利用DataStore实现查询条件的记忆

在PB中利用DataStore实现查询条件的记忆---- DataStore是非可视的数据窗口控件,它能够为应用程序存储数据而不消耗任何图形资源。

除了一些可视特征外,它的功能及行为与数据窗口控件相同。

因此,我们可以利用DataStore的特点方便地记忆和维护查询条件。

---- 第一步,在数据库中建立一个查询条件表,其中包含每个要用到的条件字段(如标题、文献来源、开始日期、结束日期等)和一个日期字段、时间字段。

该表用来保存最近使用的10个(如果需要可以保存任意个)不同条件,每个条件就是一条记录,后两个字段(日期、时间)用来记载条件的使用时间。

---- 第二步,创建一个包含查询条件表中所有字段的数据窗口对象dw_condation,按使用时间的先后排序。

进行查询条件设置时,---- 第三步,构造如下图的查询条件设置窗口。

---- 四个复选框对应四个条件字段,左、右方向按钮用来浏览设置最近使用过的条件。

---- 第四步,为窗口事件及各控件编写相应的程序。

---- 定义窗口实例变量:datastore ids_Datalong currentrow窗口的Open事件:ids_Data = Create DataStore//创建数据存储实例ids_Data.DataObject = "dw_condation"//将dw_condation数据窗口对象与ids_Data连接ids_Data.SetTransObject(sqlca)ids_data.retrieve()if ids_data.rowcount() >1 then//设置当前条件为最后一次使用的条件pb_3.enabled=truecurrentrow=ids_data.rowcount()trigger event ue_setquery(ids_data.rowcount())end if窗口自定义事件ue_setquery:string bt,source//标题、文献来源date start_day,end_day//开始日期、结束日期long page//页号//根据参数rownum从数据存储实例中得到各条件值bt=ids_Data.Object.bt[rownum]source=ids_Data.Object.source[rownum]start_day=ids_Data.Object.begin[rownum]end_day=ids_Data.Object.end[rownum]page=ids_Data.Object.page[rownum]//初始化各窗口控件的状态cbx_1.checked=falsecbx_2.checked=falsecbx_3.checked=falsecbx_4.checked=falsesle_1.enabled=falseddlb_1.enabled=falseem_1.enabled=falseem_2.enabled=falseem_3.enabled=false//分别设置各个条件值if not isnull(bt) and trim(bt)<>"" thencbx_1.checked=truesle_1.enabled=truesle_1.text=btend ifif not isnull(source) and trim(source)<>"" thencbx_2.checked=trueddlb_1.enabled=trueddlb_1.text=sourceend ifif isnull(start_day) orstart_day=date("1900-1-1") thenem_1.text=string(today(),"yyyy-mm-dd")elsecbx_3.checked=trueem_1.enabled=trueem_1.text=string(start_day,"yyyy-mm-dd")end ifif isnull(end_day) orend_day=date("1900-1-1") thenem_2.text="2050-1-1"elsecbx_3.checked=trueem_2.enabled=trueem_2.text=string(end_day,"yyyy-mm-dd")end ifif not isnull(page) and page<>0 thencbx_4.checked=trueem_3.enabled=trueem_3.text=string(page)end if窗口的Close事件:destroy ids_data//清除数据存储实例pb_3(向前按钮)的Clicked事件:if currentrow >1 then//设置前一个条件为当前条件currentrow=currentrow - 1trigger event ue_setquery(currentrow)pb_4.enabled=trueif currentrow=1 then this.enabled=falseend ifpb_4(向后按钮)的Clicked事件:if currentrow< ids_data.rowcount() then//设置后一条件为当前条件currentrow=currentrow + 1pb_3.enabled=trueif currentrow=ids_data.rowcount()then this.enabled=falsetrigger event ue_setquery(currentrow)end ifpb_1(确定按钮)的Clicked事件:string bt,source,sqltext,sql_all,sql_title,sql_source,sql_date,sql_pagedate start_day,end_daylong page,rownum,rowcountboolean exist//根据用户设置的条件动态生成查询SQL语法if cbx_1.checked thenbt=sle_1.textsql_title='"index"."title" like '+"'%"+bt +"%'"end ifif cbx_2.checked thensource=ddlb_1.textsql_source=' and "index"."source" like ' +"'%"+source +"%'"end ifif cbx_3.checked thenstart_day=date(em_1.text)end_day=date(em_2.text)sql_date='and"index"."date">='+"'"+string(start_day,"yyyy.mm.dd")+"'"+'and '+'"index"."date"< ='+"'"+string(end_day,"yyyy.mm.dd") +"'"end ifif cbx_4.checked thenpage=long(em_3.text)sql_page=' and "index"."page"='+string(page) end ifsqltext='SELECT "index"."num", ' &+'"index"."title", ' &+'"index"."source", ' &+'"index"."date", ' &+'"index"."page", ' &+'"index"."other" ' &+' FROM "index" ' &+' WHERE '+sql_title +sql_source+sql_date+sql_page &+' ORDER BY "index"."num" ASC 'rowcount=ids_data.rowcount()for rownum=1 to rowcount//判断该条件是否已经存在if ids_data.object.data[rownum,1]=bt and &ids_data.object.data[rownum,2]=source and & ids_data.object.data[rownum,3]=start_day and & ids_data.object.data[rownum,4]=end_day and & ids_data.object.data[rownum,5]=page thenids_data.object.data[rownum,6]=now()ids_data.object.data[rownum,7]=today() exist=trueexitend ifnextif not exist then//条件不存在,记忆新条件if rowcount< 10 thenelseids_data.deleterow(1)end ifrownum=ids_data.insertrow(0)ids_data.object.data[rownum,1]=btids_data.object.data[rownum,2]=source ids_data.object.data[rownum,3]=start_day ids_data.object.data[rownum,4]=end_day ids_data.object.data[rownum,5]=pageids_data.object.data[rownum,6]=now() ids_data.object.data[rownum,7]=today() end ifids_data.update()//根据生成的SQL语句,修改主窗口中的数据窗口语法,进行查询w_index.dw_1.setsqlselect(sqltext)close(parent)if isvalid(w_index)then w_index.dw_1.retrieve()pb_2(取消按钮)的Clicked事件:close(parent)>>>转载>>>>>>Datawindow控件实质是一个窗口,而Datastore则是一个隐藏的窗口,即Visible,Redraw属性都为假,这也是为何Datastore操作数据比Datawindow更快的一个原因,它占用的系统资源更少,消耗的系统时间也更少。

PB的数据窗口操作

PB的数据窗口操作

PB的数据窗口操作PB(PowerBuilder)是一种基于面向对象的集成开发环境(IDE),主要用于构建企业级应用程序。

在PB中,数据窗口是一项非常重要的功能,可以用于对数据的处理、展示和修改。

下面将从数据窗口的基本操作、高级特性和数据窗口设计原则等方面,详细介绍PB的数据窗口操作。

一、数据窗口的基本操作1. 创建数据窗口:在PB中,可以通过向导或手动创建数据窗口。

创建数据窗口是通过选择数据源(数据库表、视图或存储过程)、选择数据窗口类型(Grid、Tabular等)和设置窗口布局等步骤完成的。

2.数据绑定:在数据窗口中,可以通过数据绑定将数据源与数据窗口中的控件关联起来。

通过设置数据绑定属性,可以实现数据的读取、展示和修改等功能。

3.数据检索:使用数据窗口可以方便地进行数据检索。

通过设置查询条件、排序方式和数据过滤等属性,可以按照需求从数据库中检索数据,并在数据窗口中显示出来。

4.数据更新:除了展示数据,数据窗口还可以用于数据的更新。

通过设置数据窗口的更新属性,可以实现数据的插入、修改和删除等操作。

同时,PB还提供了事务管理和数据验证等功能,确保数据的完整性和一致性。

5.数据导航:在数据窗口中,可以轻松地实现数据的导航功能。

通过设置数据窗口的导航属性,可以方便地浏览数据,并进行上一条、下一条、第一页和最后一页等操作。

6.数据格式化:PB提供了丰富的数据格式化选项,可以对数据窗口中的数据进行格式化和显示。

例如,可以设置日期格式、货币格式和数值格式等,以便更好地展示和分析数据。

二、数据窗口的高级特性1.动态数据窗口:PB允许动态创建和操作数据窗口。

通过使用动态数据窗口,可以在运行时动态改变数据窗口的结构和属性。

这对于动态查询和灵活的数据展示非常有用。

2.嵌套数据窗口:PB支持嵌套数据窗口的使用。

通过将一个数据窗口嵌套在另一个数据窗口内部,可以实现复杂的数据关联和显示。

例如,可以在父数据窗口中显示子数据窗口的数据。

pb的编程技巧

pb的编程技巧

PowerBuilder编程技巧1、数据的转储和调入功能的实现一个数据处理系统的安全性部分是整个系统的关键部分,对于一些需要长期保存的历史数据来说更是必不可少。

对于现代的大型数据库管理系统来说,数据的安全性独立交给DBA来专门管理,一般的系统较少涉及数据的备份工作。

为了减少计算机专业人员的负担,一个好的MIS系统应该提供数据的转储和调入功能,这样对数据库管理系统不太了解的用户也可以进行数据安全方面的处理。

PowerBuilder中SaveAs()、ImportFile()两函数可以实现这方面的操作,dwcontrol.SaveAs()提供了多种数据的存储格式,如dBase的DBF格式、以TAB 作为分隔符的文本TXT格式、Excel格式、SQLInsert格式、CSV格式。

dwcontrol.ImportFile()将数据从各种格式的文本文件中调入数据窗口控制里。

2、简洁美观的数据报表的创建一个系统里的报表应该具有一致的风格,报表至少应该具有如下几种项目:报表的标题、报表的日期和时间、报表的页序、报表涉及的对象和条件。

PowerBuilder 提供了各种类型的数据窗口,报表中主要用到如下几种类型: Free风格,该数据窗口的数据排列,用户可以任意调整,有最大的自由性。

Grid风格,以表格的方式显示数据,外观比较工整,美观明了。

Graph风格,以图形方式显示数据,有直方格、圆饼图、曲线图、三维立体柱图。

Group风格的数据窗口提供了一种对数据进行分组的简便途径,它生成了一个具有分组属性的Tabular风格的数据窗口对象。

3、Mdi窗体技术的应用随着Windows系统的出现,图形交互界面得到了用户的喜爱,已成为一种潮流,其中Mdi窗体技术更是吸引人。

Mdi窗体,即是多文档交互式窗体,亦叫无模式窗体。

这种窗体包括一个Mdi主窗口及多个Mdi子窗口,子窗口只能在框架之内出现和移动,可以同时打开多个Mdi子窗口,但同一时刻只能有一个窗口处于被激活状态,当主窗口关闭时,同时关闭所有子窗口。

pb常用操作技巧

pb常用操作技巧

这是刚毕业时在某一“大”公司使用PB6.5开发联通营帐系统时的笔记虽然好久没有也许以后也不会再使用pb开发程序了但这算是我使用过的唯一一个前端专业开发工具把笔记记录下来权当作纪念吧_ //PB中标准调用sql语句ls_sql quotselectroad_name from bb_data_wide_bus_temp_t where register_number quotls_register_number quotquot declare cur_get dynamic cursor for sqlsa prepare sqlsa from :ls_sql open dynamic cur_get fetch cur_get into :ls_value if sqlca.sqlcode ltgt 0 then messagebox操作信息提取失败exclamation end if close cur_get //PB中标准循环调用sql语句DECLARE cur_sql DYNAMIC CURSOR FOR SQLSA PREPARE SQLSA FROM :ls_sql OPEN DYNAMIC cur_sql do while sqlca.sqlcode 0 FETCH cur_sql INTO :ls_register_number:ls_complete_note ll_sqlcode sqlca.sqlcode if ll_sqlcode lt 0 then CLOSE cur_sql af_disconnect messagebox错误提示检索受理编号错误StopSign return elseif ll_sqlcode 100 then exit end ifddlb_register_number.additemtrimls_register_number ls_complete_note loop CLOSE cur_sql //窗口open事件通用脚本//置窗口居中af_center_windowthis //连接数据库af_connect //定义变量dataWindowChild dwc //获取城市代码下拉列表并取值dw_city_code.getChildcity_codedwc dwc.setTransObjectsqlcadwc.Retrievegs_citycodegi_citylevel dw_city_code.setTransObjectsqlcadw_city_code.Retrieve dw_city_code.setItem1city_codedwc.getItemString1city_codeis_city_code dw_city_code.getItemStringdw_city_code.getRowcity_code //获取业务类型下拉列表并取值dw_service_kind.getChildservice_kinddwcdwc.setTransObjectsqlca dwc.Retrieve dw_service_kind.setTransObjectsqlcadw_service_kind.Retrieve dw_service_kind.setItem1service_kind10 ii_service_kinddw_service_kind.getItemNumberdw_service_kind.getRowservice_kind //获取申请事项下拉列表并取值dw_apply_event.getChildapply_eventdwc dwc.setTransObjectsqlca dwc.Retrieveii_service_kind dw_apply_event.setTransObjectsqlcadw_apply_event.Retrievedw_apply_event.setItem1apply_eventdwc.getItemNumber1apply_event ii_apply_event dw_apply_event.getItemNumberdw_apply_event.getRowapply_event //激发查询事件cb_query.TriggerEventclicked //断开数据库af_disconnect //查询按钮通用脚本//连接数据库af_connect //定义变量dataWindowChild dwc //dw_1检索数据dw_1.setTransObjectsqlca dw_1.Retrieveii_service_kind //dw_2检索数据intli_rowli_row_temp dw_2.getChildactiondwc dwc.setTransObjectsqlcadwc.Retrieveii_service_kind dw_2.setRowFocusIndicatorhand dw_2.setTransObjectsqlca li_row_temp dw_2.Retrieveii_apply_eventii_service_kindis_city_codedw_2.scrollToRowli_row_temp //如果未检索到数据插入一空行有数据就过滤string ls_filter int li_action if li_row_temp 0 then dw_2.insertRow0 else for li_row 1 todw_2.rowCount li_action dw_2.getItemNumberli_rowaction ls_filter action ltgt stringli_action dw_1.setFilterls_filter dw_1.filter next end if //断开数据库af_disconnect //增加按钮通用脚本//变量定义int li_stepli_actionli_auto_statusli_row //确认选择要增加的记录if dw_1.getSelectedRow0 0 then MessageBox提示信息请选择要添加的记录exclamation return end if //取出要增加的信息li_stepdw_2.getItemNumberdw_2.getRowstep li_actiondw_1.getItemNumberdw_1.getSelectedRow0action li_auto_statusdw_1.getItemNumberdw_1.getSelectedRow0auto_status //添加信息li_rowdw_2.insertRow0 dw_2.setItemli_rowstepli_step dw_2.setItemli_rowactionli_actiondw_2.setItemli_rowauto_statusli_auto_status dw_2.scrollToRowli_row //删除按钮通用脚本//删除前先确认IF dw_2.GetRow 0 THEN MessageBox提示信息请选择要删除的记录exclamation Return ELSE IF MessageBoxquot提示信息quotquot确实要删除指定的记录quotQuestionYesNo2 2 THEN Return dw_2.DeleteRowdw_2.getRow END IF //保存按钮通用脚本//连接数据库af_connect //定义变量stringls_city_codels_error int li_service_kindli_apply_eventli_rowli_step dataWindowChild dwc //检测数据是否发生变化dw_2.AcceptText IF dw_2.ModifiedCountdw_2.DeletedCount 0 THEN MessageBoxquot操作提示quotquot数据未发生变化无需保存quotexclamation return END IF //检测是否为空或零dw_2.setSortstep adw_2.sort FOR li_row 1 TO dw_2.RowCount li_stepdw_2.GetItemNumberli_rowstep IF IsNullli_step OR li_step 0 THEN MessageBox操作提示步骤不能为空或零请重新输入exclamation dw_2.setRowli_row Return END IF NEXT //保存dw_2.SetTransObjectsqlca if dw_2.update 1 then commit messageboxquot提示信息quotquot保存成功quot dw_2.ScrollToRowdw_2.RowCount else ls_error sqlca.sqlErrText rollback messageboxquot提示信息quotquot保存失败quot char13 ls_errorstopSign return end if //断开数据库af_disconnect //打印按钮通用脚本if dw_1.rowCount gt 0 then if PrintSetup -1 then messagebox提示信息打印机设置出错Exclamation return else if dw_1.printtrue 1 then //显示可以取消打印的对话框Messagebox提示信息quot打印成功quot else Messagebox提示信息quot打印失败quotstopSign end if end if else Messagebox提示信息quot没有数据可以打印请先查询数据quotexclamation return end if //导出按钮通用脚本if dw_1.rowcount lt 0 then messageBox提示信息没有数据可以导出请先查询exclamation return end if ifdw_1.SaveAStexttrue 1 then messageBox提示信息导出成功end if //导入按钮通用脚本//变量定义string ls_pathfilels_filels_titlels_extls_filter int li_posli_fileid longll_buffer //变量赋值ls_title quot请选择数据文件quot ls_ext quottxtquot ls_filter quot文本文件.txt.txt全部文件..quot li_fileidGetFileOpenNamels_titlels_pathfilels_filels_extls_filter ifli_fileid 0 or ls_file quotquot then return end if sle_file_name.text ls_pathfile cb_ok.enabled true //退出按钮通用脚本closeparent 或closeWithReturnparentreturnvalue //调用过程通用脚本if dw_wp.rowcount lt 0 then return //变量定义string ls_sqlls_err_info stringls_register_numberls_accept_cityls_departmentls_oper_person integerli_err_codeli_apply_event //变量赋值ls_register_numberdw_wp.getitemstring1register_number ls_accept_city gs_citycode li_apply_eventdw_wp.getitemnumber1apply_event ls_department gl_dealerid ls_oper_persongs_workerid //连接数据库af_connect //调用配号撤单过程ls_sql quotexecutebb_pstn_assign_no_repeal_pquot declare proc_assign_no_repeal dynamic cursor for sqlsa prepare sqlsa from :ls_sql open dynamic proc_assign_no_repealusing :ls_register_number:ls_accept_city:li_apply_event:ls_department:ls_oper_person if sqlca.sqlcode -1 then ls_err_info sqlca.sqlErrText close proc_assign_no_repeal Rollback Messageboxquot错误信息1quotquot执行异常quot ls_err_infostopSignaf_disconnect return End if fetch proc_assign_no_repeal into :li_err_code:ls_err_info if li_err_code lt 0 then close proc_assign_no_repeal Rollback Messageboxquot错误信息2quotquot执行异常quot ls_err_infostopSign af_disconnect return end if closeproc_assign_no_repeal commit //断开数据库af_disconnect //撤单成功后打印工单dw_wp.print //PB某些控件的中文显示问题假如PB 的ListView 不能正常显示中文则应该将ListView 的FontCharSet 属性设置成其他类型。

powerbuilder(pb)数据窗口(datawindow)缓冲区与状态解释

PowerBuilder数据窗口缓冲区与状态详解Powerbuilder(pb)的datawindow(数据窗口)的各个缓冲区和状态是pb数据窗口的非常重要的,对这些概念的理解,将有助于我们认识pb数据窗口的优势。

基本概念数据窗口的三个缓冲区:Primary!Delete!Filter!Getitemstatus(row,列名或者列号,缓冲区)当要取整个行的状态时,列名或者列号用0表示数据窗口中数据项状态Notmodified! 从数据retrieve出来后没有改变过Datamodified! 数据retrieve出来后有过改变New! 数据窗口增加了一列但没有录入过数据,该列的状态就是new!Newmodified! 数据窗口增加了一列,同时改列被录入了数据,该列的状态就是newmodified!retrieve出来后,结果如下:notmodified用geitemstatus(行号,列名,primary!)取每一数据项状态用getitemstatus(行号,0,primary!)去行状态2、当我把Ccc改为AAA后,如下:001,002,ddd三个格子所在的数据项状态仍旧是notmodifiedAAA(原是Ccc)所在格子的数据项状态是datamodified第一行(001,AAA)的行状态是datamodified第二行(001,ddd)的行状态时notmodified后,如下:2点。

第三行状态就是new!请用getitemstatus(3,0,primary!)取第三行状态4、不保存,当把第三行数据填充后,如下第三行的状态将变为newmodified!第三行的每一项将变为datamodified!开发中实例:表1表2(因为是举例,请不要考虑数据库设置中的冗余概念,如表2中的姓名没必要等)需求一、删除表1中的数据的同时,把表2的数据也删除,必须删除,不考虑约束条件。

如把表1中001,002删除了,需要把表2中所有001,002的记录删除,(【删除】和【保存】是两个按钮或菜单,就是说【删除】只是删除了前台的内容,不【保存】数据库中数据是没有被删除的,数据库需要【保存】执行的时候才真正执行删除),怎么做?1、可以使用触发器;2、可以在删除之前把表1记录下来,【保存】时对比表1,看那些数据缺少了;3、……..DeletedCount ( )Getitemstring(row,列名,delete!,true)(为什么用true,不用false呢?,true是从数据库取出来的默认值,false是当前值,如果删之前用户修改过编号,但是没有保存,用false就会有问题)需求二、把表1中编号001改为了A01,002改为001,003改为B05,004,005不变(没有任何规律的),要求表二的编号也这么改过来。

PB知识点整理

变量类型•局部变量(Local ):在定义该变量的函数、事件中使用。

局部代码执行完即销毁。

•实例变量(Instance ):属于一个对象的一个实例。

实例不被销毁,变量一直存在。

如无特殊声明,则其他对象都可以访问该变量。

•共享变量(Shared ):被同一对象的多个实例中共同使用(无论有几个实例,都只有一个值),整个应用不被销毁,变量一直存在。

其他对象无法访问该变量。

•全局变量(Global ):属于整个应用。

整个应用不被销毁,变量一直存在。

所有对象都可以访问该变量。

•按变量的作用范围和生命周期来划分变量、常量的声明•变量说明:datatype variablename•变量名建议使用:变量类型+数据类型+”_”+其它,如:String gs_dwmcInt ii_countLong sl_useridDatetime ldt_todayString ls_xm,ls_bjLong ll_classid = 1•常量变量说明:CONSTANT datatype variablename = value数组•String ls_city[] //下标默认从1开始•String ls_city[10] //下标默认从1开始•String ls_city[2 to 20] //下标从2到20•String ls_city[2,10]•数组初始化:int li_i[9]={2,3,4,5,6,7,8,9,10}•数组循环赋值:int i,li_i[9]for i=1 to 9li_i[i] = i+1next结构str_student lstr_studentlstr_student.id=1lstr_student.xm=‘张三’lstr_student.xb=‘1’lstr_student.csrq=date(‘1975-01-01’)Openwithparm(w_test,lstr_student)str_student lstr_studentlstr_student=message.powerobject加减乘除•算术运算:+, - , *, /, ^•关系运算:=, <>, >, <, >=, <=, like•逻辑运算:NOT, AND, OR•字符串连接:ls_name = ls_name + ‘医院’常用的函数•Messagebox:显示出错、警告、提示及其他重要信息。

pbdatawindow统一大小字体的函数

pbdatawindow统一大小字体的函数要在PowerBuilder的数据窗口中统一设置大小和字体,可以使用以下的代码函数来实现:```int li_font_sizestring ls_font_name//设置字体大小和名称li_font_size = 10 // 字体大小ls_font_name = "Arial" // 字体名称//获取字体对象font lfontlfont = new font(ls_font_name, li_font_size)//遍历数据窗口中的所有列int li_col_countli_col_count = dw_1.RowCountfor li_col = 1 to li_col_countdw_1.ModifyColumn(li_col, "='" + ls_font_name + "'") dw_1.ModifyColumn(li_col, "Font.Height=" +string(li_font_size))next//更新数据窗口的显示dw_1.Redraw```在这个例子中,我使用了一个名为`dw_1`的数据窗口示例,并假定这个数据窗口已经被创建和显示。

代码中首先设置了要使用的字体大小和名称,然后通过创建一个包含这些属性的`font`对象来获取字体。

接下来,使用`ModifyColumn`函数遍历数据窗口的每一列,并使用修改后的字体属性更新每一列的字体。

最后,使用`Redraw`函数更新数据窗口的显示,使更改生效。

请注意,这只是一个简单的示例代码,你可以根据自己的需求进行调整和扩展。

同时,需要根据数据窗口中实际的列数和名称进行调整。

PB动态创建数据窗口

PB动态创建数据窗⼝动态创建数据窗⼝在实际应⽤中,经常需要根据⽤户需求来动态创建数据窗,⼀般⽅法是这样的。

在⼀个window中加⼊⼀个数据窗控件,如dw_new,但是该数据窗没有dataobject,(空⽩的)就可以⽤以下语法来创建:dw_new.create(ls_syntax,ls_error)//创建语法,错误信息ls_syntax可以⽤以下三种⽅法来形成:⼀、动态由sql语法创建://连接到pb的example数据库stringls_sql,ls_syntax,ls_errorls_syntax=''selectfromdepartment''ls_syntax=sqlca.SyntaxFromSQL(ls_sql,''style(type=grid)'',ls_error)iflen(ls_error)>0thenmessagebox(''Error'',''SyntaxFromSQLError:~r''+ls_error)elsedw_new.create(ls_syntax,ls_error)iflen(ls_error)>0thenMessageBox("Error","Createhavetheseerrors:~r"+ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endifendif⼆、由另⼀个数据窗的syntax来创建stringls_syntax,ls_errorls_syntax=dw_test.describe(''datawindow.syntax'')dw_new.create(ls_syntax,ls_error)ifls_error''''thenmessagebox(''CreateError'',ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endif三、读取psr⽂件来创建stringls_syntax,ls_error,ls_retls_ret=char(13)+char(10)//回车键intli_fileNumlongli_lengthli_FileNum=FileOpen("efef.psr",Streammode!,read!,shared!,Replace!)ifli_filenum>0thenFileSeek(li_FileNum,158,FromBeginning!)li_length=fileRead(li_filenum,ls_syntax)endiffileclose(li_filenum)ifli_length=0thenreturnls_syntax="release5;"+ls_ret+ls_syntax//截掉ls_syntax中的数据部分,5.0以"sparse(names="dept_name?)"作为参考位置//6.0以html(作为参考位置longpos1,pos2pos1=pos(ls_syntax,''sparse(names="'',1)pos2=pos(ls_syntax,''"'',pos1+16)ls_syntax=left(ls_syntax,pos1)+mid(ls_syntax,pos1+1,pos2-pos1+1)dw_New.create(ls_syntax,ls_error)ifls_error''''thenmessagebox(''CreateError'',ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endif//pb6,pb7的代码可以参照pb5⾃⼰写,只是⽂件头和数据窗结束标记不同⽽已。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PB DataWindow 38个技巧 1 使DataWindow列只能追加不能修改 如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下: 将每一列的 Protect 属性设置为: If( IsRowNew(), 0, 1) ) 在 PowerScript 中可以动态修改 Protect 属性: dw_1.Modify("column_name_here.Protect='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的灰色长带), 单击鼠标右键, 选择 Properties... 菜单项. 7) 选中Autosize Height多选框. 8) 单击OK按钮, 保存所做的修改. 9) 保存此DataWindow. 注意: 连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不 会自动进行折行.

3 在数据窗口中实现动画 要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在Timer Interval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。比如要改变某字段的背景颜色,可设 ackgound.color=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 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)

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

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,改变它的属性,在Expressions Tab上,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_1.Object.address.Visible = 0 dw_1.Object.address.Visible = False dw_1.Object.address.Visible = 'No' PowerBuilder在处理上以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。 为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用

相关文档
最新文档