[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”、“#”、“.”和一些算术符号来表示,使用保留字“”或者“”时,PB将使用操作系统的设置格式。关于操作系统的格式,Windows可以在控制面板的区域设置中修改。
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;($#,##0) $5 ($5) $1
$#,##0.00;($#,##0.00) $5.00 ($5.00) $0.50
$#,##0.00;($#,##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时表示。“@”代表一个字符。如:"(@@@)@@@-@@@@"
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,本人,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是指当前行的product_id值。product_id[-1]是指前面一行的product_id值,product_id是指下一行的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
----------
////////////////////////////////////////
学习,太好了。 学习,太好了。 学习了,谢谢分享 学习 好资料 详细!
页:
[1]