[PB]-数据窗口对象(一)

[PB]-数据窗口对象(一)
[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

使用已经定义好的存储过程来做数据源

----------

////////////////////////////////////////

数据窗口对象的显示样式

----------

数据窗口对象显示样式有11种:Grid、Tabular、Group、Freefrom、Label、N-Up、Crosstab、Graph、Composite、RichText、OLE2.0

----------

Grid:

字段横向排列在detail band中,标签横向排列在header band中,和字段相对应,字段和字段之间有网格线分隔,类似于电子表格。在数据窗口的预览状态下可以调整字段的顺序,并且自动反馈到数据窗口的设计状态中,调整字段顺序时,对应的标签顺序也相应地自动调整。缺省情况下,字段不能随意移动,只能在detail band中做上下移动。这种显示样式的数据窗口布局整齐,但不能灵活地安排字段、标签、表头的布局,所以常用来显示数据或录入数据,而很少用来做报表。Grid显示样式的数据窗口中,表头只能和标签放置在同一个header band中,在放置表头处仍然有网格线。

----------

Tabular:

当刚刚创建这种样式的数据窗口时,字段、标签的布局和Grid显示样式的数据窗口相同,都是横向排列的,但是字段之间没有网格线分隔。字段和标签的布局可以随意调整,在header band中的标签可以随意拖放到detail band中,detail band中的字段也可以拖动到header band中。这种显示格式的数据窗口布局安排非常灵活,开发人员可以根据需要设计字段和标签的布局,然后手工画线制作表格,在制作中国式

报表时经常使用,虽然比较烦琐,但是表格比较美观,比较适合中国式报表的要求,另外,这种格式的数据窗口在数据录入、查询时也经常使用。

----------

Group:

Group分组显示样式的数据窗口可以指定按哪个(或哪些)字段进行分组,可以用指定的分组条件将数据分组显示,并且允许为每组指定一些计算。例如,要显示某公司在各地区的销售数据,可以按地区分组,为每个分组指定统计计算,在地区改变时显示地区的销售总金额。当选择多个字段时,这几个字段共同作为分组的条件,而不是以每个字段都创建一个分组。使用Group类型只能创建一个分组,要创建多个分组必须在DataWindow画板中完成。

----------

Freefrom:

前面讨论的三种显示样式都是一次可以显示多行数据的。对于比较重要的数据,用户可能需要一次只编辑一行这时可以使用Freefrom显示样式的数据窗口。该类型的数据窗口将标签放置在字段的左例,字段和标签放置在同一个detail band中,先从上到下再从左到右依次排列。实际上,这种显示样式的数据窗口布局也很灵活,可以随意安排字段和标签的位置。这种显示样式的数据窗口在卡片式数据的录入和显示方面也经常使用。

----------

Label:

如果用户想要生成邮件标签,可以使用Label显示样式的数据窗口来实现。

----------

N-Up:

这是可以在同一页上显示多列相同字段的一种特殊的显示样式。当要显示的字段比较少或者不同行之间的数据需要做比较时,经常使用这种显示样式。使用向导可以创建N-up显示样式的数据窗口,需要指定的一个重要参数是每行重复显示的字段的次数,也就是Number of rows per detail band,缺省为2。该参数的大小视需要显示的字段总长度和报表使用的打印纸宽度而定。N-up显示样式的数据从左到右显示。另外,当选中行数据时,并不能选中实际上看到的一整行,而是逻辑上的一行。

----------

CrossTab:

当需要做数据统计和分析时,最好使用CrossTab显示样式的数据窗口,虽然报表在显示格式方面不适合中国人的口味,但还没有哪个C/S数据库开发软件将数据统计分析做得如此之好。使用CrossTab显示样式可以创建复杂的分类统计表,不管是表头分类还是行分类。创建CrossTab显示样式的数据窗口时,有几个重要参数需要指定。这些重要参数是行、列和统计值。每个参数可以指定多个字段,也可以使用表达式。当指定多个字段(或表达式)时,字段的顺序决定在表中的分组顺序。比如,统计某销售公司某年各个月份各种产品、不同花色在各个地区的销售情况,可以用月份和地区作为列,用产品名称和花色作为行。在Columns列表框中按Month、Region的顺序加入字段,没有Month可以使用表达式Month(sales_date)来获取销售时的月份。Rows列表框中的字段对应数据窗口中左侧的表头,Columns列表框中的字段对应数据窗口中上面表头,Values是出现在数据窗口表格单元中的统计值;Source Data列表框中是可以使用的字段,使用鼠标选中并拖动到相应的列表框即可。在Rows、Columns、Values三个列表框中都可以用鼠标双击已有字段,可以在接下来的对话框中输入组合表达式。比如,使用year作为Columns是可以的,也可以双击然后在上面的窗口中输入下面的表达式:year+"年"

----------

Graph:

Graph显示样式的数据窗口可以以多种图形样式将数据显示出来,例如饼图、柱状图、折线图等。Graph显示样式的数据窗口给用户的感觉是使用方便、表达直观。从开发者的角度来讲,创建Graph显示样式的数据窗口也是很简单的事情,所以在开发应用程序时不要忘记这费力不多却很受用户欢迎的显示样式。

创建Graph显示样式的数据窗口时,最重要的参数是Category、Values及Series。在创建向导中可以指定这几个参数。指明这三个参数的操作很简单,在下拉列表框中选择合适的字段即可。Category可以理解成显示在横向坐标铀上的字段,Values可以理解成显示在纵向坐标轴上的字段,而Series是横向坐标轴上同组比较时的分组标准。

----------

Composite:

这种显示样式的数据窗口可以将多种类型的、多个逻辑上毫不相关的数据窗口放置到一起,是一种灵活的数据表现形式。因为Composite显示样式的数据窗口不允许修改其中的数据,所以不能用于数据录入和数据修改,只能在报表时使用这种显示祥式的数据窗口。使用这种显示样式的数据窗口创建报表,经常将对同一问题不同表现形式的数据窗口或者是关系紧密的数据放到一起。例如,将几个关键数据的统计结果以Graph显示样式显示在最上面,用CrossTab类型的数据窗口将比较详细的数据统计结果显示在中间,然后是Grid类型的详细数据,这样的报表数据表现能力要比任何单一的一种数据窗口要强得多。

----------

RichText:

RichText祥式的数据窗口使数据库中的数据和文字可以在一起排版,可以方便地特数据库中的数据和文字内容一起形成文档、报告等;提供了很强的文字编辑处理能力,可以很方便地处理文字的多种格式:可以开发更有表现力的应用系统,自动生成报告、文档资料,省去了使用PowerBuilder的应用程序却需要切换到其他文字处理软件中的麻烦。

----------

OLE 2.0:

OLE是Object Link and Embedding的字头缩写,表示对象链接和嵌入。使用这种技术,可以将其他软件的功能引入到PowerBuilder开发的应用程序中。PowerBuilder中不仅提供了OLE 2.0显示样式的数据窗口,而且在窗口中提供了OLE 2.0控件。例如,在数据库中保

存的图像在OLE 2.0显示样式的数据窗口中,可以借助一些专门的图像处理软件来处理,并可以把处理结果返回保存到数据库中。

只有当数据库的表中包含blob类型的字段时,才有必要使用OLE 2.0显示样式的数据窗口。将blob类型的字段作为OLE 2.0列,在处理其中的数据时,可以直接触发调用相关的软件进行处理,并能够将处理结果返回保存到数据库中。例如,某字段中保存的是Excel文档,可以创建OLE 2.0显示样式的数据窗口,当双击该字段时可以调用Excel,然后在Excel

中编辑处理数据,保存编辑结果返回到数据窗口时,可以将结果反映到数据窗口中。

创建OLE 2.0显示样式的数据窗口,需要指定三类参数。Source Data框中显示的是所有可用字段,可以使用鼠标选中并拖动到其他两个列表框中;Group by列表框中显示的是用来分组的字段,由于OLE 2.0数据窗口的特殊性,它的分组不在设计时创建,只能在向导中创建;Target Data框中显示的是在数据窗口中要显示的字段,使用了分组,则对该框中的字段做统计(字符串型的列将统计记录数,数值型的列将统计累加和),没有使用分组,则直接显示它们的值。接下来要设置的是和OLE对象关系紧密的内容

----------

////////////////////////////////////////

数据窗口对象的画板、band和层次

----------

数据窗口画板

整个数据窗口画板由6个视窗构成,分别是:

Design:设计数据窗口对象视窗,可以使用菜单Design-Options来改变Design窗口的外观

Preview:预览数据窗口的外观,显示相应表中的对应的数据,及对数据的各种操作Control List:数据窗口中所有的部件构成的一个列表

Data:显示此数据窗口对象所对应的表中的各个字段的值

Properties:属性

Column Specification:该视窗是个比较重要的视窗,可以增加、删除、修改列的初始值、检验表达式或者校验信息

----------

数据窗口对象的band

数据窗口用带-band将其分隔成四部分:

Header:出现在每页的顶端,用于显示标题和列的题头

Detail:包含了数据窗口对象的主体,显示了各行的数据和相关的标签。在DataWindow对象高度的范围内,细节条能够按照需要自动扩大任意倍

Footer:出现在每页的底端,用来显示文本和页号

Summary:出现在DataWindow对象的最后一页,用来为整个数据窗口对象显示总计和总和----------

数据窗口对象的层次

数据窗口分为三个层次,即背景层(background)、带层(band)和前景层(foreground)。在数据窗口上放置的部件可以属于任意一个层次,但如果设计不当,数据显示会凌乱不堪。通常情况下,背景层放置绘图对象以设置漂亮的背景;带层放置字段、计算域、标签等和报表内容紧密相关的内容,在运行状态下,PowerBuilder会自动格式化带层;前景层放置一些无需打印的内容,最典型的是Graph部件。

设置部件属于哪个层的方法是首先选中部件,然后在属性视窗中进入到Positon属性页,修改该部件的Layer属性,在Layer下拉列表框中选择适当的层即可。

不管哪个层上的对象,鼠标右键弹出菜单中都有Send to Back和Bring to Font两个选项。这两个功能和层之间有什么关系呢?没有任何关系!不管部件属于哪个层,都可以使用这两个菜单项,使用完后部件也不会属于其他的层,只是重叠部件的前后关系发生了变化。所以当部件没有重叠时,使用这两个菜单选项没有什么意义,虽然这两个菜单选项也可以使用。

选中数据窗口上的部件不区分层。也就是说,选中操作不受层的影响,可以同时选中不同层上的部件。当设置了较大的背景图片时,可能不能使用拖动鼠标来直接选中多个对象,因为拖动时,鼠标的起点可能就在背景图片上。解决方法是在所有操作都完成后再放置背景图片,也可首先将背景图片剪切掉,进行其他操作后再粘贴图片,或者先将背景图片拖到没有其他对象的位置上,操作完成后再将图片背景拖放到原来位置

----------

////////////////////////////////////////

数据窗口对象及字段的修改属性

数据窗口只能修改一个数据表。当数据窗口的数据来源于不止一个数据表时,可以用脚本控制数据窗口的修改属性来对数据表逐个进行修改。

当数据窗口是用来接受用户的手工录入数据时,应该设置两方面的属性才能确保数据窗口能够用来修改数据表。一个是修改数据窗口的修改属性,另一个是用户可以修改的字段的相关属性值

----------

数据窗口对象的修改属性

Rows->Update Properties

如果数据窗口对应的数据表中定义了主键或者唯一性索引,则数据窗口创建时默认的就是允许修改,并且正确设置了所有的修改属性。否则就需要手工进行设置。当增加、删除、或者重新选择了字段时,PB将数据窗口的的修改属性为不允许,这时也应该进行手工设置。Allow Updates:允许更新。

Table to Update:指定要被更新的表。

Where Clause for Update/Delete:配置如何在Update和Delete SQL语句中构造where

子句

1、Key Columns 当开发单用户应用程序或者用户都以加锁方式访问数据库时可以选中该选项。该选项表示数据窗口只使用在“Unique Key Column”列表框中指定的唯一列进行数据更新。使用这种方式来修改数据库,并发性很高,不同的用户都可以并发地访问数据库,但是数据的完整性却非常差。因此要保护数据完整性,只有在单用户程序或者加锁访问方式下才使用这种修改方式。如:在add_book(通讯录)数据表中定义了4个字段,id为主键,name,address,telephone三个字段为可修改字段,有如下一条数据(001,陈,杭州,1395813)。若想把name改为“万”,数据窗口产生如下的update语句:update add_book set name = '万' where id = '001'

2、Key and Updateable Columns 这种修改方式是默认的修改方式,它用主键列和可以修改的列来创建where子句,具有很高的数据完整性,但是并发性不是太好。推荐使用这种修改方式。保存数据时将产生如下的SQL语句:update add_book set name = '万' where id = '001' and name = '陈' and address = '杭州' and telephone = '1395813'

3、Key and Modified Columns 该方法是上面两种方法的折中,当不同的用户并发修改同一行数据的不同字段时,都能成功修改,所以它的并发性有了一定的限制,数据的完整性比第一种修改方式有所提高。这种修改方式使用主键和数据发生了变化的列来产生where子句。保存数据时产生如下的SQL语句:update add_book set name = '万' where id = '001' and name = '陈'

Key Modification:该组框用来指定当用户修改了主键时,数据窗口如何来更新数据表中的主键字段。有两种选择Use Delete then Insert和Use Update。第一个选项是先删除原有的主键值,然后再使用新的主键值插入一个完整的行。使用这种更新主键的方式可以减少组织数据的工作量,但在数据库中各个数据表之间存在父子制约关系,并且依赖该主键的外部键被指定为级联删除时,操作就不会成功的。因为级联删除方式要求当依赖主键的外部键有数据时就不能删除主键。当DBMS允许更新主键列时,可以使用第二个选项,该选项直接修改主键值,所以防止了级联删除带来的操作不成功的问题。

Updateable Columns:指定被更新的字段。当数据窗口中的字段来自不止一个数据表时,这时一定要选择同一个表中的字段,因为一个数据窗口一次只能更新一个数据表,当数据窗口中增添了字段时,新增添的字段往往是不允许修改的,一定要在该列表框中选择该字段。Unique Key Column:选择唯一标识一行的列。如果在定义数据表时定义了主键,单击右面的“Primary Key”按钮可以在该列表框中选中主键。

Identity Column:该下拉列表框用于为下拉列表框中所指定的列(通常是主键列)生成序号,当且仅当DBMS支持序号生成时该作用才有效

----------

数据窗口对象字段的修改属性

**相关属性

数据窗口中字段的相关属性:

1、字段的Tab Order值

2、字段的Protect属性

3、字段的DisplayOnly属性

4、字段的Visible属性

上述属性前3个中任意一个都可以让用户无法修改字段中的数据:最后一个属性决定字段是否可见,不可见的字段不管其他属性如何设置.用户都无法修改字段中的数据。

当字段的Tab Order值为0时,肯定不能获得焦点,但是非0时也不一定能获得焦点,还得看字段的Protect属性是否设置为1;当字段的Tab Order值不为0,Protect属性不为1并且字段的Visible属性为True时,肯定可以获得焦点。DisplayOnly属性和焦点是否能够获得无关(即选中Displayonly时可以选中字段,可以复制,但不能更新)。

**数据保护

可以用以下三种方法将字段设置为用户不可修改的字段:

(1)在数据窗口设计时将这些字段的TabOrder值置为0,以使该字段不能获得焦点,用户无法选中和编辑该字段。

(2)将字段的DisplayOnly属性设置为True。该字段可以获得焦点,可以选中该字段,还可以拷贝复制该字段的内容,但不能编辑该字段中的内容。

(3)设置字段的Protect属性。字段的Protect属性如果设置为“1”,则该字段的TabOrder值即使不是0也不会得到焦点。使用该属性可以保护一些重要的数据。

----------

////////////////////////////////////////

数据窗口对象的字段操作

----------

字段的编辑类型

PB提供了六种编辑类型:

1)Edit是字段的缺省编辑类型,可以用于所有类型的字段上。

2)CheckBox编辑类型在这里是一种状态选择,可以为其规定选中和非选中状态时的文字,当字段的输入内容非此即彼时,可以使用这种编辑类型。

3)DropDownDW是一种用来限制用户输入数据的非常好的编辑方式,用户只能通过选择录入数据,并且选择的数据来自其他数据窗口的某字段,从而可以确保数据的一致性和正确性。当录入外部键时,经常使用这种编辑类型。使用这种方式可以增强程序的适应性和灵活性。

4)DropDownListBox在外观上和DropDownDW类型相同,但它的数据不会发生变化,是固定的,适合用来录入诸如学历、省份、月份等范围固定的数据项。

5)EditMask经常用来录入整型或日期型数据。它底优势在于可以给用户提供清晰的数据格式,对用户的操作有很强的提示性;还可以为该编辑类型设置Spin,以便用鼠标单击上下箭头来增大或减小数据。

6)Radio Buttons在录入取值为比较小范围内的数据经常使用,用户使用鼠标进行选择操作即可录入数据,操作比较方便。

----------

字段的编辑格式

1、Limit - 限制输入长度

可以规定在该字段中输入的信息长度,缺省是字段在数据表中定义的长度。如果在数据窗口创建以后又添加了字段,这时缺省长度是0,这时用户所能输入的长度取决于编辑框的长度(如果没有设置字段的AutoHorz Scroll属性或者设置了该属性并且Limit属性为0,则用户输入的最大长度取决于编辑框所能接受的最大长度),应该手工修改其限制长度为字段在表中定义的长度。修改方法是,在字段属性窗口的Edit页Limited输入框中输入一个整数即可

2、Display Only - 不允许用户修改

选中字段对应属性窗口中的Display Only选项即可。在程序运行时,该字段中的内容可以显示,并且可以获得焦点,但是用户不能修改字段的内容,从而起到保护数据的作用。建议使用这种方式来保护字段中的数据,虽然不能编辑字段内容,但可以选中并复制,比设置字段的Tab Order值有更多的灵活性

3、Required - 必须输入

有些信息要求用户必须输入,这时可以选中字段的Required属性。不输入数据就无法离开该字段。

4、Password - 密码输入

选中字段属性窗口中Edit页上的Password属性即可,字段上数据显示为“*”号

5、Format - 格式

属性视图中Edit属性页中包含Format属性,并且还有一个专门的Format属性页。Edit属性页的Format属性可以设置字段编辑时的显示格式,Format属性页中的Format设置字段不被编辑时的显示格式。

Format的设置:

Numbers:可以使用“0”、“#”、“.”和一些算术符号来表示,使用保留字“[general]”或者“[Currency]”时,PB将使用操作系统的设置格式。关于操作系统的格式,Windows可以在控制面板的区域设置中修改。

[General] 5 -5 0.5

0 5 -5 1

0.00 5.00 -5.00 0.50

#,##0 5 -5 1

#,##0.00 5.00 -5.00 0.50

$#,##0;($#,##0) $5 ($5) $1

$#,##0;-$#,##0 $5 -$5 $1

$#,##0;[RED]($#,##0) $5 ($5) $1

$#,##0.00;($#,##0.00) $5.00 ($5.00) $0.50

$#,##0.00;[RED]($#,##0.00)$5.00 ($5.00) $0.50

0% 500% -500% 50%

0.00% 500.00% -500.00% 50.00%

0.00E+00 5.00E+00 -5.00E+00 5.00E-01

Strings:可以用两部分来表示该类型数据的显示,前面是必需部分,后面是NULL时表示。“@”代表一个字符。如:"[red](@@@)@@@-@@@@"

Dates:使用几个特定的字母代表特定的含义,它们的组合构成Data类型的格式。

d 表示天的数字,没有前缀0 9

dd 表示天的数字,有前缀0 09

ddd 星期几的英文缩写Mon

dddd 星期几的英文全称Monday

m 没有前缀0的月份 6

mm 有前缀0的月份06

mmm 月份的英文缩写Jun

mmmm 月份的英文全称June

yy 两位数字表示的年份97

yyyy 四位数字表示的年份1997

两位的年份如果小于50,PB则认为是21世纪;大于50则认为是20世纪。比如,“85”表示的年份PB认为是“1985”年;“40”表示的年份PB认为是“2040”。

Times:使用几个特定的字母代表特定的含义,它们的组合构成Time类型的格式。

h 没有前缀0的表示小时的数字

hh 有前缀0的表示小时的数字

m 没有前缀0的表示分钟的数字,必须出现在h或者hh之后

mm 有前缀0的表示分钟的数字,必须出现在h或者hh之后

s 没有前缀0的表示秒的数字,必须出现在m或者mm之后

ss 有前缀0的表示秒的数字,必须出现在m或者mm之后

ffffff 没有0前缀的毫秒,必须出现在s或者ss之后

AM/PM 两个大写的缩写字母,代表上午和下午

am/pm 两个小写的缩写字母,代表上午和下午

A/P 一个大写的缩写字母,代表上午和下午

a/p 一个小写的缩写字母,代表上午和下午

6、Auto Selection - 自动选中

当字段获得焦点时,自动选中当前行字段中的内容,这在需要删除或者拷贝时用处比较大。选中字段对应属性窗口中Edit页上的auto selection即可。

7、设置滚动条

Auto Horz Scroll--自动横向滚动

Auto Vert Scroll--自动纵向滚动

Horz Scroll Bar --横向滚动条

Vert Scroll Bar --纵向滚动条

8、Use Code Table - 使用Code Table

使用Code Table可以自动转换用户的输入信息,也可以校验用户的输入信息是否正确。

a)选中字段的Use Code Table属性

b)在Code Table中定义代码表,该输入框中包括两列,Display Value用来进行显示,Data Value是和该显示值对应的实际值,是保存在数据库中的值。

c)选中Validate选项,从而可以确保用户的输入必须是代码表中定义了的,否则就出现报错信息。

9、Show Focus Rectangle - 显示焦点边框

焦点边框就是当字段获得焦点时,在字段编辑框的周围显示一个矩形边框,可以醒目地提醒用户当前的输入位置,这是一个比较好的界面,建议使用该属性。选中字段对应届性窗口Edit页中的Show Focus Rectangle即可。Tabular默认选中

10、Accelerator - 设置加速度

可以为字段设置加速键,以便很快捷地定位到特定的字段上。只要在字段对应属性窗口Edit 页的Accelerator编辑框中输入字母或数字即可,只能输入一个字符。加速键由Alt和所输入的字母或数字构成。程序运行时,使用加速键可以将焦点马上转移到有该加速键的字段上。

11、Case - 选择大小写

可以给字符型字段指定大写、小写、还是原样显示输入内容。在字段对应的属性窗口Edit 页中的Case下拉列表框中选择即可。Up代表始终大写,Any代表原样,Lower代表小写。----------

增加和删除字段

进入数据窗口对象的SQL Select画板后可以对字段进行以下三种操作:

1、增加字段

2、删除字段

3、重选字段。取消某字段,再重新选中该字段。这看起来好像没有什么作用。实际上,这样做可以同步数据窗口对象和数据表的定义。当创建了数据窗口后又修改了该数据窗口对象对应数据表中某字段的定义,例如,增加了字段的长度,这是应该保证字段和数据窗口中的定义一致,使用上面的方法就可以做到数据的一致

*当添加字段时,PB不能正确设定新添加字段的默认属性,必须认真检查新添加的属性,最重要的属性是Limit的大小以及Show Focus Rectangle、Auto Selection和Auto Horz Scroll 属性是否选中。如果数据窗口对应的数据表中既没有定义主键也没有定义唯一性索引,并且数据窗口还是用来进行数据录入的,这时不管是删除了数据窗口中的字段或添加了字段,还是重新选择了字段,都要仔细检查并重新设置数据窗口的Update属性了,如果数据表中定义了主键或者唯一性索引,就不用考虑这个问题了。

----------

字段的显示顺序

在大多数显示样式的数据窗口中都可以使用鼠标拖放直接改变字段的位置,惟独grid类型

的数据窗口在Design窗口中不能。解决方法是,在预览窗口中拖动字段到适当的位置,Design窗口中的字段顺序就会自动做相应的调整。

可以用字段名或者字段号来标识一个字段。例如,产生数据窗口的SQL语句是:

select name,sex,address from addr_book;

在该数据窗口中,name和#1都是指同一个字段。显示位置的调整不会影响字段号,字段号和产生数据窗口的SQL语句中字段的顺序相对应,在SQL语句中,第一个字段对应的字段号为#1,依次增加一个。要调整字段号的顺序,可以进入到SQL select画板,取消所有字段,再按照正确的字段顺序重新选择字段;或者切换到语法状态,手工修改SQL语法中字段的顺序。经过这样的调整后,可能字段在数据窗口中显示的顺序没有变化,但是字段号却进行了重新分配。因为在窗口脚本中引用数据窗口的数据时,有可能用到字段号,在数据窗口的计算域中也有可能用到字段号,所以要保证字段号正确设定,尤其是习惯使用字段号引用数据时。

----------

////////////////////////////////////////

计算域是指在数据窗口的设计状态下添加到数据窗口中的Computed Field部件,它是一个数据窗口部件,具有部件的属性特征。计算字段是指在数据窗口对应的SQL语句中添加的表达式,计算字段是一个字段,它具有字段的属性特征。它们的区别主要体现在脚本中。计算字段因为具有字段的特征,所以SetItem等对字段操作的函数可以用来操作计算字段而不能来操作计算域,当需要在程序中动态设置值时,就应该使用计算字段而不能使用计算域,典型情况是对计算出来的值进行误差校正。这两个对象都可以使用GetItem一类的函数来读取取值。

常用函数:

条件判断

If ( boolean, truevalue, falsevalue )

Case ( column WHEN value1 THEN result1 { WHEN value2 THEN result2 { ... } } { ELSE resultelse } )

累积,(表格最右面一列各行是某列对应行前面所有行的累加和)

CumulativeSum(column{for range})

其中,column是列名、列号,或者是由列名、列号、常量、运算符,甚至其他函数构成的表达式,但取值必须是数值型的。For range是进行累积的范围。大多数显示样式的数据窗口都可以使用如下内容。

All:缺省值,累积指定列的所有取值

Group n:在指定的分组内对指定字段进行累积运算。Group是保留字,n代表组号,如1。Page:在页范围内进行累积运算。

百分比

Percent ( column { FOR range { DISTINCT { expres1 {, expres2 {, ... } } } } } )

Percent可以用来计算某字段在指定范围内当前行的取值占该范围内该字段累计和的比例。其中,column以及For range和上面CumulativeSum函数中的完全相同。选项DISTINCT 用来指定只统计不相等的字段,表达式expresX是用来区分行是否相同的标准。该函数和表达式column/sum(column for range)是等价的。

CumulativePercent(column{FOR range})

用来计算当前的累积和占总和的比例

其中的column和for range和上面的相同。该函数和下面的表达式是等价的:CumulativeSum(column for range)/sum(column for range)

引用不同行的数据

在数据窗口的表达式中,可以直接使用列名数组引用不同行的字段值,下标是一个相对数,相对于当前行而言的。例如,假设在数据窗口中有一列名为product_id,在数据窗口表达式中,product_id和product_id[0]是指当前行的product_id值。product_id[-1]是指前面一行的product_id值,product_id[1]是指下一行的product_id值。

使用这种引用方法,可以很简洁地提供更友好的数据显示格式。例如,当product_id改变时,用另外一种颜色显示月份、销售量、库存量等,可以修改这些字段的颜色表达式(应该以product_id排序):

if(getrow()=1,rgb(255,0,0),if(product_id =

product_id[-1],rgb(255,0,0),rgb(255,255,255)))

数据行的修改状态

isRowNew()

isRowModified()

if(isRowNew(),'新',if(isRowModified(),'改','旧'))

其他

date

isSelected

average

count

sum

////////////////////////////////////////

排序、过滤和分组

----------

排序

Rows->Sort

*双击Columns列表框中的字段或表达式,进入Modify Expression窗口,可以进行表达式定义,表示要使用该表达式进行排序。

上面的方法定义的排序是在客户端执行的,要在服务器端进行数据排序,可以通过修改数据窗口对应的SQL来实现。

----------

过滤

Rows->Filter

在对话框中输入表达式,在定义表达式时,有些经常使用的运算符,如like、betweem、in、match等需要特别关注一下。*特别是match具体可以在程序中测试,具体见PB帮助-match。上面的方法同排序是在客户端执行的,要在服务器端进行数据排序,可以通过SQL语句中使用where子句,然后用带参数的retrieve来过滤。

----------

分组

Rows->Create Group

*双击“Columns”列表框中的字段或表达式,进入Modify Expression窗口,进行表达式定义。创建分组后,数据窗口中又增加了两个带(band),Header group name用来先死组名,放置用来分组的表达式或者字段;Trailer group name放置分组的总结信息。

数据窗口创建后定义的分组和使用分组样式创建的数据窗口在显示效果上相同,区别在于前面一中方式是在数据完全从服务器端传送到客户端后进行的,后一种是直接在服务器按照分组取出数据的。

*最后介绍一种方法,同样可以达到Group的效果。比如,显示各个地区产品销售情况的数据,应该使用地区作为分组。在数据窗口画板中选择窗口菜单Rows->Sort,选择以字段“region”进行排序;然后再选择窗口菜单Rows->Supress Reapting values…,指定压缩字段“region”的重复值即可。

----------

////////////////////////////////////////

其他

----------

数据窗口中的当前页和总共页

string ls_currentPageNo

string ls_totalPage

ls_currentPageNo = dw_1.Describe("evalue('page()',1)") // ?? 获取当前页号

ls_totalPage = dw_1.Describe("evalue('PageCount()',1)") //获取总共多少页

----------

数据窗口对象的中备份和恢复数据

备份:File->Save Rows As //或Preview窗口中右键->Save Rows As

恢复:Rows->Import

----------

////////////////////////////////////////

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/ec2363104.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/ec2363104.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模板内容时,根据模板中已经定义的映射关系,将元素映射到实际的数据窗口控件和它们的文本内容。在映射操作成功完成后,引擎将借助

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