仓酷云 发表于 2015-1-16 22:38:37

MSSQL网页编程之在数据窗口中举行行挑选操纵

支持大型的数据库。可以处理拥有上千万条记录的大型数据库。数据
我们在数据窗口中需要进行行选择操作。如用户为了修改数据或看到更详细的内容而选择了某一行;在另一些情况下,用户可能要同时删除或修改多行,这时,我们必要有使用户在一个数据窗口中同时选择多行的功能。这在PowerBuilder中是相当容易做到的,但是,如果您在一个数据窗口祖先中没有标准的函数来处理这些,而在每个窗口中重复的编程,这当然就要麻烦多了。

我们首先来看一看进行行选择的不同方法。
所有行都不加亮
数据窗口的标准行为是不加亮任何行。这当然实现起来很简单了,您什么也不需要做。这种做法关于那些只允许用户进行滚动和查看的数据列表或那些单行的数据窗口是合适的。
单行选择
单行选择意味着用户在同一时间只能选择一行。在用户选择一行来执行一些动作,如删除或是在主从关系的列表中显现详细信息,这是非常有用的。下面是实现允许单行选择功能所应编写的代码:



Event:RowFocusChanged

ifGetRow()>0then

SelectRow(0,FALSE)

SelectRow(GetRow(),TRUE)

endif


多行的自动选择
多行的自动选择时,当用户点击一个未加亮的行时,该行将变亮。如果用户点击一个加亮行,该即将不加亮。

为了实现上述行为,您可以将以下的代码放进RowFocusChanged事件中:



Event:RowFocusChanged

Event:RowFocusChanged

Object:AnyDataWindow

ifGetRow()>0then

ifIsSelected(GetRow())then

SelectRow(GetRow(),FALSE)

else

SelectRow(GetRow(),TRUE)

endif

endif

大概简化成为上面的一行代码:
ifGetRow()>0thenSelectRow(GetRow(),NOTIsSelected(GetRow()))
按住shift,control或control+shift点击鼠标的利用
windows的文件管理器或其它windows程序中,您能够使用按住shift,control或control+shift这种键盘与鼠标的组合来改变选择行为。PowerBuilder在数据窗口中没有提供这样的能力,我们必须自己实现。
我们应当实现的组合功能是:
按下键
动作

只加亮当前行,将其它行的显现设为正常
Control
保持其它行的状态,并将当前行也加亮
Shift
加亮起始行至当前行之间的一切行,将其它行的显示设为正常
Control-Shift
保持其它行的状态,并加亮肇端行至当前行之间的一切行,
建立这样的功能,我们首先必要对起始行进行跟踪。在用户使用shift或control-shift键时,系统应当把当前用户用鼠标点击或键盘选中的行与在此之前进行操作的起始行之间的所有行全部加亮。因此,数据窗口必须记录当前的起始行。我们声明这样一个实例变量:
protectedlongil_anchor_row
当用户点击鼠标或进行了键盘操作时,我们要测试用户是否同时按下了shift或control键,使用的是KeyDown()函数,检查有没有KeyShift!和KeyControl!,若有这样的键按下则记录起始行。
编写行选择函数
为了在用户点击鼠标或进行键盘操作时使上述行为发生作用,我们必须在Clicked事件和一个映照到Pbm_dwnkey事件的自定义用户事件中调用我们自己的行选择函数。这样,不管用户是点击鼠标还是击中键盘,选择行为都会发生。您也可以将这个功能放进RowFocusChanged事件中。

为了使这个行选择功能可重用,这里我们建立两个函数。一个函数设置我们希看的选择行为类型,另外一个真正执行该选择行为。起首我们使用一个实例变量来设定选择行为的值:
protectedintegerii_select_behavior
这个变量中将存放下面的一些值。
可能发生的选择行为

行为0
不允许选择行为1
只允许有一行选中2
自动实现多行选择3
允许使用鼠标和键盘组合选择99
不允许选择,将鼠标变成手型如果您使用的是保护变量或私有变量,这就意味着本对象以外的程序无法访问,因此您必须为其他程序员建立对这些变量赋值和获取这些变量值的函数。别的,您还需要一些函数来执行基于该变量的过程。
函数:uf_SetSelect(Select_behavior)
我们要写的第一个函数将允许程序员设置选择行为。
函数:publicintegeruf_SetSelect(integerai_select_behavior)
/*本函数设置数据窗口的选择行为值
下列为有效的选择行为值*/



CHOOSECASEai_select_behavior

CASE0,1,2,3,99

ii_select_behavior=ai_select_behavior

//至少一行将被选中

ifai_select_behavior=1then

uf_process_select(GetRow(),"Keyboard")

endif

ifai_select_behavior=99then

SetRowFocusIndicator(Hand!)

else

SetRowFocusIndicator(OFF!)

endif

return0

CASEELSE

return-1

ENDCHOOSE

函数:uf_ProcessSelect(longal_row,stringas_input_type)
一旦选择类型被设置,所有的行都必须被处理。我把这部分代码放进一个叫作uf_ProcessSelect的函数中。这个函数处理选择行为。您需要告诉该函数您想要处理的行和该请求是通过鼠标还是键盘收回的。下面是该函数:



longl_row

booleanb_reset_anchor

booleanb_keyboard,b_mouse

//鼠标动作还是键盘动作?

ifUpper(left(as_input_type,1))="K"then

b_keyboard=TRUE

else

b_mouse=TRUE

endif

/*确认鼠标点在了数据窗口的记录上*/

IFal_row<1THENReturn1/*是否要确定起始行*/b_reset_anchor="TRUE"SetRedraw(FALSE)/*有效的操作值0="不"允许选择行为1="只"允许有一行选中2="自"动实现多行选择3="允"许使用鼠标和键盘组合选择99="不"允许选择,将鼠标变成手型*/CHOOSECASEii_select_behaviorCASE0,99//无CASE1//单行选中SelectRow(0,FALSE)SelectRow(al_row,TRUE)CASE2//多行选中ifb_mousethenSelectRow(al_row,NOTIsSelected(al_row))endifCASE3IFkeydown(KeyShift!)ANDKeyDown(KeyControl!)THENIFil_anchor_row>al_rowthen

FORl_row=il_anchor_rowTOal_rowSTEP-1

this.selectrow(l_row,TRUE)

NEXT

ELSE

FORl_row=il_anchor_rowTOal_row

this.selectrow(l_row,TRUE)

NEXT

ENDIF

ELSEIFKeyDown(KeyShift!)Then

SelectRow(0,FALSE)

IFil_anchor_row>al_rowthen

FORl_row=il_anchor_rowTOal_rowSTEP-1

this.selectrow(l_row,TRUE)

NEXT

ELSE

FORl_row=il_anchor_rowTOal_row

this.selectrow(l_row,TRUE)

NEXT

ENDIF

b_reset_anchor=FALSE

ELSEIFKeydown(KeyControl!)THEN

SelectRow(al_row,NOTIsSelected(al_row))

ELSE

SelectRow(0,FALSE)

SelectRow(al_row,TRUE)

ENDIF

ENDCHOOSE

SetRedraw(TRUE)

ifb_reset_anchorthenil_anchor_Row=al_row

return0

现在,当我们希看执行行选择时,所要做的全部操作就是调用uf_ProcessSelect()函数。一般当用户在一个数据窗口中点击了鼠标或是按下了上、下箭头键时,调用这个函数。另外还有捕捉home和end键的代码。下面是we_keydow用户事件(映射到Pbm_dwnkey事件)中的代码:



Event:we_keydown(pbm_dwnkey)

Object:AnyDataWindow

ifKeyDown(KeyDownArrow!)andGetRow()RowCount()then

uf_processSelect(GetRow()+1,"Keyboard")

elseifKeyDown(KeyUpArrow!)andGetRow()1then

uf_processSelect(GetRow()-1,"Keyboard")

elseifKeyDown(KeyHome!)andRowCount()>0then

uf_processSelect(1,"KeyBoard")

elseifKeyDown(KeyEnd!)andRowCount()>0then

uf_processSelect(RowCount(),"Keyboard")

endif

最后,我们需要在clicked事件中加进:

uf_processSelect(GetClickedRow(),"Mouse")

在这个祖先函数中编写这样一个行选择的函数只是作为一个复杂的实例,相信您一定能因此收到启发,编写出更多的函数,以拓展数据窗口的基本功能。


mysql的原来开发者又开发了MariaDB,MariaDB适合用来替代mysql吗

只想知道 发表于 2015-1-17 19:27:14

SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.

小女巫 发表于 2015-1-21 07:14:26

分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。

山那边是海 发表于 2015-1-30 10:56:43

比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。

愤怒的大鸟 发表于 2015-2-6 10:14:43

如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。

因胸联盟 发表于 2015-2-15 23:17:19

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

精灵巫婆 发表于 2015-3-4 18:15:16

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油

冷月葬花魂 发表于 2015-3-11 20:35:28

财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..

简单生活 发表于 2015-3-19 11:59:52

但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。

小妖女 发表于 2015-3-28 01:21:59

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
页: [1]
查看完整版本: MSSQL网页编程之在数据窗口中举行行挑选操纵