SQL 语句高手请进。 SORRY小弟 只有这45分了。

PBVC 2001-12-18 09:32:37
以下是一个"MRP需求计算"存储过程中的一段 , 你能看懂他做的是什么事情吗?

我最多只能提供这么多资料了(应该够了),希望你能看懂 HE HE ~~ 。昨晚害得我加班到两点 555~~~

DECLARE @PART_NO VARCHAR(15)
@OldPartNo VARCHAR(15)
re_Start:
DECLARE PART_CURSOR CURSOR FOR
SELECT PART_NO
FROM MRPLIST
OPEN PART_CURSOR
FETCH NEXT FROM PART_CURSOR INTO
@PART_NO
IF @@FETCH_STATUS <> 0 BEGIN
CLOSE PART_CURSOR
DEALLOCATE PART_CURSOR
GOTO Label_End
END
SELECT @OldPartNo = @PART_NO
FETCH NEXT FROM PART_CURSOR INTO
@PART_NO
WHILE (@@FETCH_STATUS = 0) BEGIN
--BOMLIST 用于存放产品 BOM 资料,格式和大部份 MRP 软件一样。
IF EXISTS(SELECT * FROM BOMLIST WHERE FATHER_NO = @PART_NO AND SON_NO = @OldPartNo) BEGIN
SELECT @OldPartNo = @PART_NO
END
FETCH NEXT FROM PART_CURSOR INTO
@PART_NO
END
CLOSE PART_CURSOR
DEALLOCATE PART_CURSOR
-- ...............
-- 得到 @OldPartNo 然后执行其它语句
GOTO re_Start
Label_End:

...全文
158 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyuzhe 2001-12-22
  • 打赏
  • 举报
回复
关注关注,upup
sunyuzhe 2001-12-22
  • 打赏
  • 举报
回复
关注关注,upup
PBVC 2001-12-22
  • 打赏
  • 举报
回复
--UP
yangkai_7749 2001-12-21
  • 打赏
  • 举报
回复
DECLARE @PART_NO VARCHAR(15)
@OldPartNo VARCHAR(15)
re_Start:
DECLARE PART_CURSOR CURSOR FOR
SELECT PART_NO
FROM MRPLIST
OPEN PART_CURSOR
FETCH NEXT FROM PART_CURSOR INTO
@PART_NO--先在mrplist里取出第一个part_no
IF @@FETCH_STATUS <> 0 BEGIN--如没有退出循环
CLOSE PART_CURSOR
DEALLOCATE PART_CURSOR
GOTO Label_End
END
--------这一段是找出第一个part_no的最高级Father_no,赋给@ordPartno
SELECT @OldPartNo = @PART_NO
FETCH NEXT FROM PART_CURSOR INTO
@PART_NO
WHILE (@@FETCH_STATUS = 0) BEGIN
--BOMLIST 用于存放产品 BOM 资料,格式和大部份 MRP 软件一样。
IF EXISTS(SELECT * FROM BOMLIST WHERE FATHER_NO = @PART_NO AND SON_NO = @OldPartNo) BEGIN
SELECT @OldPartNo = @PART_NO
END
FETCH NEXT FROM PART_CURSOR INTO
@PART_NO
END
CLOSE PART_CURSOR
DEALLOCATE PART_CURSOR
---------------------------
----这里的语句应该有删除mrplist的纪录的语句,或者有goto,return等语句,否则会死循环
-- ...............
-- 得到 @OldPartNo 然后执行其它语句
GOTO re_Start ---回到开头,在mrplist里取出第一个part_no
Label_End:


--我只能看出这么多了,如不行再多提供源码0
--你现在用什么email,或者你的电话,以后可能联系不上了
zhuzhichao 2001-12-21
  • 打赏
  • 举报
回复
这不就是struct的逆展么?
由叶子结点找到它的最初的祖先.

如果是我会用递归来做.
PBVC 2001-12-21
  • 打赏
  • 举报
回复
--UP
PBVC 2001-12-21
  • 打赏
  • 举报
回复

zhuzhichao(竹之草)(出关了…) 麻烦看看他最后到底做了什么 ?
zhuzhichao 2001-12-20
  • 打赏
  • 举报
回复
代碼是不是少了.
應該不止這些!

我肯定不會這麼寫.
處理不當會死循環.
PBVC 2001-12-20
  • 打赏
  • 举报
回复
--UP
bluepower2008 2001-12-19
  • 打赏
  • 举报
回复
说根节点是数据结构中树的概念,其实也可以这么理解,在BOMLIST表中存入了MRPLIST表中记录的父子关系,然后以BOMLIST表为依据,顺藤摸瓜,找到所有MRPLIST表的记录的祖宗。
在你补充将会对当前找出的根节点做上标志后,这个存储过程要做的事情就清楚了。
如果MRPLIST表中所有记录其实是链表结构的话,这个存储过程就是要依次从链头的记录开始到链尾为止进行处理,强调的是链表的逻辑顺序,如果是这样,其实可以先用BOMLIST表的关系生成一个临时表,整理出链表的顺序,然后再让MRPLIST表和临时表连接来打开游标,可以省去以上的查找过程。
如果是树状结构,就只能保证树中每一个分支都肯定是从上到下的顺序,但每个分支之间的处理就没有顺序性了。
小竹 2001-12-19
  • 打赏
  • 举报
回复
佩服各位的高见
!小弟学习了
PBVC 2001-12-19
  • 打赏
  • 举报
回复
谢谢 bluepower2008(蓝色力量) 

再 UP 一把
bluepower2008 2001-12-18
  • 打赏
  • 举报
回复
从以上的代码看,应该是如sky_blue(蓝天)所说,找到MRPLIST表中的所有根节点;
如果表中没有记录则退出;如果有一条记录,则该记录就是根节点;如果超过一条记录,则通过查看BOMLIST表来确定两个节点是否父子节点;如果是,则接着找当前节点的父节点的上级节点;如果不是,则继续找当前节点的父节点,最后找到某个根节点,对其进行处理;处理完毕,继续下一轮查找。
据我推断,应该在对当前找出的根节点进行处理的过程中,应该对MRPLIST表进行了修改,对处理过的根节点做上了标志或删除,不然GOTO re_Start会让程序进入死循环。
蓝天 2001-12-18
  • 打赏
  • 举报
回复
数据中是不是有父子关系?好像是要找到一个树型结构的根
蓝天 2001-12-18
  • 打赏
  • 举报
回复
感觉光标移动太多了?为什么?
PBVC 2001-12-18
  • 打赏
  • 举报
回复
-UP-
trouble 2001-12-18
  • 打赏
  • 举报
回复
UP-
PBVC 2001-12-18
  • 打赏
  • 举报
回复
-UP-
PBVC 2001-12-18
  • 打赏
  • 举报
回复
请问“根节点” 是什么, 麻烦详细点。

据我推断,应该在对当前找出的根节点进行处理的过程中,应该对MRPLIST表进行了修改,对处理过的根节点做上了标志或删除,不然GOTO re_Start会让程序进入死循环。

****** HE HE ~ 高手啊, ***************

以上我有注明:

-- 得到 @OldPartNo 然后执行其它语句,他得到 @OldPartNo 的确把 MRPLIST 做了标志。

实际定义游标语句如下。

DECLARE PART_CURSOR CURSOR FOR
SELECT PART_NO
FROM MRPLIST
WHERE 标志 = 1

******** 一句话 佩服 ----------------

不过该段语句做的事情,应该不是你们所说的那样.

HE HE ~~ 我还不知"根节点"是什么呢. 我也只是觉得罢了~

谢谢以上各位 !

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧