股票代码自动提示

来源:互联网 发布:大数据架构师 pdf 编辑:程序博客网 时间:2024/05/15 20:53

 

最近在做一个股票代码提示功能,要求:输入股票代码、股票名称(拼音)首字母都能提示出相应股票。

一 AJAX功能

很久没摸过代码了,对AJAX更是陌生,能手写出具有智能提示功能的代码来当然是最灵活,但凭现在的技术,一两天绝对是搞不定的,光那一堆处理键盘事件的函数的调试,及对多浏览器的支持上就够折腾一阵子了。

最早用了公司买的控件R.A.D的Combobox,拿一个一万多条数据的DataSet 绑定,硬是等了三分多钟才出来,像这样的东西拿出来真的会吓到人。又试着不用绑定的方式,用循环直接取到DataSet里的数据行,再new itme,再Add item,

这样速度要比直接绑定的方式要快了很多,但还是不理想,而且控件的属性不是很多,控制起来相当不灵活.放弃使用!

又在网上转了一下,看有没有类似的DEMO或者控件拿来用,开始找到一个AjaxToolKit 里的auto Complete 下下来看了下,也挺烦的,要调用一个WEB SERVICE来获取数据,并且要固定参数,最重要一点,我都不知道在 javascript 里怎么样调用webservice。最后在网上看到一个基于jquery 的插件 autocomplete.这个看上去不错,用起来没有那么多要求,功能也比较全,决定用这个了,开始下了几个版本,都没法用,郁闷得差点失去信心的时候,终于找到一个能用的!

<script>

$("#suggest13").autocomplete(stock, {
                                                                 minChars: 0,
                                                                 width: 310,
                                                                 matchContains: "word",
                                                                 autoFill: false,
                                                                 formatItem: function(row, i, max) {
                                                                 return i + "/" + max + ": /"" + row.htcode + "/" [" + row.spname + "]";
                                                                 },
                                                                 formatMatch: function(row, i, max) {
                                                                 return row.htcode+" "+row.spname;                                                                 formatResult: function(row) {
                                                                 return row.htcode;
                                                                 }
                                                             });

</script>

suggect13 是要实现智能提示的控件id,minchars参数用来设定按下几个字符时开始有提示,autoFill设定是否将匹配的项自动填充的文本框中,fomatitem指定一个函数名,这个函数用来控制提示项的显示格式,formatMatch 设定你希望在哪些字段中搜索关健字,这里,我要按代码或名称搜索,所以要设定两个字段。formatresult 设定你选中项按回车后添加到文本框中的内容,stock是数据源,说到这个数据源也是大费了一翻周折,本来打算直接调用远程的数据,根据API上写的,直接写返回数据的页面名称就可以了,我做了页面,把需要的数据Response.Write()的,数据完全符合API上要求的格式,可是就是不成功,无语!看了官方的DEMO,又想到一个办法,把数据从数据库里面按JSONS格式导到一个文本文件中,再把这个文件改成.js的javascript文件,这样就可以在页面中直接调用了。到这里,Ajax调用工作算是完成。

二数据调整

由于要实现按股票名称的首字母来搜索,而数据库里只存了股票代码和股票名称(中文)两个字段,查了下,记录有一万多条,若要添加一个字段,然后根据股票名称一条条来输的话估计没有个个把星期弄不完,也没这么大耐心去做这样的事。想了下:是不是可以通过SQL直接来实现这个功能!真是是只有想不到,没有做不到,还真找到了网上的高人写的一个函数可以实现字段内容到首字母的转换,太神奇了!不过他写的函数除了把中文转成首字母,还把一些其它的字符也统一转成了a,这样可不好,于是做了点小小的修改,除了中文转成首字母,其它的如字符、数字之类的都保持原状。

又写了两个存储过程,用来将每天记录取出来调用转换函数转换,最后再添加到新一列中去。下面是用于实现的所有代码:两个存储过程,和一个自定义函数,本来都想用函数来实现,但在函数里不能使用 insert update之类的数据操纵语句。另外在存储过程中也使用了游标这种以前从来没用过的东西,呵呵,又长进了一点

--将中文转换成首字母的函数(这个真强)

create function fGetPy(@Str varchar(500)='')
returns varchar(500)
as
begin
 declare @strlen int,@return varchar(500),@ii int
 declare @n int,@c char(1),@chn nchar(1)
 select @strlen=len(@str),@return='',@ii=0 
 set @ii=0
 while @ii<@strlen
 begin
  select @ii=@ii+1,@n=63,@chn=substring(@str,@ii,1)
  if @chn>'z'
  select @n = @n +1,@c = case chn when @chn then char(@n) else @c end
  from(
   select top 27 * from (
    select chn = '吖'
    union all select '八'
    union all select '嚓'
    union all select '咑'
    union all select '妸'
    union all select '发'
    union all select '旮'
    union all select '铪'
    union all select '丌'
    --because have no 'i'
    union all select '丌'
    union all select '咔'
    union all select '垃'
    union all select '嘸'
    union all select '拏'
    union all select '噢'
    union all select '妑'
    union all select '七'
    union all select '呥'
    union all select '仨'
    union all select '他'
    union all select '屲' --no 'u'
    union all select '屲' --no 'v'
    union all select '屲'
    union all select '夕'
    union all select '丫'
    union all select '帀'
    union all select @chn
   ) as a
   order by chn COLLATE Chinese_PRC_CI_AS
  ) as b
 else set @c=@chn
  set @return=@return+@c
 end
 return(@return)
end

GO

 

 

存储过程一(根据ID值,调用上面的转换函数取得转换后的字符串后插入新字段):

 

存储过程二,用游标取每条记录的id及股票名称,循环调用上面的存储过程,将每一行的投股票名转换成首字母后插入到新字段中

 

最后,执行存储过程

EXEC INVOKE

GO

 

效果如下图所示,flag_one是我新加的一列,它的值就是从spname里通过以上三个函数转过来的