`
逆风的香1314
  • 浏览: 1416276 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义公式的计算处理

阅读更多

原帖地址:
http://community.csdn.net/Expert/topic/3485/3485588.xml?temp=.8813745

--示例数据
create table sale(date datetime,code varchar(10),amt int)
insert sale select '2004-10-22','aa',15000
union  all  select '2004-10-22','bb',18000
union  all  select '2004-10-22','cc',20000
union  all  select '2004-10-23','aa',21000
union  all  select '2004-10-23','bb',18500
union  all  select '2004-10-23','cc',19600

create table dept(code varchar(10),name varchar(10))
insert dept select 'aa','中餐厅'
union  all  select 'bb','西餐厅'
union  all  select 'cc','客房部'
union  all  select 'dd','KTV部'

create table cost(date datetime,code varchar(10),amt int)
insert cost select '2004-10-22','aa',5000
union  all  select '2004-10-22','bb',7000
union  all  select '2004-10-22','cc',11000
union  all  select '2004-10-23','aa',12000
union  all  select '2004-10-23','bb',8500
union  all  select '2004-10-23','cc',9600

create table means(code varchar(10),seq int,[desc] varchar(10),formula nvarchar(4000))
insert means select 'aa',1,'销售收入','^sale@amt^'
union  all   select 'aa',2,'销售成本','^cost@amt^'
union  all   select 'aa',3,'上交利润','([1] - [2])*0.3'
union  all   select 'aa',4,'净利润'  ,'[1]-[2]-[3]'
go

/*--问题处理要求描述

 写一个计算的存储过程,完成根据各基础资料及计算方法,将数据放到利润明细表中!

 如用户输入的查询条件是部门代号aa(@code),日期为:2004-10-22(@date)

 则处理过程如下,
 1:从利润计算方法表(means)读取code = aa到临时表
   select * into #temp from means where code = @code order by seq

 2:用游标循环处理每一个项目,按seq从小到大的顺序,如第一个项目
   insert into gain_detail(code,date,desc,amt)
      select @code,@date,@desc,sale.amt from sale where code = @code and date = @date
      其它项目类似

 公式说明:
 1.^表名@字段名^ : 例如: ^sale@amt^ 表示从 sale 表取 amt 字段的值,取值条件是 code=@code and date=@date
 2.[seq]        : 例如: [1]-[2]-[3],[]之间为引用本部门前面的计算结果项,[1]表示是本部门的销售收入[2]表示销售成本,其它类似
 3.其他的是标准的计算表达式
--*/

--问题处理:
--公式计算的存储过程
create proc p_calc
@formula nvarchar(4000), --要计算的公式
@code varchar(10),       --部门代码
@date datetime,          --计算的日期
@amt int out             --计算的结果
as
declare @s1 nvarchar(4000),@s2 nvarchar(4000),@i int,@j int

--外部计算
set @i=patindex('%^%@%^%',@formula)
while @i>0
begin
 select @j=charindex('@',@formula,@i)
  ,@s1=substring(@formula,@i,@j-@i)
  ,@s2=' from '
   +substring(@formula,@i+1,@j-@i-1)
   +' where code=@code and date=@date'
  ,@i=charindex('^',@formula,@j)
  ,@s1=@s1+substring(@formula,@j,@i-@j+1)
  ,@s2='select @amt='
   +substring(@formula,@j+1,@i-@j-1)
   +@s2
  exec sp_executesql @s2
   ,N'@code varchar(10),@date datetime,@amt int out'
   ,@code,@date,@amt out
  select @formula=replace(@formula,@s1,@amt)
   ,@i=patindex('%^%@%^%',@formula)
end

--计算内部公式
select @i=patindex('%[[]%]%',@formula)
while @i>0
begin
 select @j=charindex(']',@formula,@i)
  ,@s1=substring(@formula,@i,@j-@i+1)
  ,@s2='select @amt=amt from #t where seq='
   +substring(@formula,@i+1,@j-@i-1)
  exec sp_executesql @s2,N'@amt int out',@amt out
  select @formula=replace(@formula,@s1,@amt)
   ,@i=patindex('%[[]%]%',@formula)  
end

--计算最终结果
set @s2='select @amt='+@formula
exec sp_executesql @s2,N'@amt int out',@amt out
go

--计算利润明细资料的
create proc p_qry
@code varchar(10),  --要计算的部门代码
@date datetime      --计算的日期
as
set nocount on
create table #t(code varchar(10),date varchar(10),[desc] varchar(10),amt int,seq int)

declare @dt varchar(10),@desc varchar(10),@amt int,@formula nvarchar(4000),@seq int

set @dt=convert(char(10),@date,120)

declare tb cursor local for
select [desc],formula,seq from means
where code=@code order by seq
open tb
fetch tb into @desc,@formula,@seq
while @@fetch_status=0
begin
 --计算公式
 exec p_calc @formula,@code,@date,@amt out
 insert #t values(@code,@dt,@desc,@amt,@seq)
 fetch tb into @desc,@formula,@seq
end
close tb
deallocate tb

select 部门代号=code,日期=date,项目内容=[desc],金额=amt from #t
go

--调用
exec p_qry 'aa','2004-10-22'
go

--删除测试
drop table sale,dept,cost,means
drop proc p_qry,p_calc
go

/*--测试结果

部门代号       日期         项目内容       金额         
---------- ---------- ---------- -----------
aa         2004-10-22 销售收入       15000
aa         2004-10-22 销售成本       5000
aa         2004-10-22 上交利润       3000
aa         2004-10-22 净利润        7000
--*/

 

分享到:
评论

相关推荐

    delphi 自定义公式计算

    在IT行业中,自定义公式计算是一项常见的需求,特别是在软件开发中。Delphi作为一种强大的Object Pascal编程环境,提供了丰富的工具和库来实现这类功能。本文将深入探讨如何在Delphi中实现自定义公式计算,主要涉及...

    公式计算器(可自定义公式)

    它不仅可以执行基本的算术运算,还可以处理自定义公式,适用于各种专业领域的计算需求。同时,其小巧的体积、简单的操作和安全的特性,确保了用户在日常使用中的便捷性和安全性。无论是学生解决作业问题,还是专业...

    表格自定义公式计算题

    在电子表格应用中,自定义公式计算是提升数据处理能力的关键功能之一。它允许用户根据需求创建自己的计算规则,以解决复杂的数据分析问题。本文将深入探讨如何在表格中运用自定义公式,以及如何解决相关的计算题。 ...

    JEPsrc(自定义计算公式)

    JEP是Java expression parser的简称,即java表达式分析器,...通过这个程序包,用户可以以字符串的形式输入一个、任意的公式,然后快速地计算出结果。Jep支持用户自定义变量、常量和函数。包括许多常用的数学函数和常。

    C#中字符串转换为计算公式-并进行计算的方法(自定义公式的计算)

    ### C#中字符串转换为计算公式并进行计算的方法(自定义公式的计算) 在软件开发过程中,有时我们需要处理用户输入的动态表达式或公式,并能够即时计算这些表达式的值。这种需求常见于科学计算器应用、数学软件或者...

    自定义表达式计算 (c#)

    总结起来,创建一个自定义表达式计算引擎是一项技术含量高的任务,涉及到语言处理的核心技术。通过C#实现这样的引擎,开发者不仅可以满足项目中的特定计算需求,还可以深化对编译原理的理解,提高编程能力。理解并...

    BOTP单据转换自定义公式

    最后,保存并应用这些设置后,当新的销售订单数据导入平台时,系统会自动根据自定义公式进行计算,生成正确的含税总价。这样,即使面临复杂或特殊的需求,用户也能灵活应对,保证业务的正常运行。 通过以上介绍,...

    java 公式计算汇总,直接调用其方法即可进行运算

    4. **自定义公式解析**: 除了这些基本和科学计算,还可以实现更复杂的公式解析,比如使用表达式解析库(如JEP或JScience)来处理包含变量和运算符的完整表达式。这样,用户可以通过字符串形式输入公式,例如`"2 * ...

    易语言高级表格自定义计算公式

    4. **自定义公式的实现**:在易语言中,你可以通过`定义过程`或`定义函数`来创建自定义的计算逻辑。这些过程或函数可以接受表格的单元格作为参数,进行计算后返回结果。例如,你可以定义一个过程`求平均值`,它接收...

    金蝶EAS增加自定义取数公式范例.pdf

    2. 编写公式逻辑:在`<defaultBatchImplClass>`标签中指定公式对应的Java类,如`com.kingdee.eas.custom.budget.formula.HelloWorldCalculatorImpl`,在这个类中实现具体的公式计算逻辑。 3. 定义公式元数据:在XML...

    c# 表达式(公式)计算

    4. **自定义函数**:除了内置函数,还可以定义自己的函数并集成到表达式计算中。这可能涉及到委托或Lambda表达式的使用。 5. **变量和常量**:在计算表达式时,可以使用变量和常量。C#中的变量需要先声明后使用,而...

    万能自定义公式生成R3.0

    【万能自定义公式生成R3.0】是一款强大的计算工具,专为用户设计自定义公式的功能。...通过自定义公式,用户可以处理各种专业问题,提高生产力,进一步推动他们在学术研究、工程计算或数据分析等领域的工作进展。

    金碟EAS-BOTP自定义公式解决方案.pdf

    金碟EAS-BOTP自定义公式解决方案是针对金碟EAS系统中业务流程自动化(Business Operation Process Template,简称BOTP)模块中的公式功能的扩展方案。这一方案主要应用于EASBOS530及以上版本,在标准产品单据的开发...

    BOTP自定义公式API

    通过这些自定义公式API,开发者能够更加灵活地处理各种业务场景下的数据,从而更好地满足客户的特定需求。未来,随着业务的不断发展,可能会有更多类似的API被开发出来,以支持更广泛的应用场景。 #### 七、鸣谢 ...

    ACCESS里自定义公式 简单用法

    在Microsoft ACCESS中,自定义公式是提升数据库管理效率和数据处理能力的重要手段。尤其是在复杂的查询、计算和报表生成中,自定义公式能帮助用户实现个性化的需求。本篇将重点介绍如何在ACCESS中运用VBA(Visual ...

    Office 2010 视频教程第9章自定义公式的运用.zip

    通过自定义公式,用户可以编写自己的计算逻辑,实现复杂的计算任务。 自定义公式的创建通常基于VBA(Visual Basic for Applications),这是Office 2010内置的一种编程语言。通过VBA,用户不仅可以创建新的函数,还...

    易语言源码高级表格自定义计算公式.7z

    5. **错误处理**:讲解如何在公式计算出错时提供友好的错误提示,避免程序异常退出。 6. **界面交互设计**:如何设计用户界面,使用户能方便地输入和编辑公式,以及查看计算结果。 7. **性能优化**:在处理大量...

    公式解析类(字符串公式,自定义函数公式)

    此类在数学计算、数据分析等领域有着广泛的应用,比如在电子表格软件或编程语言中进行复杂的公式计算。 #### 主要功能 1. **算术运算**: 支持加、减、乘、除等基本算术运算。 2. **比较运算**: 支持大于、小于、...

    Jep3.5 数学公式计算 jar包及中文操作手册文档

    44 自定义类型 五、操作符 51 内建操作符 52 加入操作符 53 为可配置的解析器加入和操作操作符 531 修改已存在的操作符 532 优先级和绑定 533 将操作符加入操作符表 534 标准操作符的绑定和优先级 54 使用标准解析器...

Global site tag (gtag.js) - Google Analytics