如何用DH6.0开发ERP系统所需要的BOM结构报表?(200分)

  • 主题发起人 主题发起人 rubyrobin
  • 开始时间 开始时间
R

rubyrobin

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
我正在开发一个ERP下的BOM报表,用了ReportBuilder来开发,因为需要将BOM结构
层层展开,需要用到递归算法,而ReportBuilder使用数据管道来传递数据,如何实现?
或者不用ReportBuilder,请提供其他方法。不胜感激!
因为小弟初上论坛,money不够,暂时奉上200,以后又了积分,定当追加报酬!
 
是不是分数不够啊?也许重赏之下才出勇夫
 
首先利用存储过程将需要的BOM数据取出来,放到一个Query里
然后用RB显示。要知道报表是一个显示
层,不是运算层。
 
但是在存储过程里怎样用递归?我希望只用到一个存储过程,因为RB只能接受一个数据集
 
兄台,我不知道你们的BOM是如何维护的?
参数:产品代码(部件、零件)
在一个无限循环中,查找父项与结果集相同的子项,然后用子项作结果集,
这样循环下去,直到没有子项
 
是这样递归没有错,用存储过程也没有错,昨天我试出来不用存储过程也可以实现,在RB中
多层嵌套就可以实现了。
 
ORACLE有句子可搞定!
 
用存储过程将数据取出并排列成树状,然后直接打印即可
这是一个打印树形类别的存储过程,同样可以打印BOm
--这代码可能不适合,但可以分析出存储过程处理树形
结构数据表的思路

参数:
@TypeTable nvarchar(50) 表名称
@FatherKey nvarchar(30), 父Key
@ChildKey nvarchar(30), 子Key
@RootKey nvarchar(50) 起始节点

CREATE PROCEDURE uspGetTypeTree
@TypeTable nvarchar(50),
@FatherKey nvarchar(30),
@ChildKey nvarchar(30),
@RootKey nvarchar(50)
AS
DECLARE
@CCount INT,
@FTypeId nvarchar(20),
@CTypeId nvarchar(20),
@NodeKey nvarchar(200),
@cmd nvarchar(200),
@SubNodeKey int,
@Shape1 nvarchar(1),
@Shape2 nvarchar(1),
@Shape3 nvarchar(1),
@Shape4 nvarchar(1),
@Shape5 nvarchar(1)


SELECT @Shape1='│'
SELECT @Shape2='─'
SELECT @Shape3='├'
SELECT @Shape4='└'
SELECT @Shape5=' '


SET NOCOUNT ON

CREATE TABLE #Model(FTypeId nvarchar(20), Nodekey nvarchar(200) )
CREATE TABLE #Part (CTypeId nvarchar(20), Nodekey nvarchar(200) )
CREATE TABLE #Last (TypeId nvarchar(20), Nodekey nvarchar(200) )
CREATE TABLE #CCC (CCC int)
Insert Into #Model Values (@RootKey,'0000')
Insert Into #Last Values (@RootKey,'0000')



WHILE Exists(SELECT * FROM #Model)
begin
--取某节点的下级结构,存入#Part
DELETE FROM #Part
DECLARE curModel CURSOR FOR Select * From #Model
Open curModel
FETCH curModel INTO @FTypeId,@NodeKey
WHILE @@FETCH_STATUS =0
begin
SELECT @cmd='Select '+@ChildKey+','''+@NodeKey+''' From '+@TypeTable+' WHERE '+@FatherKey+'='''+@FTypeId+''''

INSERT INTO #Part Execute(@cmd)
FETCH curModel INTO @FTypeId,@NodeKey
END

CLOSE curModel
DEALLOCATE curModel
DELETE FROM #Model
Select @SubNodeKey=0
--判断#Part 中的节点有无下级节点
DECLARE curPart CURSOR FOR Select * From #Part
Open curPart
FETCH curPart INTO @CTypeId,@NodeKey
WHILE @@FETCH_STATUS =0
begin
SELECT @SubNodeKey=@SubNodeKey+1
select @cmd='SELECT Count(*) As CCC FROM '+@TypeTable+' WHERE '+@FatherKey+'='''+@CTypeId+''''
Delete From #CCC
insert into #ccc Execute(@cmd)
Select @cCount=ccc from #ccc
IF @ccOUNT=0
begin
--无下级节点 存入#LAst
INSERT INTO #Last VALUES (@CTypeId,@NodeKey+Right('000'+ltrim(rtrim(str(@subNodeKey))),4))
END
else
begin
--有下级节点,将该节点转入#Model,#Last
INSERT INTO #Model VALUES (@CTypeId,@NodeKey+Right('000'+ltrim(rtrim(str(@subNodeKey))),4))
INSERT INTO #Last VALUES (@CTypeId,@NodeKey+Right('000'+ltrim(rtrim(str(@subNodeKey))),4))
END
FETCH curPart INTO @CTypeId,@NodeKey
END
CLOSE curPart
DEALLOCATE curPart


END

--画一棵树
SELECT replicate(@Shape5,300) as Header, * Into #Last2 From #Last Order By NodeKey
DECLARE curLast CURSOR FOR Select NodeKey From #Last2 ORDER BY Nodekey DESC
OPEN curLast
FETCH curLast Into @NodeKey
WHILE @@fetch_status=0
begin
Update #Last2 Set Header=SUBSTRING(Header,1,len(@NodeKey)-1)+@Shape1+replicate(@shape5,200)
WHERE NodeKey<@NodeKey AND NodeKey>SUBSTRing(@Nodekey,1,Len(@NodeKey)-4)
Update #Last2 Set Header=SUBSTRING(Header,1,len(@NodeKey)-1)+(Case SUBSTRING(Header,len(@NodeKey),1)
when @Shape1 then
@shape3
WHEN @Shape5 then
@shape4
else
@shape4
end )+Replicate(@shape2,4)
WHERE NodeKey=@NodeKey

FETCH curLast Into @NodeKey
END
CLOSE curLast
DEALLOCATE curLast
Update #last2 set Header=replicate(@shape5,6) where Nodekey='0000'
SELECT rtrim(substring(header,8,255))+ltrim(rtrim(typeid)) as tree,*,0.000 aS tOTmONEY,0.000 As TotQty,0.000 As AvPrice FROM #Last2


 
我有个例子可以给你,给我你的Email .
 
谢谢glhglhglh,你提供了实现的思想。但是我的boss希望得到的不是树型报表,因为其中
还涉及到采购供应厂商的分类。
 
我的mail是rubyrobin@sina.com,谢谢!
 
我的例子也是采购供应商,BOM相关的例子,我已经发给你了,如果满意,给分啦!
 
OK,用frankfang的例子很好的解决了我的问题,谢谢!
glhglhglh,谢谢你的例子,奉上50分,请不要介意!
 
后退
顶部