且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

走近复杂数据库计算型软件的设计与制作(4)—函数的设计

更新时间:2022-09-20 17:13:02

摘要:接着昨天的数据库的数据表的设计,今天叙述函数的设计。
MSSQL中函数的概念和普通的函数的概念有点类似,可以有参数或者没有参数,并且有返回值或者没有返回值,如果对于MSSQL中的函数不是十分了解,建议看一下MSSQL自带的帮助文档,那里面讲述的很明白,如果还不明白,请发信息给我。
在这个程序中,使用到的函数只有一种类型的,就是返回一张包含树形结构信息的表。在上一节的最后描述了这里的函数所使用的视图,即树形结构中包含每个节点信息的视图,以matrixGraph_view视图对应的函数为例,首先描述一下设计的思想。函数传递一个参数S_ID作为根节点,向返回的表中插入根节点的信息,然后依次查找下级的6层节点,每查找一层,都要把相应的信息插入到需要返回的表中,并更新当前已经查找的层数,最终的程序出口是@level=6,循环结束。之后便可以把函数作为一个普通的表或者视图使用,相应的函数如下所示:
create   function getMatrixGraphData(@S_ID int,@level int)returns @ltable table (s_id int,ps_id int,level int,m_id char(30),flag tinyint,result char(30),position int)
as
begin
       declare @cur_level int
       set @cur_level = 0
       insert into  @ltable(s_id,ps_id,level,m_id,result,flag,position) –初始化表
       select @s_id,0,0,m_id,result,enabled,position   ----这里的ps_id设置为0
       from matrixGraph_view
       where s_id=@s_id
      
       set @cur_level = @cur_level + 1
       while @cur_level<=@level
       begin
              insert into  @ltable(s_id,ps_id,level,m_id,result,flag,position)
              select s_id,ps_id,@cur_level,m_id,result,enabled,position
              from matrixGraph_view s        ---定义的视图
              where s.ps_id in (select s_id from @ltable)
                     and s.s_id not in (select s_id from @ltable)  --选择下级节点的条件                                 
               set @cur_level = @cur_level + 1 –导致循环结束的语句
       end
        return
end
go
整个函数没有特别之处,下面介绍一下相应的ASP代码,由于时间的紧迫性,这个项目只要使用ASP开发了,如果有时间我会做成Struts+Spring+Hibernate的。
Asp代码中首先是打开数据库的连接,构造SQL查询语句,执行查询并返回结果到记录集中,然后输出。程序中使用MzTreeView10.js来显示树形结构,MzTreeView10.js要求根节点的上一级节点为,即有aa_0这样的形式,aa代表当前节点,0代表上一级节点,在函数中直接把根节点的上一级节点设置为0,在输出MzTreeView10.jsNode的时候就不用判断是否为第一个节点。下面是完整的Script内部的内容:
<SCRIPT LANGUAGE="JavaScript">
    <!--
    window.tree = new MzTreeView("tree");    
       tree.icons["folder1"]  = "persons1.gif";
       tree.icons["folder0"]  = "persons0.gif";      
       tree.iconsExpand["folder1"] = "persons1.gif";
       tree.iconsExpand["folder0"] = "persons0.gif";
      
    tree.iconsExpand["book"] = "bookopen.gif"; //展开时对应的图片
    tree.setIconPath("../../images/tree/"); //可用相对路径
<%
       sql = "select * from "&funcs&" ( "&s_id&" ,"&level&")"
       'response.Write(sql)
       'response.End()
       set rs = conn.execute(sql)         
       do while not rs.eof       
              rm_id=trim(rs("ps_id"))
              m_id=trim(rs("s_id"))
              position=rs("position")
              flag=trim(rs("flag"))
              node = VBCrLf &"    tree.nodes["""& rm_id &"_"&m_id &"""] = """
              node = node &"text:"&trim(rs("result")) &";icon:folder"&flag&";hint:队列排序:"&position&";"                                               
              response.write node &"""" '生成节点信息
              rs.movenext
         loop
 rs.close
 set rs=nothing
conn.close()
set conn = nothing
%> 
       obj=document.getElementById("tree");
       obj.innerHTML = tree.toString();
       tree.expandAll = function()
          {
            var d = new Date().getTime();
            MzTreeView.prototype.expandAll.call(this);
            alert("全部展开耗时 = "+ (new Date().getTime()-d) +
            毫秒!\r\n有效节点总数 = "+ (this.index));
          }
       tree.expandAll();
-->
</script>
打开页面之后并展开所有的节点,效果如下图所示:
走近复杂数据库计算型软件的设计与制作(4)—函数的设计
今天就先到这里,明天接着讲述存储过程的设计,如果你能学到一些东西或者指出笔者的一些不足之处,笔者会十分高兴。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/42610如需转载请自行联系原作者

lili00okok