求:关于在SQL SERVER 根据公式表更新表记录的做法(50分,我只有这么多了)

jxzhong2000 2008-07-08 05:28:59
有主表记录如下:
itemid company period amount
1001 07750 2008 855 --键盘输入
1002 07750 2008 863 --键盘输入
1003 07750 2008 ------ 需要根据用户定义的公式来更新此记录字段
1004 07550 2008 ------ 需要根据用户定义的公式来更新此记录字段
现在我建立一个公式表

itemid formula
1003 ('1001'+'1002')/2 那么1003 对应的数量是:(855+863)/2
1004 '1002'-'1001' 那么1004 对应的数量是:863-855
主表记录数是不定的,但是可以通过变量传入,怎么来写这样的一个存储过程?
不要写死的,因为公式是由用户定义的,希望能作成动态的。
不知道描述得清楚不。
...全文
154 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxzhong2000 2008-07-08
  • 打赏
  • 举报
回复
insert into tb_formula
select '2005','[1001]+[1002]+[1004]'
jxzhong2000 2008-07-08
  • 打赏
  • 举报
回复
因为科目代码有可能全部是数字,编写公式时候,记得加[]标记,不然会出错.
另外,这个代码应该还可以优化一下,因为@SQL(8000)如果总表中的科目很
多时候,会可能溢出,可以再缩小搜寻的范围.明天开专题会应该可以塞住用
户嘴巴了.
jxzhong2000 2008-07-08
  • 打赏
  • 举报
回复
最后写成存储过程,问题解决,希望给大家一个参照
CREATE PROCEDURE BMS_BUSINESS_UPDATEBYFORMULA 
(
@COMPCODE NVARCHAR(5)
,@PERIOD NVARCHAR(4)
)
AS
BEGIN
SET NOCOUNT ON;
declare @code varchar(300),@sql varchar(8000),@fid varchar(300)
declare tc cursor for select fid from tb_formula
open tc
fetch next from tc into @fid
while @@fetch_status=0
begin
select @code=formula from tb_formula where fid=@fid
set @sql=''
select @sql=@sql+',['+itemid+']=max(case itemid when '''+itemid+''' then planamount end)' from tb_plan where compcode=@COMPCODE and period=@PERIOD
set @sql='update tb_plan set planamount=(select '+@code+' from (select '+stuff(@sql,1,1,'')+' from tb_plan where compcode='''+@COMPCODE+''' and period='''+@PERIOD+''' ) t)'
set @sql=@sql+'where compcode='''+@COMPCODE+''' and period='''+@PERIOD+''' and itemid='''+@fid+''''
exec(@sql)
fetch next from tc into @fid
end

close tc
deallocate tc
END
-狙击手- 2008-07-08
  • 打赏
  • 举报
回复
实现了就好....
jxzhong2000 2008-07-08
  • 打赏
  • 举报
回复
declare @code varchar(30),@sql varchar(8000)

declare tc cursor for select formula from tb_formula

open tc

fetch next from tc into @code

while @@fetch_status=0
begin
set @sql=''
select @sql=@sql+',['+itemid+']=max(case itemid when '''+itemid+''' then planamount end)' from tb_plan where compcode='04770' and period='2008'
select @sql
set @sql='select '+@code+' from (select '+stuff(@sql,1,1,'')+' from tb_plan where compcode=''04770'' and period=''2008'' ) t'
select @sql
exec(@sql)

fetch next from tc into @code
end

close tc
deallocate tc
jxzhong2000 2008-07-08
  • 打赏
  • 举报
回复
参照大乌龟先生的给出的例子,基本实现了公式的计算.希望大家再多
insert into tb_formula
select '1003','[1001]+[1002]'
go

declare @code varchar(30),@sql varchar(8000)
declare tc cursor for select formula from tb_formula

open tc

fetch next from tc into @code

while @@fetch_status=0
begin
set @sql=''
select @sql=@sql+',['+itemid+']=max(case itemid when '''+itemid+''' then planamount end)' from tb_plan where compcode='07750' and period='2008'
select @sql
set @sql='select '+@code+' from (select '+stuff(@sql,1,1,'')+' from tb_plan where compcode=''04770'' and period=''2008'' ) t'
select @sql
exec(@sql)

fetch next from tc into @code
end

close tc
deallocate tc
jxzhong2000 2008-07-08
  • 打赏
  • 举报
回复
补充一点:
公式的长度是不定的,因为这是一个统计科目表,楼上兄弟辛苦了,有点思路,继续,不要写死了.
因为有的科目是通过若干科目计算得出的.我明天开会和用户部门看能否改变他们统计的口径,
我个人感觉这样的科目设置是不合理的,但现实是这样,有点恼火
lingweixuan 2008-07-08
  • 打赏
  • 举报
回复
鍵億建公式表如下
itemid formula Param1 Param2
1003 (Param1 +Param12)/2 1001 1002

插入記錄可以直接插入1001,1002,和公式
這樣就可以動態計算了

大致算法如下,自己可以嘗試寫寫

select @formula=formula  from F where itemid=@itemid

select @formula=replace(@formula,‘Param1’,cast(t.Amount as varchar(10))
from F inner join t on F.Param1=t.itemid
where f.itemid=@itemid

select @formula=replace(@formula,‘Param2’,cast(t.Amount as varchar(10))
from F inner join t on F.Param2=t.itemid
where f.itemid=@itemid

select @sql='update t
set amount ='+@formula
+'where t.Itemid='''+@itemid+''''
exec @sql
jxzhong2000 2008-07-08
  • 打赏
  • 举报
回复
主表记录数是不定的,但是可以通过变量传入公司代码以及期间

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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