PB中数据窗口的精确页面打印技术

PB中数据窗口的精确页面打印技术
PB中数据窗口的精确页面打印技术

窗口的精确页面打印技术

 1.引言

自PowerBuild4.0问世以来,以其简洁高效的集成开发环境、强大的数据窗口技术、(几乎)无所不能的数据库访问能力,越来越受到编程人员的 青睐。据Sybase自己的统计,目前全球YOU60万程序员和系统分析人员在使用他们的Powerbuilder 和S-designer,进行各种类型的应 用程序开发。最新发布的PowerBuilder6.0族系列开发工具,直接支持ActiveX技术、ServerPush技术,对分布式计算模型的定义 更加明确,实现更为简便,并可以利用数据窗口直接生成HTML格式文件,等等。所以,PowerBuilder 已成为C/S模式应用和基于InterNet 模式应用的主要开发工具之 一。

数据窗口(DataWindow)是PowerBuilder的专利,也是PowerBuilder应用程序的核心和精华所在.PowerBuilder 通过丰富的属性和函数来控制数据窗口的显示和数据操纵,但对数据窗口的打印支持似乎过于简单,只YOU一个Print() 窗口函数和一个PrintDataWindowPowerScript函数,并且这两个函数的功能几乎都是一样,都只简单地将选定数据窗口原样送入打印队 列,本身 不具备页面控制功能。为此很多程序员抱怨这是PowerBuilder的一个缺陷,其实,PowerBuilder对打印功能的支持一样十分周到全面,只 不过应用场合不同,需要用户自行加以选择。

以下是对PowerBuilder打印控制功能的详尽分析,并介绍一个实用的数据窗口页面控制程序。

2.Powerbuilder实现动态页面控制的途径

PowerBuilder数据窗口YOU一对函数Describe 和Modify,用于动态描述和修改数据窗口结构,与其它相关函数结合可以完成动态生成数据窗口、任意改变数据窗口显示方式、修改打印属性等。这两个函数是控制与修改数据窗口的核心函数,其使用方法如下:

1)Describe获取数据窗口特定属性值

语法:dwcontrol.Describe(propertylist)

参数:dwcontrol数据窗口(或datastore)控 件名。

propertylist用字符串表示的数据窗口属性。

返回值:返回一个表示属性的字符串。

数据窗口属性值也可以用

dwcontrol.object.Datawindow.property来完成直接取得。

2)Modify修改数据窗口特定属性

语法:dwcontrol.Modify(modstring)

参数:dwcontroldwcontrol数据窗口(或datastore)控件名。

modstring用字符串表示的数据窗口属性。

返回值:如果函数执行成功返回“1”。

与Describe类似, 修改数据窗口属性可以用:

dwcontrol.object.Datawindow.property=value直 接赋值。

3)与打印YOU关的数据窗口属性

数据窗口属性中与打印YOU关的YOU24个,其中实现打印页面控制的几个属性是:

Copies:打印份数。

Filename:如果不为空,表示输出到文件的文件名。

Orientation:打印方向1=横向,2=纵 向

Page.Range:输出页范围,要打印1,2,和5到10 页,输入: "1,2,5-10"。Page.RangeInclude:本 次打印范围,0=全部,1= 偶数页,2= 奇数页。Paper.Size:纸张大小。

Scale:打印比例。

程序中利用Modify函数设置好这些属性后,即可实现动态修改数据窗口的目的,再调用datawindow.print()函数,完成最后的打印输出。

一个通用Datawindow打印控制程序

将数据窗口中的报表在打印机上输出是PowerBuilder应

用程序开发过程中必不可少的功能,作为例子,这里提供一个使用上述方法研制的通用打印控 制窗口,用以替代Prompt属性所提供的Print窗口,实现汉化界面,并且可被自行修改扩充。为了书写简单,程序中采用直接赋值的方式修改属性。 实例变量:

datawindowdw_print

stringprintername,name,port

窗口open 事件脚 本:

dw_print=Message.PowerObjectParm

printername=dw_print.Object.Datawindow.Printer

name=left(printername,pos(printername,"on")-1)

port=right(printername,len(printername)-

pos(printername,"on")-1)

plb_printername.additem(name,1)

st_portname.text=port

“设置” 按钮clicked事件脚本

Integercode

Code=printSetup()

Ifcode=1then

printername=dw_print.Object.Datawindow.Printer

name=left(printername,pos(printername,"on")-1)

port=right(printername,len(printername)-

pos(printername,"on")-1)

plb_printername.additem(name,1)

st_portname.text=port

endif

打印范围组中“全部”选择钮clicked事件 脚本

dw_print.object.DataWindow.Print.Range=''

sle_1.enabled=false

sle_2.enabled=false

sle_3.enabled=false

“页数” 栏后sle_2单行文本编辑框Modified事件 脚本

dw_print.object.DataWindow.Print.Page.Range=sle_1.text +"-"+sle_2.text

“自定 义”栏后sle_3单行文 本编辑 框Modified事件脚本

dw_print.object.DataWindow.Print.Page.Range=sle_3.text

打印份数组中份数单行文本编辑框Modified事件脚本

dw_print.Object.DataWindow.Print.Copies=integer(this.text) “全部” 选择钮Cliecked事件 脚本

dw_print.Object.DataWindow.Print.Page.Rangeinclude

=0

“奇数” 选择钮Cliecked事件 脚本

dw_print.Object.DataWindow.Print.Page.Rangeinclude

=1

“偶数” 选择钮Cliecked事件 脚本

dw_print.Object.DataWindow.Print.Page.Rangeinclude

=2

“确认” 命令按 钮Clicked事件脚本

longjob

ifIsValid(dw_print)then

job=PrintOpen()

PrintDataWindow(job,dw_print)

PrintClose(job)

close(parent)

endif

“取消” 命令按 钮Clicked事件脚本

close(parent)

窗口调用方法:在其它带YOU数据窗口的窗口中,使用OpenWithParm(w_print_set,dwname) 即可,其中w_print_set

为本窗口名,dwname为要打印的数据窗口。该程序是一个通用

打印控制程序,可在任何版本的PowerBuilder 应用中使用。打印问题

/PB中如何使用带孔打印纸

操作系统:win98

编程工具:pb70

问题:在pb中,数据窗口打印时,常常需要用带孔打印纸,我的办法是,在数据窗口的打印属性中选择

“default(0)”,然后在打印机属性中,设置自定义纸张(3800×2800),这才可能打印。在使用中,如果YOU

窄行、宽行多种自定义纸张,就需要在多者之间选来选出,实在是麻烦。请问能否用命令去设置自定义

纸张,而又不用去设置打印机属性,我现在一个项目只YOU这个问题,其他已经完成,很急用,在这里我

万分感谢,!请帮帮我吧!!!请赐教?

水平: 中级

回答:

s_w_y的意见:

数据对象窗口YOU此属性:dw_control.Object.DataWindow.Print.Paper.Size 可以通过设置此属性来实现

自定义打印纸张大小。

ZWD的意见:

我YOU一个很笨的办法不知是否可行。在打印机列表中增加一个打印机的多个驱动,分别设置各种自定义纸

的大小,在打印时只要选择打印机就可以了。

彭定友的意见:

请查看Datawindow相关的打印属性:

dw_1.object.datawindow.print.property

如:dw_1.object.datawindow.print.copies=10 打印10份

dw_1.object.datawindow.print.Orientation=1 横向打印

dw_1.object.datawindow.print.Range='1,3-8,10' 打印1,3,4,5,6,7,

8,10页

dw_1.object.datawindow.print.paper.Size=x (0-33分别表示纸张大小)

dw_1.object.datawindow.print.preview=true 打印预览

dw_1.object.datawindow.print.Zoom=80% 缩小预览打印

dw_1.object.datawindow.print.Scale=2 改变实际打印比例

dw_1.object.datawindow.print.margin.top=50 改变打印至顶端距离。。。。。。。。。。。。。

//PB如何控制打印指定某页或某几页

操作系统:Windows 98 oem

编程工具:PowerBuilder 6.0

问题:在PB开发应用软件中,能否像WORD打印那样控制打印指定某页,或某几页范围(因为打印机问题

等而打坏了某页,需要这样做)。在PFC中YOU这似YOU这样的对话框,但不知道怎样用。而且是之前我开发

的PB程序中YOU的窗体名字与PFC库中的一样(若要改涉及许多问题),又怎样引用PFC库中的函数等。

不胜感激

回答: dw_1.object.datawindow.print.page.range='1,3,5-10,15'

//使用PRINTTEXT函数打印,如何设置打印字符的宽度

操作系统:windows、nt

编程工具:powerbuilder

问题:在使用PB中的PRINTTEXT函数打印,如何设置打印字符的宽度?

水平: 中级

回答: 用PrintDefineFont()设置。

//PB在一些已YOU格式和文字的表单上打印

编程工具: powerbuilder

操作系统: windows98

初接触PB,想用它为朋友编一个表单的打印程序,即在一些已打印好格式和文字的表单上,打印相应

数据。不知用PB好实现不,及如何实现?谢谢。

回答: 可以实现,用两个数据窗口(DataWindow),一个数据窗口用作数据输入,第二个数据窗口用作

打印数据,第二个数据窗口在设置数据窗口各控件位置时要根据已经打印的表单位置放置,打印样张再

重新设置,要多试几次。当第一个数据窗口输入完数据后,把数据复制

到第二个数据窗口,然后用

print()函数打印第二个数据窗口。

sulo_xxr的意见:

利用printtext()、printsetspacing()、print()三个可以实现。建议你先弄清楚它们的用法之后可以

方便实现。

//如何打印条形码

操作系统:win98

编程工具:PB6.5

问题:请教老师:如何在PB中打印条形码,条形码打印机如何驱动。拜托!

回答:

如果安装了Office2000,则在其Program FilesMicrosoft OfficeOfficeMsbcode9.ocx 及 Msbcode9.hlp

条形码控件。

李海注:如果在目录中找不到该控件,说明安装的时候没YOU选择。可以再运行安装程序,并在Access

2000下找到Barcode控件项。安装后在Visual Basic等软件中显示为Microsoft Barcode Control 9.0。

Office97没YOU该控件,但Office XP中包括了这个控件,仍然为Msbcode9.ocx。

在PB7中,Insert -> Control ->OLE...

出现Insert Object对话框选择Insert Control页单击Register New 指定..officeMsbcode9.ocx 路径

(或run: regsvr32 c:office2kofficeMsbcode9.ocx) (好象不重新注册不能在VB & PB... 中使)

代码:

long Job

Job = PrintOpen( )

Ole_1.border=false

ole_1.Print(Job, 500,1000)

PrintClose(Job)

Ole_1.border=true

二PB打印机选择列表的分析与实现

---- Word的打印对话框中提供了一个选择打印机的下拉列表,但是我们在PowerBuilder编程中常用的是PrintSetup函数打开的Printer Setup设置窗口,在该窗口中,我们可以在列表框中选择我们所要的打印机。然而很遗憾的是这个Printer Setup窗口是英文界面。对于我们开发的纯中文界面的应用程序,其中却YOU着这样一个很重要的然而却是英文界面的窗口,我想,大多数程序员都是不能容忍的。PowerBuilder的打印控制是最难控制的,在网上见到的许多疑难问题大都与打印YOU关,但无论如何,我们的中文应用程序还是应该向用户提供这样一个中文的打印机选择窗口。

---- 做一个类Word的打印对话窗口并不复杂,PowerBuilder的example程序中YOU完整的做好的窗体,PFC中也YOU类似的内容。将上面的英文文本及提示改为中文就行了。但该打印窗口没YOU提供象word一样的打印机选择下拉列表框。我们必须自己做一个。

---- 通过对Windows 9X系统进行分析,我们能够知道Windows的打印机的信息一般存放在注册表及Win.ini文件中。这些信息分别位于系统注册表的HKEY_CURRENT_CONFIG\System\CurrentControlSet\

Control\Print\Printers下及win.ini的[windows]及[Devices]段下。在注册表中每一个打印机在上面的目录下均YOU一个以打印机为名的主键条目,Win.ini的[Devices]也一样。在注册表上述目录下,YOUdefault字符串值指示当前的默认打印机;win.ini中的[windows]中device的值对也一样对应了当前的打印机。笔者通过下面几个简单的试验,判别出起决定作用的是win.ini 文件而非注册表信息。

---- 试验一:将注册表中上述目录的default的打印机值对改变为其它打印机,再运行printsetup函数,发现没YOU产生任何反应。而将win.ini

文件中的[windows]下的devices的值对改变一下(哪怕胡乱输入几字符),再运行printsetup,打印机选择列表中立即体现出了相应的变化。

---- 试验二:在注册表上述目录下添加一个主键,运行printsetup,没YOU发现打印机列表框中增加打印机,而在win.ini文件的[Devices]下随便增加一个,则printer setup窗口中立即增加了所输入的打印机。

---- 因此,应从win.ini文件入手编制打印机选择下拉列表框。

---- 可是,PowerBuilder提供了RegistryKeys能从注册表中某一主键下子所YOU主键条目的列表,却没YOU提供任何函数从ini文件中取相似的信息。当然,我们可以自己编一个,将win.ini文件内容一行一行地读入某字符串,使之与“[Device]”进行匹配判断,若是再继续向下读至某一行头一个字符为“[”的行并经过复杂的字符串处理以取得打印机列表(注:纯PB开发下)。但我们知道,windows增加打印机YOU专门的程序,而且,该程序会自动地同时在注册表及win.ini文件中同时增加打印机。因此我们可以这样入手:从注册表中取得打印机的列表信息,而从win.ini文件中取得及设置当前打印机信息。这样一来,问题就简单得多了。

---- 经过以上分析论证,下面就开始做了。根据一般做法,我们会将该列表框封装成一个标谁的用户对象,以后开发时,只需在某窗体中调用这一用户对象就行了。

---- 步骤一:新建一可视(visual)的标准(standard)的用户对象,在Select Visual Standard Type对话框中选择DropDownListBox(下拉列表框),点击“OK”按钮进入设计画面。

---- 步骤二:开始编程。

---- 1、定义两个实例变量

string is_windows_dirctory,is_winini_file

声明一API函数用以取windows目录

FUNCTION ulong GetWindowsDirectoryA(ref

string wdir, ulong buf) LIBRARY "kernel32.dll"

---- 2、定义两个函数:

函数一:ouf_get_windows_dirctory()

用途:取windows目录。

参数:无。

返回值类型:string。

函数体:

string ls_WindowsDirctory

ulong lu_Buf

lu_Buf = 144

ls_WindowsDirctory = Space(144) GetWindowsDirectoryA(ls_WindowsDirctory,lu_Buf) return ls_WindowsDirctory

函数二:ouf_get_printer()

用途:取打印机信息并增加至下拉列表框。

参数:无

返回类型:boolean

函数体:

string ls_printer[] //定义一个字符串型数组

integer li_rtn,li_ArrayUp,li_step

li_rtn = RegistryKeys("HKEY_LOCAL_MACHINE\System \CurrentControlSet\Control\Print\

Printers", ls_printer) //从注册表中取其列表

IF li_rtn = 1 THEN

li_ArrayUp = UpperBound(ls_printer)

//取列表数组上限

IF li_ArrayUp >= 1 THEN

FOR li_step = 1 TO li_ArrayUp

additem ( ls_Printer[li_step] )

//向下拉列表框中增加打印机

NEXT

ELSE

return false

END IF

ELSE

return false

END IF

return true

3、在constructor事件下编写下列代码:

boolean lb_PrinterExists

string ls_printer,ls_tmp

int li_point

is_windows_dirctory = ouf_get_windows_dirctory ( )

is_winini_file = is_windows_dirctory + "\win.ini"

lb_PrinterExists = ouf_get_printer ( )

//向下拉列中增加打印机

IF NOT lb_PrinterExists THEN

messagebox ("提示!","尚未安装打印机!")

ELSE

ls_tmp = profilestring (is_winini_file, "windows","device","") //取当前打印机信息

//由于win.ini信息中该信息还包括YOU其它参数如端口,因此必须进行截取处理。

ls_tmp = trim (ls_tmp)

li_point = pos (ls_tmp,",",1)

ls_printer = left (ls_tmp,li_point - 1)

IF trim (ls_printer) <> "" AND NOT

IsNull (ls_printer) THEN

this.text = trim (ls_printer)

//设置下拉列表框文本为当前打印机

ELSE

selectitem ( 1 )

END IF

END IF

---- 4、在selectionchanged事件中输入:

string ls_printer

ls_printer = profilestring

(is_winini_file,"Devices",

trim(this.text (index)),"") //从win.ini文件中取当

前打印机完整信息(含端口及其它)

//在win.ini文件及注册表中更新当前打印机setprofilestring (is_winini_file,"windows","device",

trim(this.text (index)) + "," +ls_printer)

RegistrySet( "HKEY_CURRENT_CONFIG\System

\CurrentControlSet\Control\Print\Printers",

"Default", trim(this.text))

---- 5、最后保存该用户对象(如保存为nvo_ddlb_of_printer)即可。 <

pb数据窗口常用代码

一、连接数据库 连接数据库也就是指定事务对象。PowerBuilder提供了两个函数:SetTrans()和SetTransObject()。 语法格式: dw_control.SetTrans(TransactionObject) dw_control.SetTransObject(TransactionObject) 其中,dw_control是所使用的数据窗口控件,transactionObject是所要指定的事务对象。 这两个函数有一个重要的区别就是在使用SetTrans()函数时,用户不需做任何数据初始化或事务对象初始化工作。用户只需要在这里填充一个事务对象,PB 就会自动完成对该事物对象的初始化以及和数据库连接的工作。而使用SetTransObject()函数时,用户必须首先把所用的事务对象连接到数据库上。但是,这并不意味着SetTrans()函数比SetTransObject()函数更好,使用SetTrans()函数时,每调用一次函数必须连接一次数据库,因为这个函数在每个事务处理的末端都会执行Disconnect语句。与此相反,使用SetTransObject()函数可以为数据库维持一个开放性的连接。因此在一般情况下,为了提高效率,总是采用SetTransObject()函数。 这两个函数都是成功时返回1,发生错误时返回-1。 二、检索数据 用于检索数据的函数只有一个,就是Retrieve()函数。 语法格式: dw_control.Retrieve() 如果数据窗口控件上的数据窗口对象是有检索参数的,就要在这个函数调用时加上检索参数。而且检索参数必须和数据窗口对象中定义顺序一致。 此函数返回一个长整型的数据,代表检索出来的数据行数。如果发生错误,将返回-1。 三、更新数据 当用户对数据窗口对象内的数据修改后,想把这些修改反映到数据库中去时,必须使用Update()函数。 语法格式: dw_control.Update() 这个更新可能成功,也可能失败。一般在这个函数被调用之后,总是要做一个检查。请看下面的例子: Int li_return

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是缺省类型。err是用来保存函数执行时出错信息的string类型的变量。 *关于函数SyntaxFromSQL的参数presentation可以有更复杂的语法。其格式是:"Style ( Type=value property=value ... ) DataWindow ( property=value ... ) Column ( property=value ... ) Group groupby_colnum1 Fby_colnum2 ... property ... ) Text property=value ... ) Title ( 'titlestring' )" 使用这样的格式,可以详细定义要创建的数据窗口对象的外观。 〓在很多情况下都需要一个数据窗口控件和不同的数据窗口对象关联。可以通过修改数据窗口控件的dataobject属性来实现。在修改了这一特性之后,数据窗口控件就不再具有与它相关的事务处理对象了,应该再重新为数据窗口设置事务

PB中下拉数据窗口带参数应用

PB中下拉数据窗口带参数应用 在数据输入时,当用到下拉列表时,会发现有些数据是和别的数据相关的,这时我们会希望过滤掉那些不相关的数据。例如生成一个入库单,某种物料有多个供应商,我们要根据物料来过滤掉和这个物料不相关的供应商,这样会加快检索和输入的速度。 入库单表:billrec

1.以supply表,制作一个带参数的数据窗口,命名为d_supply_replace_list,参数列为item_id,字符型,隐藏物料代码列。 2.以billrec表,制作一个数据窗口,命名为billrec_maintain,将supply_id列的edit属性中的style type选定为DropDownDW,datawindow为d_supply_replace_list。 在窗口中放置数据窗口控件dw_1,将其与billrec_maintain数据窗口关联。 在窗口中定义实例变量datawindowchild idwc_child。 3.在dw_1的constructor事件中编写以下脚本: this.getchild("supply_id",idwc_child) //生成子数据窗口,supply_id为下拉列表列idwc_child.insertrow(0) idwc_child.settransobject(SQLCA) this.of_settransobject(SQLCA) this.insertrow(0) 4.在dw_1的itemchanged事件中编写以下脚本: long ll_getcolumn ll_getcolumn = this.getcolumn() //获得当前列 choose case ll_getcolumn case 7 //假设item_id列是第7列 dw_1.accepttext() is_id = dw_1.getitemstring(row,7) //获得物料代码 idwc_child.retrieve(is_id) //检索替代供应商 end choose 这样在输入不同的物料时,会像下图那样,只列出相关的供应商。

PB 数据窗口高级( DataWindow)应用37个技巧

PB 数据窗口高级( DataWindow) 37个技巧 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,In teger(Right(string(now(),'hhmmssf'),1))*256/10,0) 当然,您不仅可以改变背景颜色,而且可以改变字体等等任何属

PB数据窗口使用绝对技巧与方法

原文地址:PB数据窗口绝对技巧作者:千人急 1、如何让存储文件目录的列,显示图片? 答:选择对应的column的display as picture属性为true 2、如何复制grid类型的所选择的行的数据到系统剪切板? 答:string ls_selected ls_selected=dw_1.Object.DataWindow.Selected.Data clipbord(ls_selected) 4、如何设置的DW底色? 在DW的editsource中改变color的值 5、如何将Grid风格改成自由格式? 在DW的editsource中将processing=1的1改为0 6、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B 风格? 复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可 7、如何实现gird风格的datawindow的多栏表头? 答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下: x="100~t integer(describe('firstcol.x')" width="100~tinteger(describe('lastcol.x')) - integer(describe('firstcol.x')) +integer(describe('lastcol.width')) 8、如何过滤dddw编辑风格的显示值为指定值的记录? 答: dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your +"'") dw_1.filter() 9、如何设置datawindow的某一列为空?

PB数据窗口绝对技巧

PB数据窗口绝对技巧 1、如何让存储文件目录的列,显示图片? 选择对应的column的display as picture属性为true。 2、如何复制grid类型的所选择的行的数据到系统剪切板? string ls_selected ls_selected=dw_1.Object.DataWindow.Selected.Data clipbord(ls_selected) 3:如何改变GRID数据窗口列位置(新手常见) 先preview,然后在预览窗口拖动位置即可。 4、如何设置DW的底色? 在DW的editsource中改变color的值。 5、如何将Grid风格改成自由格式? 在DW的editsource中将processing=1的1改为0。 6、要新建一个表A但风格和现有表B风格一样,怎么将A表快速设置成表B风格? 复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可。 7、如何实现gird风格的datawindow的多栏表头? 添加text到header带区,并设置band属性为foreground保存,edit source修改tex t的x和width属性表达式如下: x="100~t integer(describe('firstcol.x')" width="100~tinteger(describe('lastcol.x')) - int eger(describe('firstcol.x')) +integer(describe('lastcol.width')) 8、如何过滤dddw编辑风格的显示值为指定值的记录? dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your+"'") dw_1.filter() 9、如何设置datawindow的某一列为空? string ls_temp[] setnull(ls_temp) dw_1.object.columnname.primary.current=ls_temp 10、如何设置datawindow的单双行不同颜色间隔? 在detail带区的color属性表达式中写上if(mod (getrow(),2)=1 ,rgb(255,0,0),rgb(0,25 5,0)),如果是当前行以第三种颜色表示,表达式如下:if(getrow()=current(), rgb(255,0,0),if(m od(getrow(),2)=1 ,rgb(0,0,255),rgb(0,255,0))) 11、如何获取指定名称的datawindowobject? DWObject ldwo_use,ldwo_abc ldwo_use = dw_1.Object ldwo_abc = ldwo_use._ _get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称 12、如何缩放datawindow的打印大小?

PB]-子数据窗口操作

PB]-子数据窗口操作 PB]-子数据窗口 **通常的子数据窗口也就是下拉数据窗口。子数据窗口也是普通的数据窗口对象,没有什么特殊的地方,它的创建方法、可以使用的控件、编程时可以使用的函数等,都和普通的数据窗口相同。特殊的地方只是因为它放在了父数据窗口中,需要和父窗口进行配合。 **当为数据窗口中某字段指定为下拉数据窗口编辑风格时,必须提供以下三个属性: a)子数据窗口名称。 b)显示字段名称:该字段中的内容显示在父数据窗口的字段上,只是显示。 c)数据字段名称:该字段中的内容要赋给父数据窗口的字段,要保存到数据库中。 分别对应数据窗口画板的Edit属性页中的:Eidt Style、Display Column、Data Column。 *子数据窗口不能再包含子数据窗口;父数据窗口可以对其包含的子数据窗口进行插入、删除、检索和保存等操作。 **获取子数据窗口的引用是进行其他操作的前提,使用函数GetChild来获取指定字段的子数据窗口。该函数的语法如下: dw_1.GetChild(name,dwchildvariable) 其中,dw_1.是数据窗口控件名称;name为字段名称,为string类型;dwchildvariable为datawindowchild 类型变量,该变量在函数正确执行后保存对子数据窗口的引用。该函数正确执行则返回1,否则返回-1。在获取了子数据窗口的引用之后,就可以捡索子数据窗口中的数据了。但是,检索子数据窗口的情况比较多,并且也有多种方法。 **保证子数据窗口中的数据更新 用户使用下拉数据窗口录入数据时,其中的数据并不一定有用户需要的。在某些情况下不允许用户再输入其他值,否则可能造成数据的不一致性,这时就可以不再编写其他的脚本。但在允许用户录入时,就需要把用户录入的数据保存在子数据窗口对应的数据表中,以便以后数据录入时不再重复输入该数据。这时就应该编写脚本保存该数据了。 **检索子数据窗口 在应用中,对子数据窗口的编程不是检索数据,就是更新其中的数据。检索数据时,如果只显示子数据窗口中同父数据窗口中某字段取值对应的数据,这时子数据窗口的定义就应该有检索参数。根据检索和更新数据这两个因素,可以将检索数据的情况划分成以下三种: a)没有条件限制,并且不允许更新。 b)没有条件限制,并且允许更新。 c)有条件限制,不管是否可以更新。

PB的数据窗口操作

★SetTransObject 语法:dwcontrol.SetTransObject ( transaction ) 功能:给数据窗口或者datastore控件dwcontrol设置事务对象transaction,缺省事务对象是SQLCA。返回值:成功设置事务对象则返回1,执行过程中发生了错误则返回-1,有任意参数为Null时返回Null。 ★Retrieve 语法:dwcontrol.Retrieve ( {, argument, argument . . . } ) 功能:使用数据窗口控件的当前事务对象检索数据库中的数据。如果数据窗口控件对应的数据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象的检索变量个数相等,对应的数据类型相兼容。 返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错误则返回-1,如果任意参数为Null则返回Null *该函数的参数和数据窗口对象定义的参数的顺序要相同,类型要兼容。个数不能少于数据窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。 ★DeleteRow 语法:dwcontrol.DeleteRow ( row ) 功能:删除数据窗口dwcontrol中的第row行数据,如果row为0则表示删除当前行的数据。 返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null。 *该函数执行后只是将被删除的数据从数据窗口的主缓存区移放到Deleted缓冲区,在数据库中并没有真正删除数据,当正确执行了Update函数并且使用commit语句提交了事务后,才真正从数据库中删除该数据 ★InsertRow 语法:dwcontrol.InsertRow ( row ) 功能:在数据窗口dwcontrol的第row行前插入一行空白数据。当指定row为0时,表示在当前行之前插入一行空白数据。 返回值:返回插入的数据的行号,如果执行过程中发生错误则返回-1,如果任意参数为Null则返回Null ★Update 语法:dwcontrol.Update ( { accept {, resetflag } } ) 功能:提交数据窗口或者datastore中的数据。如果accept为True,表示在提交数据之前自动执行AccpetText函数,否则不执行该函数,该参数缺省为True;如果resetflag为True,表示数据提交后自动清除修改标识,该参数缺省为True。 返回值:执行成功则返回1,发生错误则返回-1,如果dwcontrol为Null则返回Null ★AcceptText 语法:dwcontrol.AcceptText ( ) 功能:该函数执行时,首先对当前编辑框中的内容进行对应字段的校验规则,能够通过校验规则,则保存在对应字段中,否则显示校验信息提示错误。需要执行该函数的原因是,当在某字段上的编辑框中输入内容而没有移动光标到别的字段上时,其他控件获得焦点,此时编辑框中的内容不能被保存到字段中,所以就应该在数据窗口失去焦点时执行该函数。 返回值:执行成功则返回1,执行过程中发生错误则返回-1,如果dwcontrol为Null则返回Null。 *该函数在数据窗口的ItemChanged事件中不起作用,因为项目改变是发生在接受编辑框中内容之后

pb数据窗口技巧

pb中datawindow常用技巧一 (2009-04-16 17:09:07) 转载▼ 分类:PowerBuilder 标签: 杂谈 pb中datawindow常用技巧一 1、如何让存储文件目录的列,显示图片? 答:选择对应的column的display as picture属性为true 2、如何复制grid类型的所选择的行的数据到系统剪切板? 答:string ls_selected ls_selected=dw_1.Object.DataWindow.Selected.Data clipbord(ls_selected) 4、如何设置的DW底色? 在DW的editsource中改变color的值 5、如何将Grid风格改成自由格式? 在DW的editsource中将processing=1的1改为0 6、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B风格? 复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可 7、如何实现gird风格的datawindow的多栏表头? 答:添加text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下:

x="100~t integer(describe('firstcol.x')" width="100~tinteger(describe('lastcol.x')) - integer(describe('firstcol.x')) +integer(describe('lastcol.width')) 8、如何过滤dddw编辑风格的显示值为指定值的记录? 答:dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your+"'") dw_1.filter() 9、如何设置datawindow的某一列为空? 答:string ls_temp[] setnull(ls_temp) dw_1.object.columnname.primary.current=ls_temp 10、如何设置datawindow的单双行不同颜色间隔? 答:在detail带区的color属性表达式中写上if(mod (getrow(),2)=1 ,rgb(255,0,0),rgb(0,255,0)),如果是当前行以第三种颜色表示,表达式如下:if(getrow()=current(), rgb(255,0,0),if(mod(getrow(),2)=1 ,rgb(0,0,255),rgb(0,255,0))) 11、如何获取指定名称的datawindowobject? 答:DWObject ldwo_use,ldwo_abc ldwo_use = dw_1.Object ldwo_abc = ldwo_use.__get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称12、如何缩放datawindow的打印大小? 答:dw_1.object.datawindow.zoom=150 or dw_1.object.datawindow.zoom=75 13、如何在已过滤后的数据基础上对datawindow进行过滤? 答: dw_1.setfilter(dw_1.describe("datawindow.table.filter")+your_join+your_new_filt er) dw_1.filter()

PB教程第九章 数据窗口与数据库

9.1 简介 在前面的内容当中,我们介绍了有关数据窗口的基本概念、功能和方法,下面我们将把使用数据窗口的一些高级技术介绍给大家。 这一章不需读者自己动手,因为需要用到很多的数据表格,这里没法都提供给读者,所以这一章只需要读者看明白就可以了,对于SCRIPT 中的语句,要是看不懂可以跳过,会在后面的章节中进行进一步的解答。 9.2 数据窗口与数据库 9.2.1 事务对象 我们知道事务对象在POWER BUILDER 当中占有非常重要的地位,POWER BUILDER的应用程序必须通过事务对象来实现与各种数据库的连接,所以在讨论数据窗口和数据库的关系之前,我们首先来介绍有关事物对象的基本内容。 在POWER BUILDER当中,要想对一个数据库进行操作,首先必须建立与这个数据库的连接。在一个POWER BUILDER数据库连接中,事务对象是一个特殊的不可视的对象,其功能就是为POWER BUILDER程序与数据库之间的通信提供一个通信区。事务对象当中定义了POWER BUI LDER用来与数据库进行连接的参数。在访问数据库之前,必须先建立一个事务对象,然后给这个事务对象的属性赋以合适的值,才能通过这个事务对象与数据库连接,完成所需的数据库操作。当一个应用程序开始运行时,POWER BUILDER 会自动创建一个名为SQLCA的默认全局事务对象。SQLCA是“SQL COMMUNICATIONS AREA”SQL通信区的缩写。可以在应用程序中使用这个默认的事务对象,也可以定义自己的事务对象。 POWER BUILDER提供了四条用来进行事务管理的语句 CONNECT:成功的CONNECT语句标志着一个事务的开始。在执行CONNECT语句之前,必须对一个已经存在的事务对象的用以连接DBMS的属性赋以合适的值。 DISCONNECT:这个语句标志着中止一个事务。 COMMIT:执行COMMIT将提交自该事务开始之后当前事务对数据库已做的所有尚未提交的更新操作。并开始一个新的事务。 ROLLBACK:执行ROLLBACK语句之后,当前事务已做的所有更新操作都将被撤消,并开始一个新的事务。 9.2.2 使用事务对象 有两种方法可以为一个数据窗口设置事务对象。 使用SETTRANS函数:SETTRANS函数将一个特定的事务对象拷贝到数据窗口控件的内部事务对象当中。在程序使用该函数的时候,数据窗口控件使用自己内部的事务对象并且根据需要

PB数据窗口基础

PB数据窗口 数据窗口控件-datawindow PB9.0提供了28个属性、35个默认事件、162个函数。注意与数据窗口对象的区分。 【其他】 ■脚本的执行效率 *尽量不要在RetrieveRow事件下编写脚本(包括注释)。 *如果数据窗口的DoubleClicked事件中编写了脚本,那么在数据窗口的C1icked事件中的脚本应该尽量短,否则双击事件中的脚本永远不可能得到执行。一般来说,Cliked中脚本的执行时间和两次击鼠标之间的间隔时间之和,不应该大于操作系统中所设定的鼠标双击时间间隔,否则双击事件永远不可能触发,双击时仅仅是接连两次触发c1icked事件。 *在数据窗口中录入数据时,事件EditChanged是触发频率最高的,每一个按钮都触发该事件;触发频率仅次于该事件的是ItemChanged事件和ItemFocusChanged,只要修改了单元中的内容,每次触发ItemFocusChanged事件都会触发ItemChanged事件。在这些事件下编写过长的脚本会非常影响录入工作的效率。同样,事件RowFocusChanged的触发频率也是相当高的。一般来说是可以避免在这四个事件中编写脚本的。 ■dw o参数使用 数据窗口的某些事件中可以使用一个称为dwo的变量,该变量保存数据窗口中的部分信息,用数据窗口的属性可以读取这些信息dwo.type:读取在dwo中保存的对象类型。对象类型可能有bitmap、button、column、compute、graph、groupbox、line、ole、ellipse、rectangle、roundrectangle、report、tableblob、text、datawindow(当用户没有单击特定对象时) https://www.360docs.net/doc/e79360795.html,:column的列名 dwo.Primary[row]:column的数据 dwo.Selected:选中column的数据 ■数据缓冲区 数据窗口在运行时要创建四个缓冲区,分别是主缓冲区、删除缓冲区、过滤缓冲区和原始缓

PB 数据窗口数据导出到word文件中

PB 数据窗口数据导出到word,excel 博客分类: powerbuilder ExcelJ#Windows PB 数据窗口数据导出到word,excel, excel 可以自定义修改excel文档的列宽对齐方式,字体样式等 // dwsave2word 调用ole global type gf_exportdata2word from function_object end type forward prototypes global subroutine gf_exportdata2word (datawindow ad_datawindow) end prototypes global subroutine gf_exportdata2word (datawindow ad_datawindow);string ls_filepath ls_filepath=gf_getfilesavename() OleObject OleObjectWord OleObjectWord=Create OleObject // 连接word if OleObjectWord.ConnectToNewObject("Word.application") <> 0 then Messagebox("提示","ole连接错误!") return end if OleObjectWord.visible=false //word文档在操作数据过程中是否可见 Long col_colnum,col_rownum Constant Long wdTableBehavior=1 Constant Long wdAutoFitFixed=0 Constant Long wdCell=12 String str_value // 得到数据窗口数据的列数和行数(行数应该是数据行数+1) col_colnum=Long(ad_datawindow.object.datawindow.column.count) col_rownum=ad_datawindow.rowcount() + 1 // 先在word文档中画好表格 SetPointer(HourGlass!) OleObjectWord.Documents.Add

PB数据窗口对象

[PB]-数据窗口对象(一) //////////////////////////////////////// 数据窗口对象的数据源 ---------- PB提供5种数据源:Quick Select(快速选择类型)、SQL Select(SQL选择类型)、Query(查询类型)、External(外部类型)和Stored Procedure(存储过程类型) ---------- Quick Select 只能从一个数据表或者视图中选取数据(无关联的表或者视图)?? ---------- SQL Select 1、选择表 可以一次选择多个表 2、选择字段 Select All //选择所有字段 Select Tables //重新选择表 Convert to Syntax //进入SQL语法状态 Compute //计算字段,右键->Columns //选择字段 右键->Functions //选择函数 3、指定检索条件 Retrieval Arguments //定义检索参数变量的类型和名称 where //检索条件,右键->Columns //选择字段 右键->Functions //选择函数 右键->Arguments //选择参数 右键->Value //选择值 右键->Select //从其他表中选择 ---------- Query PB可以将特定的SQL语句保存为Query对象,不同的Query数据源的数据窗口都可以使用这些已经保存好的SQL语句来提取数据 ---------- External 当和不存在于数据库中的数据打交道或者要利用数据窗口的某些特性但不进行数据处理时,使用此数据源。无SQL语句。 ---------- Stored Procedure 使用已经定义好的存储过程来做数据源 ---------- //////////////////////////////////////// 数据窗口对象的显示样式 ----------

PB子数据窗口

[PB]-子数据窗口 **通常的子数据窗口也就是下拉数据窗口。子数据窗口也是普通的数据窗口对象,没有什么特殊的地方,它的创建方法、可以使用的控件、编程时可以使用的函数等,都和普通的数据窗口相同。特殊的地方只是因为它放在了父数据窗口中,需要和父窗口进行配合。 **当为数据窗口中某字段指定为下拉数据窗口编辑风格时,必须提供以下三个属性: a)子数据窗口名称。 b)显示字段名称:该字段中的内容显示在父数据窗口的字段上,只是显示。 c)数据字段名称:该字段中的内容要赋给父数据窗口的字段,要保存到数据库中。分别对应数据窗口画板的Edit属性页中的:Eidt Style、Display Column、Data Column。 *子数据窗口不能再包含子数据窗口;父数据窗口可以对其包含的子数据窗口进行插入、删除、检索和保存等操作。 **获取子数据窗口的引用是进行其他操作的前提,使用函数GetChild来获取指定字段的子数据窗口。该函数的语法如下: dw_1.GetChild(name,dwchildvariable) 其中,dw_1.是数据窗口控件名称;name为字段名称,为string类型;dwchildvariable为datawindowchild类型变量,该变量在函数正确执行后保存对子数据窗口的引用。该函数正确执行则返回1,否则返回-1。 在获取了子数据窗口的引用之后,就可以捡索子数据窗口中的数据了。但是,检索子数据窗口的情况比较多,并且也有多种方法。 **保证子数据窗口中的数据更新 用户使用下拉数据窗口录入数据时,其中的数据并不一定有用户需要的。在某些情况下不允许用户再输入其他值,否则可能造成数据的不一致性,这时就可以不再编写其他的脚本。但在允许用户录入时,就需要把用户录入的数据保存在子数据窗口对应的数据表中,以便以后数据录入时不再重复输入该数据。这时就应该编写脚本保存该数据了。 **检索子数据窗口 在应用中,对子数据窗口的编程不是检索数据,就是更新其中的数据。检索数据时,如果只显示子数据窗口中同父数据窗口中某字段取值对应的数据,这时子数据窗口的定义就应该有检索参数。根据检索和更新数据这两个因素,可以将检索数据的情况划分成以下三种: a)没有条件限制,并且不允许更新。 b)没有条件限制,并且允许更新。 c)有条件限制,不管是否可以更新。 检索子数据窗口有两个时机,一个是在子数据窗口下拉时,另一个是在父数据窗

PB的数据窗口操作

ls1= dwo.Primary[row] ★SetTransObject 语法:dwcontrol.SetTransObject ( transaction ) 功能:给数据窗口或者datastore控件dwcontrol设置事务对象transaction,缺省事务对象是SQLCA。返回值:成功设置事务对象则返回1,执行过程中发生了错误则返回-1,有任意参数为Null时返回Null。 ★Retrieve 语法:dwcontrol.Retrieve ( {, argument, argument . . . } ) 功能:使用数据窗口控件的当前事务对象检索数据库中的数据。如果数据窗口控件对应的数据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象的检索变量个数相等,对应的数据类型相兼容。 返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错误则返回-1,如果任意参数为Null则返回Null *该函数的参数和数据窗口对象定义的参数的顺序要相同,类型要兼容。个数不能少于数据窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。 ★DeleteRow 语法:dwcontrol.DeleteRow ( row ) 功能:删除数据窗口dwcontrol中的第row行数据,如果row为0则表示删除当前行的数据。 返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null。 *该函数执行后只是将被删除的数据从数据窗口的主缓存区移放到Deleted缓冲区,在数据库中并没有真正删除数据,当正确执行了Update函数并且使用commit语句提交了事务后,才真正从数据库中删除该数据 ★InsertRow 语法:dwcontrol.InsertRow ( row ) 功能:在数据窗口dwcontrol的第row行前插入一行空白数据。当指定row为0时,表示在当前行之前插入一行空白数据。 返回值:返回插入的数据的行号,如果执行过程中发生错误则返回-1,如果任意参数为Null则返回Null ★Update 语法:dwcontrol.Update ( { accept {, resetflag } } ) 功能:提交数据窗口或者datastore中的数据。如果accept为True,表示在提交数据之前自动执行AccpetText函数,否则不执行该函数,该参数缺省为True;如果resetflag为True,表示数据提交后自动清除修改标识,该参数缺省为True。 返回值:执行成功则返回1,发生错误则返回-1,如果dwcontrol为Null则返回Null ★AcceptText 语法:dwcontrol.AcceptText ( ) 功能:该函数执行时,首先对当前编辑框中的内容进行对应字段的校验规则,能够通过校验规则,则保存在对应字段中,否则显示校验信息提示错误。需要执行该函数的原因是,当在某字段上的编辑框中输入内容而没有移动光标到别的字段上时,其他控件获得焦点,此时编辑框中的内容不能被保存到字段中,所以

PB动态创建窗口

动态创建数据窗口 在实际应用中,经常需要根据用户需求来动态创建数据窗,一般方法是这样的。 在一个window中加入一个数据窗控件,如dw_new,但是该数据窗没有data object,(空白的)就可以用以下语法来创建: dw_new.create(ls_syntax,ls_error) // 创建语法,错误信息 ls_syntax可以用以下三种方法来形成: 一、动态由sql语法创建: // 连接到pb的example数据库 string ls_sql,ls_syntax,ls_error ls_syntax = 'select * from department' ls_syntax = sqlca.SyntaxFromSQL(ls_sql,'style(type=grid)',ls_error) if len(ls_error) >0 then messagebox('Error','SyntaxFromSQL Error:~r'+ls_error) else dw_new.create(ls_syntax,ls_error) if len(ls_error) >0 then MessageBox("Error", "Create have these errors: ~r" + ls_error) else dw_new.settransobject(sqlca) dw_new.retrieve() end if end if 二、由另一个数据窗的syntax来创建 string ls_syntax,ls_error ls_syntax = dw_test.describe('datawindow.syntax') dw_new.create(ls_syntax,ls_error) if ls_error '' then messagebox('Create Error',ls_error) else dw_new.settransobject(sqlca) dw_new.retrieve() end if 三、读取psr文件来创建 string ls_syntax,ls_error,ls_ret ls_ret = char(13)+char(10) //回车键 int li_fileNum long li_length li_FileNum = FileOpen("efef.psr",Streammode!, read!, shared!, Replace!) if li_filenum >0 then FileSeek(li_FileNum, 158, FromBeginning!) li_length = fileRead(li_filenum,ls_syntax) end if

pb9中数据窗口saveas的XML特性

pb9中数据窗口的XML特性 2009-07-07 13:10 本文转自:https://www.360docs.net/doc/e79360795.html,/wu_07/archive/2005/12/22/559362.aspx 一、原理 从pb9开始,DataWindow开始支持直接从XML文档中导入数据,将检索到的数据保存为XML文档,以及使用XSL格式对象(XSL-FO) 的新功能。本文根据XML Features in PowerBuilder? 9.0相关内容节选翻译。这是第一部分。 1、数据窗口导出引擎(DataWindow Export Engine) 它是数据窗口新增的组件,主要利用导出模板(Export Templates)作为基础结构来转换行数据到XML格式数据。引擎通过分析模板内容格式化数据,然后输出到XML形式。因为模板本身也是XML文档,所以它首先也需要被解析。导出引擎通过XML解析器(XML Parser)的服务来分析模板文件。在低层,XML解析通过C++和Apache Xerces实现,利用一个适配器接口(pbxerces90.dll)来访问Xerces解析器。 2、导出模板(Export Templates) 一个导出模板定义了数据窗口元素(DataWindow elements)和XML对应关系。 下面的数据窗口对象可以使用在导出模板: ? 列(Column) ? 计算列(Computed Column) ? 文本(Text Control) ? 计算域(Computed Field) ? 内嵌报表(Nested Report) 上面的数据窗口对象可以被映射到以下的XML构造 ? 元素(Element) ? 属性(Attribute) 注意:注释(comments)和处理指令(processing instructions)可以被添加到模板的任意部分,但是不能和其建立映射。CDATA可以被添加到任何元素之内,但是也不能被映射。内嵌报表(Nested Report)只能和元素建立映射,不能是属性。 当导出引擎分析XML模板内容时,根据模板中已经定义的映射关系,将元素映射到实际的数据窗口控件和它们的文本内容。在映射操作成功完成后,引擎将借助

相关主题
相关文档
最新文档