摘要:接着昨天的数据库的数据表的设计,今天叙述函数的设计。
在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.js的Node的时候就不用判断是否为第一个节点。下面是完整的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("../../p_w_picpaths/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>
打开页面之后并展开所有的节点,效果如下图所示:
今天就先到这里,明天接着讲述存储过程的设计,如果你能学到一些东西或者指出笔者的一些不足之处,笔者会十分高兴。
转载于:https://blog.51cto.com/tianli/42610