具有变量的公式的数据库存储

时间:2009-10-27 15:05:12

标签: c# sql database-design

这有点复杂,所以忍受我。

我的雇主要求建立一个从一组变量计算任务迭代的系统。

项目中的每个任务都有一个特定的公式,用于计算任务需要完成的次数(“迭代”)。该公式可能依赖于常数,变量(输入数量,因此任务可能与我们拥有的供应商数量或离岸员工数量相关,并且这些值可能因每个项目而异)和/或时间(例如每月一次,每季度一次,每6个月一次,每年一次)

如何设计数据库来保存这些公式,以便我以后可以计算出来?

示例公式:
每个供应商每月一次。
每个客户每个供应商每季度两次。
每六个供应商每月一次。

技术堆栈是C#,.NET 3.5,SQLServer 2005。

5 个答案:

答案 0 :(得分:7)

查看NCalc(Codeplex) 您可以在SQLCLR中嵌入该解析器,并将公式保存在表中。

答案 1 :(得分:4)

我会像这样存储它们:

每个供应商每月一次。

(* month supplier)

每个客户每个供应商每季度两次。

(* 2 (* quarter (* supplier customer)))

每六个供应商每月一次。

(* month (/ (+ supplier 5) 6))

易于解析。解析后,您将显示您找到的标识符列表,并要求用户为其提供值。

答案 2 :(得分:0)

您是否可以创建一组定义的动词/占位符,用于处理varchar列,该列使用动词/占位符来定义公式?

这些动词/占位符然后由某些程序使用,以处理公式,计算出它在技术上尝试做的事情。

所以:
每个供应商每月一次可能是:
1 /月/供应商
每个客户每个供应商每季度两次可能是:
2 / QUARTER / SUPPLIER / CUSTOMER
等。

但是,您只需要处理有限数量的公式模板,否则会变得一团糟。

如果您不需要大规模灵活,这种方法可行,但是如果您想要完全灵活,那么您将进入自创的报告类型,这种方式要复杂得多。

答案 3 :(得分:0)

您如何看待这种技术? (使用JScript)

Evaluate a formula at runtime

using System;

namespace CodeFreezer.CodeSamples
{
    public static class ExpressionEvaluator
    {
        /// <summary>
        /// Evaluate
        /// Evaluate a math expression
        /// </summary>
        /// <param name="expression">Expression to evaluate</param>
        /// <returns>result</returns>
        public static double Evaluate(string expression)
        {
            if (String.IsNullOrEmpty(expression)) throw new ArgumentNullException("expression");

            return Convert.ToDouble(Microsoft.JScript.Eval.JScriptEvaluate(expression, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()));
        }
    }
}

答案 4 :(得分:0)

一些动态SQL怎么样?

  1. 创建一个包含公式(过程或sql脚本)库的表,这些公式足以涵盖您的案例。对于公式参数,使用占位符,例如'#number of iterations here#'。公式列是nvarchar(max) - 字符串。

  2. 创建任务步骤表,为要运行的每个步骤点和要使用的参数列表。

  3. 动态构建功能脚本(文本),用实际参数替换占位符(搜索和替换)。

  4. 使用sp_executesql执行函数N'my_funcion_text_here'