| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1710 人关注过本帖
标题:一对多关系的问题求助
只看楼主 加入收藏
nioyu
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2015-9-18
收藏
得分:0 
怎么编码?这是通用问题,只要解决一种产品就可以了
2015-10-15 11:24
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
获取节点路径,有了路径就好办。
程序代码:
CREATE CURSOR 路径表 (路径 C(240))
INDEX on 路径 TAG 路径
CREATE CURSOR 表b (xh I, id1 I, id2 I, th C(20), mc C(20))
INSERT INTO 表b VALUES (1, 1, 0, "YC1291-3序3", "扁钢")
INSERT INTO 表b VALUES (2, 1, 0, "YC1291-4", "扣紧件")
INSERT INTO 表b VALUES (3, 0, 1, "YC1291-4序1", "斜片")
INSERT INTO 表b VALUES (4, 0, 1, "YC1291-4序2", "钢管")
INSERT INTO 表b VALUES (5, 0, 2, "YC1291-5", "扁钢")
INSERT INTO 表b VALUES (6, 0, 2, "YC1291-6", "圆钢")
INSERT INTO 表b VALUES (7, 0, 6, "YC1291L-4", "扣紧件")
INSERT INTO 表b VALUES (8, 0, 7, "YC1291L-4序", "斜片")
INSERT INTO 表b VALUES (9, 0, 6, "YC1291Y-1", "外门框")
INSERT INTO 表b VALUES (10, 0, 9, "YC1291Y-1序3", "钢板")
SCAN
    INSERT INTO 路径表 VALUES (取路径("表b", 表b.xh))
ENDSCAN
SELECT 路径表
GO TOP 
BROWSE

FUNCTION 取路径(c树型表, nID)
    LOCAL c路径, nRec
    c路径 = ""
    SELECT (c树型表)
    IF BETWEEN(nID, 1, RECCOUNT())
        nRec = nID
        GO nID
        c路径 = TRANSFORM(xh)
        nID = id2
        DO WHILE (nID > 0)                                        && 遍历父ID
            GO nID
            c路径 = TRANSFORM(xh) + "\" + c路径
            nID = id2
        ENDDO
        GO nRec
    ENDIF
    RETURN c路径
ENDFUNC
2015-10-15 11:38
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
这样好看点
程序代码:
CREATE CURSOR 路径表 (路径 V(240))
INDEX on 路径 TAG 路径
CREATE CURSOR 表b (xh I, id1 I, id2 I, th C(20), mc C(20))
INSERT INTO 表b VALUES (1, 1, 0, "YC1291-3序3", "扁钢")
INSERT INTO 表b VALUES (2, 1, 0, "YC1291-4", "扣紧件")
INSERT INTO 表b VALUES (3, 0, 1, "YC1291-4序1", "斜片")
INSERT INTO 表b VALUES (4, 0, 1, "YC1291-4序2", "钢管")
INSERT INTO 表b VALUES (5, 0, 2, "YC1291-5", "扁钢")
INSERT INTO 表b VALUES (6, 0, 2, "YC1291-6", "圆钢")
INSERT INTO 表b VALUES (7, 0, 6, "YC1291L-4", "扣紧件")
INSERT INTO 表b VALUES (8, 0, 7, "YC1291L-4序", "斜片")
INSERT INTO 表b VALUES (9, 0, 6, "YC1291Y-1", "外门框")
INSERT INTO 表b VALUES (10, 0, 9, "YC1291Y-1序3", "钢板")
SCAN
    INSERT INTO 路径表 VALUES (取路径("表b", 表b.xh))
ENDSCAN
SELECT 路径表
GO TOP 
*BROWSE
SCAN
    名称 = ""
    FOR i = 1 TO ALINES(a路径, ALLTRIM(路径表.路径), "\")
        nRec = VAL(a路径[i])
        GO nRec IN "表b" 
        名称 = 名称 + "\" + a路径[i] + ALLTRIM(表b.mc)
    ENDFOR
    ? 名称
ENDSCAN

FUNCTION 取路径(c树型表, nID)
    LOCAL c路径, nRec
    c路径 = ""
    SELECT (c树型表)
    IF BETWEEN(nID, 1, RECCOUNT())
        nRec = nID
        GO nID
        c路径 = TRANSFORM(xh)
        nID = id2
        DO WHILE (nID > 0)                                        && 遍历父ID
            GO nID
            c路径 = TRANSFORM(xh) + "\" + c路径
            nID = id2
        ENDDO
        GO nRec
    ENDIF
    RETURN c路径
ENDFUNC
2015-10-15 11:49
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
子父关系,用递归函数,我记得,我10年前学PHP玩的时候,学人家搞论坛程序,就是用到子父关系,用递归把所以的贴子显示出来。不过,这么久,忘记了。
其实,你这个表,只用1个表就可以了,不需要用2个表。
如表1,几个关键字段
序号,子ID,父ID,产品名称,,,,,
数据关系如下
序号  子ID   父ID   产品名称
1    A001   0      苹果6
2    A002   0      苹果5
3    A003   A001   苹果6电池
4    A004   0      DELL 230电脑
...
这样, 父ID=0的是最上层,通过他来浏览
2015-10-15 12:01
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
参考行政区划代码编码规则即可

坚守VFP最后的阵地
2015-10-15 12:17
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
是啊
浏览所有数据,现在估计不用递归函数了,因为有 ORDER BY,,
2015-10-15 12:27
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:1 
以下是引用nioyu在2015-10-15 10:30:32的发言:

做了一个树形图在附件里,可能能看明白意思吧
楼主,恕我直言,你表B的数据设计有问题:看你截图里数据的意思,id1为空,而id2有数据的,应该属于同一个id1里的子部件,是吧?(如果我猜错了,就不要再看下去了,因为后面都是基于这种猜测) 如果是这样的话,请在这些记录的id1字段中全部填上相应的数据。比如:你截图里第3~10记录的id1全部填1;同样的,扁钢和扣紧件的id2应填充0,表示它们不是子部件。如此处理的话,你的代码就应该不难写了。

想来想去,可能上面的话还是没完全说清楚,再补充几条:
1、你表B现在设计数据的样式有点类似于最终表的格式,相同的数据省略。其实,很多人都会搞不清“源”数据和“最终”数据的区别。数据表文件应该设计成“源”数据格式,而不是最终表格式。

2、表B中的id1字段用来与表A中的id1对应,表示这些子部件组成了哪个总部件;而id2字段是用来表示这个子部件是第几层次的。所以,作为“源”表数据,应该像我上面说的那样,表B中每条记录的id1和id2字段内容都不能省略数据。

3、你要设计的代码最终形成的表应该是下面酱紫的(我个人的想法哦,你可以不按这个结构):
   其中:部件代码就是id1、部件代号就是表A的TH字段、部件名称就是表A的MC字段、子部件层次就是表B的id2、子部件名称就是表B的MC字段。最终表按部件代码为第一关键字、子部件层次为第二关键字索引(全升序)
   部件代码    部件代号    部件名称    子部件层次    子部件名称
      1           DR-1       吊耳           0          扁钢
      1           DR-1       吊耳           0          扣紧件
      1           DR-1       吊耳           1          斜片
      1           DR-1       吊耳           1          钢板1
     ... ...

不知道补充的这些啰里八嗦的话是否能帮到你。


[ 本帖最后由 taifu945 于 2015-10-15 15:12 编辑 ]
2015-10-15 14:50
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
表b应该是一种树型数据表,主要关系是xh(ID)与id2(父ID),每条记录就是一个“节”,处理这种数据关键是“路径”。
2015-10-15 15:27
nioyu
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2015-9-18
收藏
得分:0 
回复 27楼 taifu945
谢谢你的回复!表b的id1是与表a关联的,是表a相应id1的子部件,是一个层级关联的关系
2015-10-16 08:04
nioyu
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2015-9-18
收藏
得分:0 
回复 28楼 吹水佬
感谢您的回复!我昨天又想了一种办法,将表b的id2升序排序,然后从最末记录往前遍历,遍历一条在另外最终表里写一条,这样可以解决顺序遍历不知多少层的问题。
2015-10-16 08:08
快速回复:一对多关系的问题求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022325 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved