【发布时间】:2015-08-01 20:01:24
【问题描述】:
我正在编写一个小型 web 应用程序,用于为客户计算和创建帐单。为此,我有以下 SQL Server 表:
每个月,Billing 表中将添加多达 2600 条新记录,BillingPriceLine 表中的每个帐单约有 3 条记录,最后,BillingPriceLineSpecification 表中每条记录最多可添加 750 条记录在BillingPriceLine 表中。所以这意味着总共有 很多 条记录 :-)
因此,每个月插入到表中的初始数据可能如下所示(但这只是我的测试数据)
Billing 表(开始完全为空):
BillingPriceLine表:
BillingPriceLineSpecification表:
添加这些记录后(我为此使用SqlBulkCopy),然后我必须进行以下计算才能完成单次计费:
根据
BillingPriceLineSpecification.EstimatedProduction - BillingPriceLineSpecification.RealisedProduction计算BillingPriceLineSpecification.Production将每个
BillingPriceLineSpecification.Production * BillingPriceLineSpecification.Price的总和存储在一个临时变量中以备后用根据
BillingPriceLineSpecification.Production的总和计算BillingPriceLine.Production根据步骤 2 的总和除以
BillingPriceLine.Production计算BillingPriceLine.Price-
像这样计算
BillingPriceLine.TotalPrice:((BillingPriceLine.Production * BillingPriceLine.Price) * BillingPriceLine.Share) / 100) 根据
BillingPriceLine.TotalPrice的总和计算Billing.SubTotal根据
Billing.SubTotal / 4计算Billing.VAT(丹麦增值税为25%)计算
Billing.Total,这将是Billing.SubTotal + Billing.VAT
我已经使用 Entity Framework 编写了一些 C# 代码来执行此操作,但是当我使用 Billing 表中的 10 条记录而不是 2600 条记录对其进行测试时,它基本上停滞不前(因为缺少更好的词)
我写的 C# 代码:
using(var ctx = new MyEntities())
{
foreach (Billing billing in ctx.Billings)
{
// Calculate billing price lines from billing price line specifications
try
{
foreach (BillingPriceLine priceLine in billing.BillingPriceLines)
{
// Declare a local variable for holding the specification total sum
decimal specificationsSum = 0;
// Loop through billing price line specifications on this price line
foreach (BillingPriceLineSpecification specification in priceLine.BillingPriceLineSpecifications)
{
// First, check if the estimated production and realised production has a value
if (specification.EstimatedProduction.HasValue && specification.RealisedProduction.HasValue)
{
// Calculate production for a price line specification
specification.Production = specification.EstimatedProduction.Value - specification.RealisedProduction.Value;
// Add to total specification sum
specificationsSum += specification.Production*specification.Price;
}
}
// Set total production on price line
priceLine.Production = priceLine.BillingPriceLineSpecifications.Sum(x => x.Production);
// Set price on price line
priceLine.Price = specificationsSum/priceLine.Production;
// Set total price on price line
priceLine.TotalPrice = ((priceLine.Production*priceLine.Price)*priceLine.Share)/100;
}
// Set subtotal, VAT and total sum on billing
billing.Subtotal = billing.BillingPriceLines.Sum(x => x.TotalPrice);
billing.VAT = billing.Subtotal/4;
billing.Total = billing.Subtotal + billing.VAT;
}
catch
{
// Handle error logging here ..
}
}
ctx.SaveChanges();
}
我希望使用存储过程将此计算过程转移到 SQL Server,希望性能会好很多,因为它不必在 Web 应用程序上运行。但是,我在编写 T-SQL 时缺乏技能,无法编写这样的程序。
有没有人可以给我一个编写这个程序的起点? :-) 和/或用更好的方法来解决这个问题。如果能得到一些反馈,我们将不胜感激。
提前致谢。
【问题讨论】:
-
你能把输入表示例数据和预期输出数据放在这里吗
-
您的代码似乎读取了计费中的每一行,遍历 BillingPriceLineSpecification 中的每一行,然后得到总数。但是你每次都重新计算每一行的总数,当没有过滤器时它不会改变.....
-
@BugFinder 是的,这是预期的行为 :-) 每个账单
SubTotal、VAT和Total应该分别计算。 -
但总数不会改变,该规格和没有过滤器......所以。我想我不明白
-
@BugFinder 不需要过滤器 :-) 这三个表每个月都会填充 一些 数据,然后我必须根据这些初始数据用于“完成”每个计费设置的 SubTotal、VAT 和 Total。有意义吗?
标签: c# sql-server stored-procedures