没有数据,没有经过测试,到时候再测试,先提提意见
CREATE PROCEDURE PROC_PRODUCTRATE
@ID INT,--产品对应的自编编号
@ENID INT,--环境自增编号
@SOURCEID INT--数据源 GJB299B或美军标
--@PRODUCT_RATE FLOAT --返回产品的失效率
AS
DECLARE
@ATTR INT, --0输入值 1--自动计算值
@KIND INT, --0系统 1-组件 2-元器件
@IID INT, --对应的自增编号
@SUBID INT,--元器件对应的自增编号
@BASERATE DECIMAL(10,3), --基本失效率
@NUM INT, --元器件数目
@TOTALRATE DECIMAL(10,3), --总失效率
@COUNT INT, --门数,位数
@QXS FLOAT, --质量系数,直接得出数值
@G FLOAT,--通用失效率
@RATE FLOAT,--失效率
@TEMPVALUE FLOAT,--临时变量
@VALUE FLOAT
SET @VALUE=NULL
--参数id为不存在的情况
--IF (@ID IS NULL )or(@ENID IS NULL)OR(@SOURCEID IS NULL) RETURN 0
SELECT * FROM TABLERELATION WHERE ID=@ID
--如果没有一条记录
IF @@ROWCOUNT=0
RETURN 0
--不需要计算的情况,直接写入的数据,可能为组件级别,也可能为元器件级别
SELECT @NUM=ISNULL(QUANTITY,1),@TOTALRATE=ISNULL(TOTALFAILURERATE,0),@SUBID=SUBKIND,
@QXS=ISNULL(QUALITY,0),@COUNT=ISNULL(DIGIT,0),@KIND=ISNULL(GRADE,2),@BASERATE=BASFAILURERATE
FROM TABLERELATION WHERE ID=@ID and FAILUREATTR=1
RETURN @TOTALRATE
--定义游标选出所有子节点
DECLARE CUR_PARENT CURSOR FOR
SELECT ID--, BASFAILURERATE,QUANTITY,TOTALFAILURERATE,FAILUREATTR,QUALITY,GRADE,SUBKIND
FROM TABLERELATION WHERE PID=@ID
--打开游标,选取第一条
OPEN CUR_PARENT
FETCH NEXT FROM CUR_PARENT INTO @IID--,@BASERATE,@NUM,@TOTALRATE,@ATTR,@QXS,@KIND,@SUBID
IF @@FETCH_STATUS<>0
BEGIN
RAISERROR 50002 '打开游标错误'
return -10
END
--循环查找子节点
WHILE @@FETCH_STATUS<>-1
BEGIN
--如果还有子节点,递规调用
IF (@@FETCH_STATUS<>-2)
BEGIN
EXEC @TEMPVALUE=PROC_PRODUCTRATE @IID,@ENID,@SOURCEID--,@PRODUCT_RATE
SET @VALUE=@VALUE+@TEMPVALUE
END
--取下一条记录
FETCH NEXT FROM CUR_PARENT INTO @IID--,@BASERATE,@NUM,@TOTALRATE,@ATTR,@QXS,@KIND,@SUBID
END
--关闭游标,释放游标
CLOSE CUR_PARENT
DEALLOCATE CUR_PARENT
IF @VALUE IS NOT NULL
BEGIN
--更新对应的产品数据库的组件和系统部分
UPDATE TABLERELATION
SET BASFAILURERATE= @VALUE,
TOTALFAILURERATE=@VALUE*ISNULL(QUANTITY,1)
FROM TABLERELATION WHERE ID=@ID
SET @VALUE=@VALUE*(SELECT ISNULL( QUANTITY,1) FROM TABLERELATION WHERE ID=@ID)
RETURN @VALUE
END
ELSE BEGIN
--取出对应的属性0--输入1--自动计算,数量,累计故障率,对应的元器件编号,质量系数,门数,级别,故障率
SELECT @ATTR=ISNULL(FAILUREATTR,1),@NUM=ISNULL(QUANTITY,1),@TOTALRATE=ISNULL(TOTALFAILURERATE,0),@SUBID=SUBKIND,
@QXS=ISNULL(QUALITY,0),@COUNT=ISNULL(DIGIT,0),@KIND=ISNULL(GRADE,2),@BASERATE=BASFAILURERATE
FROM TABLERELATION WHERE ID=@ID
IF @ATTR=0--如果是输入的值
RETURN @TOTALRATE
ELSE BEGIN
--通过查表求出通用失效率
SET @G=(SELECT FRATE_G FROM TABLEFAILURERATE WHERE SUBKINDID=@SUBID AND
ENID=@ENID AND DATASOURCEID=@SOURCEID AND @COUNT>= ISNULL(MINCOUNT,0)
AND @COUNT<=ISNULL(MAXCOUNT,0))
SET @RATE=ISNULL(@QXS*@G,0)
--如果不是元器件,但又是最后一级,因为计算结果肯定为0,保留原来的数值
IF (@BASERATE>0)AND(@RATE=0) --AND(@KIND<>2 ) 不管组件还是元器件如果为0都保留原来的值
BEGIN
SET @RATE=@BASERATE
END
--更新对应的产品数据库的元器件/组件部分--最后一层节点
UPDATE TABLERELATION
SET BASFAILURERATE=@RATE,
@TOTALRATE=TOTALFAILURERATE=(@RATE*@NUM)
WHERE ID=@ID
RETURN @TOTALRATE
END
END
GO