下面问题 用递归怎么做
现有2张表 产品和产品类别(无限极)
类别ID 类别名称 上级ID 类别编码
cid cname pid cencode
1 大类一 0 10
2 大类二 0 11
3 大类三 0 12
4 二级类 1 1001
5 三级类 4 100101
6 二级类 1 1002
7 三级类 4 100102
产品表
产品ID 产品名称 产品类别ID 产品编码
1 产品一 5 10010101
2 产品二 5 10010102
3 产品三 4 100101
4 产品四 4 100102
5 产品五 7 10010201
问题来了 ,现在我要修改产品类别信息.
比如把7号(三级类)修改为pid为1,包括其类别及其子类编码和相关别的产品编码都要随之改变:
呈现结果为:7号(三级类)编码为1003,产品五编码为100301
若把4号类别(二级类)的pid改为3,那么呈现结果为:5号(三级类)编码为120101 产品编码也随着改变
本人菜鸟 最好写出详细过程,谢谢大侠了
[解决办法]
写一个思路给你,我想简单的思路比完整的代码更有利于你学习:
LoadRoot()
{
data = select * from table where pid = 0
foreach (item in data)
{
treeview.Nodes.Add(item)
LoadSubItems(item, item.id)
}
}
LoadSubItems(Node node, id)
{
data = select * from table where pid = id
foreach (item in data)
{
node.Nodes.Add(item)
LoadSubItems(item, item.id)
}
}
[解决办法]
有一个规定,一个产品只能对应一个产品类别ID;
public void updateCode(string ID, string OldCode, string newCode)
{
string sql = "select * from leibie where pid = '"+ID+"'";
DataTable dt = new DataTable();
/* 运行以上sql拿出dt*/
if (dt.Rows.Count > 0)
{
foreach (DataRow dr in dt.Rows)
{
newCode = dr["cencode"].ToString().Replace(OldCode, newCode);
OldCode = dr["cencode"].ToString();
updateCode(dr["ID"].ToString(), newCode, OldCode);
}
}
else
{
sql = "update leibie set cencode='" + newCode + "' where id = '" + ID + "'";
//运行sql,更新类别code
sql = "update chanpin set 产品编码=REPLACE (产品编码," + OldCode + "," + newCode + ") where 产品类别ID = '" + ID + "'";
//运行sql,更新产品code
}
}
[解决办法]
1.你在设计数据库的时候把级联开启,用 NOUPDATE ACTION 什么的,他会自动跟新。
2.你在事物中利用 语句处理。
[解决办法]
操作步骤:(假设你要修改分类7,使其父分类为1)
1.确定你要修改的分类的直接父分类的CID 1;
2.找到父分类对应的编码(10);
3.确定新分类在其父分类的编号(也就是顺序号);实现方式:找到所有兄弟分类,由于你的分类编码是以两位定位分类中的一级,所以只要取出兄弟分类编码的最后两位(一个整数),把你的分类编码中的后两位确定为兄弟分类中后两位的最大值+1;(数据中兄弟分类为1001,1002,所以分类7的后两位为03),所以7的分类编码=父分类编码+加入的次序 =1003;
4.修改子分类(根据你的编码规律可知:分类a为分类b的子分类<=>b的分类编码以a开头且长度比a长),因此你只需把所有分类编码中已你以前的分类编码为前缀的分类编码的前缀替换为修改后的分类编码(在例子中你只要把所有以100102为前缀的编码修改为1003,产品中也一样)
上面的步骤可以sql语句实现应该不难。