查询功能的开发
查询是每个程序都要做的一个功能,我们做mis系统,一般地做不到google似的智能查询,最常见的就是提供参数查询。我认为,所有的系统,应该都提供通用的查询功能。
通用的查询模块要包括的功能有:数据源的选择、条件的定义、输出列的定义、查询模板的管理、关键字飘红、数据分页、数据导出等。界面要简单,功能要灵活,要做到这些要求并不容易。
首先要确定数据源,做为数据源,最合适的就是不含order by字句的select语句,显然,用户不可能会写这个sql语句,鉴于数据源在系统中的数量基本固定,我们可以建立数据源库,让用户选择友好名称的数据源。
用户选择数据源后,显然马上显示数据比输入条件再显示数据要好。考虑到数据源中的指标也许很多,为了节省流量,那么要定义缺省的输出列,用户点击数据源后,马上显示该数据源中所有记录的这些指标,缺省的输出列我们可以把最经常用的放入。定义输出列时,应该允许用户选择多个指标进行排序。
用户看到数据后,一般的会进行简单的单条件的查询,我们应该提供快速的单条件查询和复杂的多条件查询,这里不得不说的是查询运算符的确定,我们使用sql时用到运算符有is null、is not null、=、<>、>、>=、<、<=、like、in等,用户可能没有任何的sql语句基础,其中的is null、is not null、like、in绝大部分用户看不懂。
对于is null、is not null这些运算符,我认为能避免的就避免,数据列能设置不允许空值就设置,null值引起的问题太多了,然而我们可能会查询历史的数据,那么先保留这两个运算符,可以把名称改为:为空、不为空;
对于like,一般的系统都解释为“包含”,其实,like不仅仅是包含,最有用的应该是 like '**%',可以称为“前缀”,这个运算符对于固定长度的编码特别有用,用户也很好理解,对应的,应该还有一个“后缀”,like还有其他用处,当需要查询固定位置的数据时,我们可以轻松的写一个:like '___[12]%'。用户一般的不会直接写like的语法,用用包含、前缀、后缀就可以了,但是会有人需要的,至少自己维护的时候会用到,所以要增加一个“匹配”运算符,其他的like运算符会自动加%,这个不做处理。
in运算符常常被忽视,其实用户使用到这个功能的机会非常多,试想一下,用户要查找一批指定名单的记录,已经有记录的主关键字清单,这时用in运算符可以很容易的找出,当然这个清单的数量应该在3000以下比较好,太多了生成的sql语句大,运行慢。这个运算符我们可以称为“在列表”。
以上的运算符还要有对应的“非*”或“不*”运算符。
用户确定运算符后,填写值就可以查询,填写值的时候,可以模仿google的做法,进行智能的分析列出常用的词组。
当单条件满足不了要求时,通过一个弹出界面来设置查询模板,每个模板定义条件和输出的列,条件就是单条件的组合,加上括号的支持,我们可以定义多个括号选择项来供用户选择,当然还有“并且”、“或者”的支持。
输出的列,应该可以从数据源的所有列中挑选,挑选出的列可以定义排列顺序和排序方式,这里要注意的是主键列的处理,我们分页也好,单条记录调用功能也好,都需要主键列,主键列是必须要包含在输出列中的,但是有时主键列是内部使用的代码,用户没必要关心它们,这里可以设置一个“隐藏”标志来隐藏系统需要但不显示的列。还有一种输出列“计算列”,用到的时候不多,但是肯定会用到,计算列实际就是一个表达式,用户可以定义多个计算列。计算列应该和普通列一样处理,可以在条件中使用,也可以定义排序方式。
在查询的界面上通过一个下拉列表来选择定义的模板,选择后,模板的条件和单条件应该交叉应用。当查询结果显示的时候,用户可以点击进行升序、倒序操作。
这里要解决的重大问题是分页的处理,不同的dbms语法不一样,oracle和sql server 2005都有rownumber函数,没有这个函数,可以通过top 和order by来解决,这里就会用到主键列,基本思路就是取一段再去除其中的一段。
要实现这个模块,用到最多的技巧就是嵌套查询的使用,用到5层的嵌套一点也不奇怪。
在界面上用户要能设置页大小,但要有个限制,否则程序将长时间等待。一般以500或者1000作为上限为佳,20~100的页大小比较适当。因为用户最终要缩小范围,不可能对那么多的记录进行一个个处理。
最后说说数据处理。用户辛辛苦苦定义了条件查询后,当然要进行数据处理,数据处理有:单条件处理、数据导出、成批更新、全部删除、自定义处理等。
其中单条件处理实际上就是在每条记录的左边显示一个操作,点击调用,主键值作为参数传递,这个,我们可以在后台定义数据源的时候一起定义。
导出操作要进行异步运行,因为导出的操作一般是大数据量的,常用的格式有:excel格式、csv格式、mdb格式。其中mdb格式做为一种高保真的格式,应该要实现,导出csv时,要注意双引号、空格、逗号的处理,另外,csv文件的编码要设置utf-8,经常碰到半个汉字的问题。excel格式有行数的限制。
全部删除没什么好说的,符合条件的全部删除就是,要注意提示用户,这里提下,对于用户经常使用的功能不要进行选择提示,否则适得其反。
成批处理就是生成update语句,设置界面上应该有输入空值和表达式的方法。
最后,还要实现一个选择的功能,每个记录的左边用户可以打勾选择,然后可以设置“显示所有”、“仅显示选中”、“仅显示不选中”,这个设置应该和条件、模版交叉应用。同时,可以在后台自定义操作列表,如“处理所有”“处理选中”。
当所有的功能都实现了,没有bug,每次查询的速度控制在10s以内,那么这个模块将受到用户的欢迎。
过几天,我可以提供一个实现这些功能的网站实例。
通用的查询模块要包括的功能有:数据源的选择、条件的定义、输出列的定义、查询模板的管理、关键字飘红、数据分页、数据导出等。界面要简单,功能要灵活,要做到这些要求并不容易。
首先要确定数据源,做为数据源,最合适的就是不含order by字句的select语句,显然,用户不可能会写这个sql语句,鉴于数据源在系统中的数量基本固定,我们可以建立数据源库,让用户选择友好名称的数据源。
用户选择数据源后,显然马上显示数据比输入条件再显示数据要好。考虑到数据源中的指标也许很多,为了节省流量,那么要定义缺省的输出列,用户点击数据源后,马上显示该数据源中所有记录的这些指标,缺省的输出列我们可以把最经常用的放入。定义输出列时,应该允许用户选择多个指标进行排序。
用户看到数据后,一般的会进行简单的单条件的查询,我们应该提供快速的单条件查询和复杂的多条件查询,这里不得不说的是查询运算符的确定,我们使用sql时用到运算符有is null、is not null、=、<>、>、>=、<、<=、like、in等,用户可能没有任何的sql语句基础,其中的is null、is not null、like、in绝大部分用户看不懂。
对于is null、is not null这些运算符,我认为能避免的就避免,数据列能设置不允许空值就设置,null值引起的问题太多了,然而我们可能会查询历史的数据,那么先保留这两个运算符,可以把名称改为:为空、不为空;
对于like,一般的系统都解释为“包含”,其实,like不仅仅是包含,最有用的应该是 like '**%',可以称为“前缀”,这个运算符对于固定长度的编码特别有用,用户也很好理解,对应的,应该还有一个“后缀”,like还有其他用处,当需要查询固定位置的数据时,我们可以轻松的写一个:like '___[12]%'。用户一般的不会直接写like的语法,用用包含、前缀、后缀就可以了,但是会有人需要的,至少自己维护的时候会用到,所以要增加一个“匹配”运算符,其他的like运算符会自动加%,这个不做处理。
in运算符常常被忽视,其实用户使用到这个功能的机会非常多,试想一下,用户要查找一批指定名单的记录,已经有记录的主关键字清单,这时用in运算符可以很容易的找出,当然这个清单的数量应该在3000以下比较好,太多了生成的sql语句大,运行慢。这个运算符我们可以称为“在列表”。
以上的运算符还要有对应的“非*”或“不*”运算符。
用户确定运算符后,填写值就可以查询,填写值的时候,可以模仿google的做法,进行智能的分析列出常用的词组。
当单条件满足不了要求时,通过一个弹出界面来设置查询模板,每个模板定义条件和输出的列,条件就是单条件的组合,加上括号的支持,我们可以定义多个括号选择项来供用户选择,当然还有“并且”、“或者”的支持。
输出的列,应该可以从数据源的所有列中挑选,挑选出的列可以定义排列顺序和排序方式,这里要注意的是主键列的处理,我们分页也好,单条记录调用功能也好,都需要主键列,主键列是必须要包含在输出列中的,但是有时主键列是内部使用的代码,用户没必要关心它们,这里可以设置一个“隐藏”标志来隐藏系统需要但不显示的列。还有一种输出列“计算列”,用到的时候不多,但是肯定会用到,计算列实际就是一个表达式,用户可以定义多个计算列。计算列应该和普通列一样处理,可以在条件中使用,也可以定义排序方式。
在查询的界面上通过一个下拉列表来选择定义的模板,选择后,模板的条件和单条件应该交叉应用。当查询结果显示的时候,用户可以点击进行升序、倒序操作。
这里要解决的重大问题是分页的处理,不同的dbms语法不一样,oracle和sql server 2005都有rownumber函数,没有这个函数,可以通过top 和order by来解决,这里就会用到主键列,基本思路就是取一段再去除其中的一段。
要实现这个模块,用到最多的技巧就是嵌套查询的使用,用到5层的嵌套一点也不奇怪。
在界面上用户要能设置页大小,但要有个限制,否则程序将长时间等待。一般以500或者1000作为上限为佳,20~100的页大小比较适当。因为用户最终要缩小范围,不可能对那么多的记录进行一个个处理。
最后说说数据处理。用户辛辛苦苦定义了条件查询后,当然要进行数据处理,数据处理有:单条件处理、数据导出、成批更新、全部删除、自定义处理等。
其中单条件处理实际上就是在每条记录的左边显示一个操作,点击调用,主键值作为参数传递,这个,我们可以在后台定义数据源的时候一起定义。
导出操作要进行异步运行,因为导出的操作一般是大数据量的,常用的格式有:excel格式、csv格式、mdb格式。其中mdb格式做为一种高保真的格式,应该要实现,导出csv时,要注意双引号、空格、逗号的处理,另外,csv文件的编码要设置utf-8,经常碰到半个汉字的问题。excel格式有行数的限制。
全部删除没什么好说的,符合条件的全部删除就是,要注意提示用户,这里提下,对于用户经常使用的功能不要进行选择提示,否则适得其反。
成批处理就是生成update语句,设置界面上应该有输入空值和表达式的方法。
最后,还要实现一个选择的功能,每个记录的左边用户可以打勾选择,然后可以设置“显示所有”、“仅显示选中”、“仅显示不选中”,这个设置应该和条件、模版交叉应用。同时,可以在后台自定义操作列表,如“处理所有”“处理选中”。
当所有的功能都实现了,没有bug,每次查询的速度控制在10s以内,那么这个模块将受到用户的欢迎。
过几天,我可以提供一个实现这些功能的网站实例。