OldFatherID,以及重新计 算的满足位编码要求的相应编号 NewID、NewFatherID。 程序如下: <% REM oConn---数据库连接,已经打开 REM OldFather---原来的父类编号 REM NewFather---新的父类编号 REM N---编码总位数 REM Ni--每一级的编码位数数组 REM Level--当前的级数 sub FormatAllID(oConn,OldFather,NewFather,N,Nm,Ni byref,Level) strSQL = "select CatalogID , FatherID from Catalog where FatherID=" &; OldFather set rsCatalog=oConn.Execute( strSQL ) j = 1 do while not rsCatalog.EOF i = 2 ^(N - Nm) * j if Level then i= i + NewFather OldCatalog = rsCatalog("CatalogID") NewCatalog = i REM 写入
临时表 strSQL = "Insert into TempCatalog (OldCatalogID , NewCatalogID , OldFatherID , NewFatherID)" strSQL = strSQL &; " values(" &; OldCatalog &; " , " &; NewCatalog &; " , " &; OldFather &; " , " &; NewFather &; ")"
Conn.Execute strSQL REM 递归调用 FormatAllID Nm = Nm + Ni(Level+1) FormatAllID oConn,OldCatalog , NewCatalog ,N,Nm,Ni,Level + 1 rsCatalog.MoveNext j = j+1 loop rsCatalog.Close end sub %> 调用这个算法的一个例子如下: <% REM 定义编码参数,其中 N 为总位数,Ni 为每一级的位数。 Dim N,Ni(5) Ni(1) = 4 N = Ni(1) for i=2 to 5 Ni(i) = 7 N = N + Ni(i) next REM 打开数据库,创建临时表 strSQL = "Create TempCatalog( [OldID] [int] NOT NULL, [NewID] [int] NOT NULL,
[OldFatherID] [int] NOT NULL, [NewFatherID] [int] NOT NULL);" Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open Application("strConn") Conn.Execute strSQL REM 调用规格化例程 FormatAllID Conn,-1,-1,N,Ni(1),Ni,0 REM -----------------------------------------------------------------------REM 在此处更新所有相关表的类别编码为新的编码即可。 REM -----------------------------------------------------------------------REM 关闭数据库 strSQL= "drop table TempCatalog;" Conn.Execute strSQL Conn.Close %> 第四个问题 现 在我们回头看看第四个问题:怎样得到某个分类下的所有产品。由于采用了位编码,现在 问题变得很简单。我们很容易推算:某个产品属于某个类别的条件是 Product.FatherID&; (Catalog.ID 的特征码)=Catalog.ID。其中“&;”代表位与算法。这在 SQL Server 中是直 接支持的。 举例来说:产品所属的类别为:1092787200,而当前类别为 1092780032。当前类别对应的特 征 值 为 : 4294950912,由 于 1092787200&;4294950912=8537400 , 所以 这 个产 品 属 于 分类 8537400。 我们前面已经给出了计算特征码的公式。特征码并不多,而且很容易计算,可以考虑在 Global.asa 中 Application_OnStart 时间触发时计算出来,存放在 Application(“Mark”) 数组中。 当 然, 有了特征码, 我们还可以得到更加有效率的算法。 我们知道, 虽然我们采用了位编码, 实际上还是一种顺序编码的方法。 表现出第 I 级的分类编码肯定比第 I+1 级分类的编码要小。
根据这个特点,我们还可以由 FID 得到两个特征码,其中一个是本级位特征码 FID0,一个是 上级位特征码 FID1。而产品属于某 个分类 FID 的充分必要条件是: Product.FatherID>FID0 and Product.FatherID 下面的程序显示分类 FID 下的所有产品。 由于数据表 Product 已经对 Fath