[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 //选择字段
3、指定检索条件
Retrieval Arguments //定义检索参数变量的类型和名称
where //检索条件,右键->Columns //选择字段
----------
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:
----------
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部件。
----------
数据窗口对象及字段的修改属性
数据窗口只能修改一个数据表。当数据窗口的数据来源于不止一个数据表时,可以用脚本控制数据窗口的修改属性来对数据表逐个进行修改。
当数据窗口是用来接受用户的手工录入数据时,应该设置两方面的属性才能确保数据窗口能够用来修改数据表。一个是修改数据窗口的修改属性,另一个是用户可以修改的字段的相关属性值
----------
数据窗口对象的修改属性
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,陈,杭州,)。若想把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 = ''
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属性
数据保护
可以用以下三种方法将字段设置为用户不可修改的字段:
(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输入框中输入一个整数即可
Format的设置:
Numbers:可以使用“0”、“#”、“.”和一些算术符号来表示,使用保留字“[general]”或者“[Currency]”时,PB将使用操作系统的设置格式。关于操作系统的格式,Windows可以在控制面板的区域设置中修改。
[General]
0
0.00
#,0
#,0.00
$#,0;($#,0)
$#,0;-$#,0
$#,0;[RED]($#,0) $5
$#,0.00;($#,0.00) $5.00
$#,0.00;[RED]($#,0.00)$5.00
0%
0.00%
0.00E+00
Strings:可以用两部分来表示该类型数据的显示,前面是必需部分,后面是NULL时表示。“@”代表一个字符。如:"[red](@@@)@@@-@@@@"
Dates:使用几个特定的字母代表特定的含义,它们的组合构成Data类型的格式。
d 表示天的数字,没有前缀0
dd 表示天的数字,有前缀0
ddd 星期几的英文缩写
dddd 星期几的英文全称
m 没有前缀0的月份
mm 有前缀0的月份
mmm 月份的英文缩写
mmmm 月份的英文全称
yy 两位数字表示的年份
yyyy 四位数字表示的年份
两位的年份如果小于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 一个小写的缩写字母,代表上午和下午
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选项,从而可以确保用户的输入必须是代码表中定义了的,否则就出现报错信息。
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窗口中的字段顺序就会自动做相应的调整。
----------
常用函数:
条件判断
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值。
数据行的修改状态
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]-数据窗口对象(二)
获取数据窗口信息
※函数Describe
使用函数Describe可以获取数据窗口对象中的信息。该函数语法是:
dwcontrol.Describe(propertylist)
其中,dwcontrol是数据窗口控件名称,propertylist是以空格分隔的特性或运算表达式列表,它用来报告列与图形对象的属性值。表达式可以用特定行与列的值进行运算。Describe函数返回的是一个字符串,该字符串是对指定属性的描述,不同的属性占用不同的行(不同属性用~n分隔)。如果有无效属性则返回该属性之前的属性取值和一个惊叹号(!)。如果某个属性没有值,则返回一个问号(?)。
如:
dw_1.describe("datawindow.bands datawindow.objects")
header~tdetail~tsummary~tfooter~nemp_id~temp_id
dw_1.describe("datawindow.band datawindow.objects")
!
dw_1.describe("datawindow.bands datawindow.object")
header~tdetail~tsummary~tfooter!
如果特性值容易引起混淆,例如,带有感叹号、问号、Tab键或换行符,这些符号在返回字符串中将用引号括起来。为了测试这种情况,先给数据窗口中的标签name_t中输入内容为name?,然后使用下面的语句:
dw_1.describe("name_t.text")
上面的语句显示"name?",这是因为如果值列表中的第一个值用引号引着,那么该特性列表中的剩余值也用引号引着。
*标签name_t和addr_t中分别输入内容为name?和zjhz
dw_1.describe("name_t.text addr_t.text")-------"name?" zjhz
dw_1.describe("addr_t.text name_t.text")-------zjhz "name?"
*最后不显示空格(~n)
※对列的引用
在属性描述时,经常要对列进行引用。引用列的方法有两种,或者使用列名,或者使用列号。应尽量避免使用列号,因为列号是和创建数据窗口时选择字段的顺序相对应的。在以后的修改中很有可能取消某些字段或者调整字段的选择顺序,或者改变数据源,这时就很容易出现错误,更糟糕的是这时很有可能没有错误信息,张冠李戴了。
下面是一个使用列号进行属性描述的语句:
dw_1.describe("#5.coltype")
这种语法可以和函数getcolumn搭配使用,用来检索当前列号。下面是一个显示数据窗口中所有字段类型的例程:
integer li_count,li_index
li_count = integer(dw_1.describe("datawindow.column.count"))
for li_index = 1 to li_count
messagebox(string(li_index),dw_1.describe("#" + string(li_index) + "coltype"))
next
※函数Evaluate
在使用Describe描述数据窗口对象中的相关信息时,有一个非常重要的函数不能不掌握,就是Evaluate。虽然函数Describe可以获取对象的信息,但是表达式的取值就不能正常读取了,而这又是经常遇到的。所以,函数Evaluate非常重要,它可以使函数Describe获取表达式的取值。该函数的语法是:
Evalute('expression',rowno)
其中,expression是属性表达式,rowno是要描述的行号。该函数放置在Describe的属性列表中。例如,判断第3行的salary工资是否大于1000,如果大于则返回1,否则返回0,
可以使用下面的语句:
dw_1.describe("evaluate('if(salary > 1000,1,0)',3)")
而使用下面的语法就是错误的:
dw_1.describe("if(salary > 1000,1,0)")
*单行(如第二行)
dw_1.describe("evaluate('if(isnull(emp_no) or emp_no = '',~~'*~~',emp_no)',2)")
*多行
long ll_i
string ls_emp
for ll_i = 1 to dw_1.rowcount()
ls_emp = dw_1.describe("evaluate('if(isnull(emp_no),~~'NULL~~',emp_no)'," + string(ll_i) + ")")
dw_1.setitem(ll_i,'emp_no',ls_emp)
next
※函数LookUpDisplay
字段使用了下拉列表框、下拉数据窗口和单选按钮等有代码表的编辑风格时,在数据窗口控件上显示的值和字段实际得到的值并不相同,使用函数GetItemX只能读取这样的字段的真实取值,而不是用户看到的值。如何才能读取用户看到的值?可以使用函数LookUpDisplay。
LookUpDisplay函数不能直接从PowerScript调用,可以在Describe和Evaluate函数配合使用。因为函数LookUpDisplay不能指定对哪行数据进行操作,它的参数只有一个字段名称,所以必须和Evaluate函数配合使用。该函数的语法是:
其中,参数columnname是字段的名称,而不是一个字符串。函数执行错误则返回空字符串。
messagebox("getitemstring:"+dw_1.getitemstring(1,"sex"),"lookupdispaly:"+dw_1.describe("evaluate('lookupdisplay(sex)',1)"))
::getitemstring:男
::lookupdisplay:male
〓修改数据窗口信息
为了在运行时修改数据窗口对象特征,应该使用Modify函数,而不是直接访问语法。该函数的语法如下:
dwcontrol.Modify(modstring)
其中,dwcontrol是数据窗口控件名称,既可以是数据窗口也可以是子数据窗口,还可以是datastore对象。modstring是修改字符串,用来指示要修改哪些对象的哪些属性。如果修改成功函数则返回空字符串,如果修改的语法错误则返回对错误的描述,格式是:line n Column incorrect syntax,这里是第n列是从modstring开始计数的错误位置。
数据窗口对象可以在运行时使用合适的语法修改其外观、行为和数据库信息。通过提供完整的对象规范,甚至可以在数据窗口对象内部创建和删除对象。
使用modstring参数可以指定Create、Destroy和Attribute alteration三种类型的语句。
※创建对象
可以使用下面的语法来添加对象(如文本、计算域以及位图):
Create object(settings)
其中,settings为将要创建的对象定义的一组特性和值,定义对象时,用户必须提供足够的信息。
想要得到某个对象的正确语法的最好的方法就是导出一个包含对象的简单的数据窗口。然后就能把对象的语法剪切并粘贴到应用程序中。另一种办法是使用那些能成为数据窗口内特定对象显示语法的许多工具之一(它们正变得越来越商业化)。
下面的示例用来说明这种格式,假设用户刚刚从头开始动态地创建了一个完全新的数据窗口,现在需要在标题头放置一个公司标志,其语法是:
string ls_modify,ls_result
ls_modify = "Create bitmap(band = background filename = 'c:\logo.bmp' x = '60' y = '8' width = '1308' height = '513' border = '0' name = logo)"
ls_result = dw_1.modify(ls_modify)
if ls_result <> "" then
messagebox("提示",ls_result)
end if
这段代码为用户刚刚创建的报表数据窗口在恰当的位置创建标识。
※删除对象
除了可以在数据窗口内创建对象外,还可以使用下面语法删除对象:
Destroy [Column] object
这里的object是数据窗口对象内要删除对象的名字。若要把列和列的数据从缓冲区中删除,需要指定Column关键字。
例如,上一个示例中向动态创建的报表中添加了一个公司标志。如果用户把这一功能作为运行时的选项,比如说通过复选框,那么就不仅需要能够创建对象而且还需要删除该对象。下面是用于删除的代码:
string ls_result
ls_result = dw_1.modify("destroy logo")
if ls_result <> "" then
messagebox("错误",ls_result)
end if
下面的示例使用这种modify格式删除列及其相关的标签:
string ls_result
ls_result = dw_1.modify("destory column salary destroy salary_t")
if ls_result <> "" then
messagebox("错误",ls_result)
end if
※特性修改
Attribute alteration 类型的语句格式是modify三种格式中最常用的一种,这种语法的格式如下:
objectname.attribute = value
按照被影响的attribute的不同,value可以是下面类型中的任何一种:
a)常量:指简单的、不使用表达式的特性修改值。如:
columnname.band = footer
b)带引号的常量:也是指简单的特性修改值。如:
columname.height = '65'
c)表达式:由一个默认值及其后的表达式组成,它的返回值与特性的数据类型相同。如:
'~tif(emp_status=~'A~',255,)'
请注意这种表达式的格式。整个表达式括在单引号中,表达式需要缺省值,而且该值通过Tab键(~t)与余下的表达式隔开。表达式返回0或者1,它们是特性的有效值。
在实际使用时,这种格式的语句经常简单写成属性访问格式。如:
dw_1.modify("oval_1.background.color = rgb(255,0,128)")
和以下直接属性访问方式是等价的:
dw_1.object.oval_1.background.color = rgb(255,0,128)
*获取字段的类型(Coltype属性)
字段的ColType属性是一个非常有用的属性,使用该属性可以在程序运行时获取字段的类型。但是不能在运行时修改该属性。下面是它的语法:
直接引用:dw_1.object.object.objectname.coltype
在Describe函数中:"objectname.coltype"
不管使用哪种方式,对同一个字段获得的类型都相同。字段类型有char(n),date,datetime,decimal(n),int,long,number,real,time,timestamp及ulong共11种,其中的n代表字符的长度或者小数后的精度。
如:
ls_coltype = dw_1.objcet.emp_id.coltype
ls_coltype = dw_1.describe("emp_id.coltype")
在实际编程中,获取字段的类型后,紧接着使用choose case语句针对不同的类型进行相关的处理。
*背景属性(background.property)
在运行时修改字段的背景,这是标识特殊数据行的一种手段。使用该属性可以在程序运行时获取字段的背景,也可以修改字段的背景。它的语法如下:
直接引用:dw_1.object.objectname.background.property
在Describe和Modify函数中:"objectname.background.property{ ='value'}"
其中,property可以是color或者mode。当为color时取值应该是长格式表示的颜色,或者使用RGB函数中红、绿、蓝表示的颜色;当为mode时,0表示将背景设置为不透明的(即可以显示背景颜色),1表示背景为透明的。
实际上,字段的背景属性也可以在数据窗口画板中进行设定。下面是修改和读取字段背景属性的实例:
//修改字段的背景颜色
dw_1.object.oval_1.background.color = rgb(255,0,128)
dw_1.modify("emp_name.background.color = ''") //这里好象不能用rgb()
//读取字段的背景颜色
ls_data = dw_1.describe("oval_1.background.color")
//读取字段的背景模式
ls_data = dw_1.describe("emp_name.background.mode")
//设置字段的背景模式
dw_1.modify("emp_name.background.mode = '1'")
dw_1.modify("mdrect_1.background.mode = '0'")
*指定检索规则(Criteria.property属性)
在脚本运行时,可以控制是否显示检索规则窗口或者读取数据窗口这方面的信息。语法如下:
直接引用:dw_1.object.columnname.criteria.property
在describe和modify函数中:"columnname.criteria.property{ = value}"
其中,dw_1是数据窗口控件名称,columnname是要获取或者设置检索规则的字段名称,value为yes或者no,property是以下属性:
a)Dialog:是否显示检索规则窗口。取值为yes则显示,取值为no则不显示。如,在一个数据窗口中放置了字段name,可以编写如下脚本:
dw_1.modify("name.criteria.dialog = yes sex.criteria.override_edit = yes")
dw_1.retrieve()
脚本运行,显示检索规则输入窗口
b)override_edit:是否用户必须在检索规则窗口中输入数据。取值为yes则用户必须输入数据,取值为no时用户可以不输入数据。
c)required:是否用户只能使用等号进行查询。如果取值为yes则用户的输入只能是等号,如果取值为no则用户可以使用各种符号,包括=、<>、>、>=、<=、<等。
*Edit风格的字段属性(Edit.property属性)
编辑风格为Edit类型的字段,可以通过edit.property来获取其相关信息或者设置其外观及动作。下面是它的语法:
直接引用:dw_1.object.columnname.edit.property
在describe和modify函数中:"columnname.edit.property{ =value}"
其中,columnname是哟啊读取或者设置属性的字段名称,value根据property不同而可以使用不同类型的值。property可以有17个取值,其中:
a)和滚动控制有关的有AutoHScroll,AutoVScroll,HscrollBar和VscrollBar,它们的取值都是yes或者no,表示是否显示该滚动条。
b)和显示的内容有关的属性有Case,CodeTable,Format,NillsNull和Password,这些属性用来控制字段中的内容如何显示。Case的取值为Any,Upper,Lower与Painter,表示不管用户在该字段上输入的大小写,都按照该属性自动进行转换。CodeTable的取值为yes或者no,表示该字段是否有代码表。Format规定对用户输入的内容进行格式化时应该采用的格式。NillsNull的取值为yes或者no,表示当用户在字段中不输入内容而离开该字段时,是否将该字段中的内容自动置为NULL。Password属性的取值也是yes或者no,表示是否将用户的输入作为密码样式显示,如果作为密码则用户的输入内容作为*号显示,显示的个数和用户输入字符个数相等。
c)和编辑控制有关的属性有AutoSelect,DisplayOn1y,FocusRectangle,Limit,Required,Style和ValidateCode,除了Limit取值为正整数、Stylee取值为String类型外,其他属性的取值都是yes或者no。AutoSelect属性表示当字段获得焦点时是否自动选中该单中的内容。Display0nly表示是否允许用户修改该字段中的内容,如果取值为yes,则用户虽然可以选中该字段中的内容但是不能修改。FocusRectangle表示当字段获得焦点时是否显示矩形的边框,以表示当前焦点的位置。Limit是一个相当重要的属性,用来限制用户可以输入字符的长度。Required属性如果为yes,则在获得焦点后用户不输入内容就休想离开。虽然该属性可以很好地保证非空字段不为空,但该属性非常不友好,建议慎重使用。Style属性在程序运行时不能修改,只能读取其中的信息。该属性返回的是关于字段的编辑风格。ValidateCode属性表示是否使用代码表进行有效性校验。该属性当CodeTable属性为yes时才有效。
下面是关于该属性的一些实例:
ls_setting = dw_1.objcet.emp_name.edit.autohscroll //是否允许自动横向滚动
ls_setting = dw_1.describe("emp_name.edit.Autohscroll") //同上
dw_1.object.emp_name.edit.required = "no" //将字段设置成必须输入的字段
dw_1.modify("emp_name.edit.required = no") //同上
*字段的显示格式(Format属性)
可以使用Format属性来指定字段的显示格式。但是,在实际编程中使用更多的是函数GetFormat或者SetFormat,以取代Modify或者Descrie来设置字段的显示格式。
该语法使用时的重点在于格式串的使用。下面是相关的语法:
直接引用:dw_1.object.objectname.format
在函数describe和modify中:"objectname.format{='value'}"
其中,objectname是字段或者计算字段或者计算域的名称value是字符型的表达式,取值是一种格式串。下面是一些使用实例:
ls_setting = dw_1.object.phone.format //读取字段的电话显示格式
ls_setting = dw_1.describe("phone.format")
dw_1.object.shipdate.format = "yyyy-mm-dd" //设置日期格式
dw_1.modify("shipdate.format = 'yyyy-mm-dd'")
*设置数据窗口修改时的主键(key属性)
该属性在一个数据窗口修改多个表时非常有用,因为这时必须根据要修改的表动态修改主键,属性key就可以实现该功能。该属性使用时的语法如下:
直接引用:dw_1.object.columnname.key
在函数modify或者describe中:"columnname.key{=value}"
其中,columnname是要作为主键的字段名,或者是要判断是否为主键的字段的名称;value取值为yes或者no。如:
ls_setting = dw_1.object.empid.key //判断字段empid是否为主键
ls_setting = dw_1.describe("empid.key")
dw_1.object.empid.key = "yes" //将字段empid作为主键
dw_1.modify("empid.key = yes")
*字段名称(name属性)
使用name属性可以获取字段的名称。可以使用字段号或者字段名称来标识一个字段,但使用字段号不太安全,所以用获取字段名比较好一些。语法如下:
直接引用:dw_1.object.objectname.name
在函数describe中:"objectname.name"
其中,objectname是要获取名称的控件标识,因为在数据窗口对象中有很多控件有多种标识方法。如,下面可以获取字段号为1的字段的名称:
dw_1.describe("#1.name")
*字段中的数据保护(protect属性)
该属性表示是否对字段中的数据进行保护,取值为0或者1。1表示实行保护,0表示不保护。当进行数据保护时,即使字段的TabOrder值大于0用户也不能对字段进行编辑,并且该字段都不能获得焦点(和TabOrder取值为0时的表现完全相同)。下面是该属性使用时的语法:
直接引用:dw_1.object.columnname.protect
在函数describe和modify中:"columnname.protect{='integer'}"
其中,columnname是要获取或者设置protect属性的字段的标识,integer取值为0或者1。
下面是使用实例:
ls_setting = dw_1.object.emp_start.protect //获取字段emp_start的protect属性取值
ls_setting = dw_1.describe("emp_start.protect")
dw_1.object.emp_start.protect = 1 //设置字段emp_start的protect属性
dw_1.modify("emp_start.protect = 1")
dw_1.modify("emp_start.protect = '1~tif(isrownew(),0,1)'")
//设置protect属性为表达式,含义是:如果是新数据行则将protect设置为0,否则设置为1//,缺省为1。
*字段的滑动属性(slideleft和slideup)
使用字段的滑动属性可以更好地根据运动时的情况安排数据的布局。有两个和滑动有关的属性,SlideLeft表示当左面空白时是否向左滑动,SlideUp表示当上面出现空白时是否向上滑动。使用该属性的语法是:
直接引用:
dw_1.object.objectname.slideleft
dw_1.object.objectname.slideup
在函数describe和modify中:
"objectname.slideleft{='value'}"
"objectname.slideup{='value'}"
其中,slideleft中的value取值为yes或者no。slideup中的value取值为:
a)AllAbove:当上面数据行中的所有 对象都为空时向上滑动
b)DirectlyAbove:当上面和本对象对应位置的对象为空时向上滑动
c)No:不进行滑动
下面是应用的实例:
dw_1.object.emp_lname.slideup = 'no'
ls_setting = dw_1.describe("graph_1.slideup")
dw_1.modify("emp_lname.slideup = no")
*字段的TabOrder值(TabSequence属性)
字段的TabOrder值是一个比较重要的属性,取值大于0时用户可以编辑该字段,等于0时无法编辑该字段。在运行时,根据程序的运行情况有可能动态修改字段的TabOrder值,这时可以使用TabSequence属性。该属性应用时的语法如下:
直接引用:dw_1.object.columnname.TabSequence
在函数modify或Describe中:"columnname.TabSequence{=number}"
其中,number为从0到32000的正整数,当为0时表示字段不允许编辑。下面是使用实例:
ls_setting = dw_1.object.emp_name.tabsequence //获取字段的TabOrder值
ls_setting = dw_1.Describe("emp_name.tabsequence")
dw_1.object.emp_name.tabsequence = 10 //设置字段的taborder值
dw_1.modify("emp_name.tabsequence = 10")
实际上,在编程时经常使用函数SetTabOrder来设置或者获取字段的TabOrder值,因为该函数正确执行后,字段被设置成指定的TabOrder值,并且返回设置之前的TabOrder值。
*用户是否可以保存字段内容(update属性)
当数据窗口中的数据提交时,可以修改的字段及其对应的数据用来产生update SQL语句,使用该SQL语句进行数据的保护。所以,在程序运行时,如果不希望用户保存某字段中的数据,可以修改字段的update属性。下面是该属性的语法:
直接引用:dw_1.object.columnname.update
在函数modify或者describe中:"columnname.update{=value}"
其中,value的取值为yes或者no。下面是使用实例:
ls_setting = dw_1.object.emp_name.update //获取字段是否可以修改
ls_setting = dw_1.describe("emp_name.update")
dw_1.object.emp_name.update = "no" //使字段emp_name不能修改
dw_1.modify("emp_name.update = no")
在应用时,可以根据用户的权限,或者根据用户的录入数据是否齐全(通常需要保证数据一致性)来动态修改某些字段的update属性。另外,在一个数据窗口修改多个数据表时也经常使用该属性。
*字段校验(Validation和ValidationMsg属性)
字段的校验规则在数据窗口画板中可以指定,但有时需要在程序运行时动态地修改,可以使用Validation和ValidationMsg属性来指定。属性Validation使用时的语法如下:
直接引用:dw_1.object.columnname.validation
在函数describe和modify中:"columnname.validation{='validationstring'}"
其中,validaionstring是一个包含校验规则的字符串,该字符串的结果或者是True或者是False。下面是使用实例:
ls_setting = dw_1.object.emp_status.validation //获取字段的校验规则
ls_setting = dw_1.describe("emp_status.validation")
dw_1.modify("sex.validation = 'sex = ~~~'f~~~' or sex = ~~~'m~~~''") //设置规则
dw_1.object.sex.validation="sex='f' or sex='m'"
字段的校验规则设置好后,用户在该字段上输入数据并要离开时,如果数据不能通过校验则显示错误信息,采用系统缺省的错误信息不太友好。这时,可以通过设置validationgMsg属性来指定错误信息。该属性使用时的语法如下:
直接引用:dw_1.object.columnname.validationMsg
在函数describe和Modify中:"columname.validationMsg{='string'}"
其中,string为数据不能通过校验规则时要提示的信息。如:
dw_1.object.sex.validationgmsg = "性别必须为f或者m!"
实际上,当用户输入的数据不能通过校验规则时将触发数据窗口控件的itemerror事件,该事件的返回值可以决定是否显示错误信息提示窗口。如果在itemerror事件中也编写了错误信息提示脚本,该脚本能够正常执行并且用validationgmsg属性定义的错误信息也会显示。
*计算域的属性
计算域除了具有上面介绍的属性外,还有一个重要属性Expression。使用这个属性可以根据用户的执行情况来更好地调整程序的动作,下面是其使用时的语法:
直接引用:dw_1.object.computename.expression
在函数modify和describe中:"computename,expression{='string'}"
其中,computename是计算域的名称,string是字符串,它应该包含合法的表达式。如:
ls_setting = dw_1.object.comp_1.expression //获取表达式
ls_setting = dw_1.describe("comp_1.expression")
dw_1.object.comp_1.expression = "avg(salart for all)" //设置表达式
dw_1.modify("comp_1.expression = 'avg(salary for all)'")
〓Button重要属性
*Action属性
该属性是Button控件最重要的一个属性。在数据窗口画板中,可以选择一个按钮有哪个动作。可选的动作都是事先定义好的,开发人员没有机会精确定义某个动作的执行,只能在运行时动态改变按钮的动作。
中可以选择可用的动作。
下:
其中,buttonname是要获取或者设置动作的按钮的名称;value是动作代码,可以是下拉列表框Action中的值。
代码 动作
11 AppendRow 在最后增加一空白行
3 Cancel
10 DeleteRow 如果按钮在detail带中则删除按钮 成功返回1,否则-1
9 Filter
12 InsertRow 如果按钮在detail带中,则以按钮 新插入行的行号
6 PageFirst 翻到第一页
7 PageLast 翻到最后一页
4 PageNext 翻到下一页
5 PagePrior 翻到前一页
16 Preview
17 PreviewWithRulers 打开或者关闭标尺
15 Print
20 QueryClear 删除where子句
18 QueryMode 进入、退出查询模式
19 QuerySort 指定查询时的排序规则
2 Retrieve 从数据库中检索数据
1 Retrieve(Yield) 从数据库中检索数据,并随时允许 检索到的记录数
14 SaveRowsAs 以用户指定的格式保存数据 记录数
8 Sort
13 Update
0 UserDefined 允许为按钮的ButtonClicked和 用户脚本中定义的返回值
*SuppressEventProcessing属性
SuppressEventProcessing属性用于是否触发ButtonClicked事件或者ButtonClicking事件。
语法格式是:
直接引用:dw_1.object.buttonname.suppresseventprocessing
在函数describe和modify中:"buttonname.suppresseventprocessing{='value'}"
其中,value的取值为yes或者no,表示是否触发事件。如:
dw_1.object.b_name.suppresseventprocessing = 'yes'
dw_1.modify("b_name.suppresseventprocessing = 'no'")
ls_setting = dw_1.describe("b_name.suppresseventprocessing")
*Text属性
通过Text属性可以获取或者设置按钮上的文字。当运行时,如果要动态修改按狃的Action属性,就应该利用Text属性修改。该属性使用时的语法如下:
直接引用:dw_1.object.textname.text
在函数modify和describe中:"textname.text{='string'}"
其中,string是一个字符串或者表达式,如果要给按钮设置快捷键,可以在字符串中使用&符号。如:
ls_setting = dw_1.object.text_1.text //获取按钮上的文字
ls_setting = dw_1.describe("text_1.text")
dw_1.object.text_1.text = "employee &Name" //给按钮设置文字,并有快捷键
dw_1.modify("text_1.text = 'employee &Name'")
=====================================
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/80707.html