这有点复杂,所以忍受我。
我的雇主要求建立一个从一组变量计算任务迭代的系统。
项目中的每个任务都有一个特定的公式,用于计算任务需要完成的次数(“迭代”)。该公式可能依赖于常数,变量(输入数量,因此任务可能与我们拥有的供应商数量或离岸员工数量相关,并且这些值可能因每个项目而异)和/或时间(例如每月一次,每季度一次,每6个月一次,每年一次)
如何设计数据库来保存这些公式,以便我以后可以计算出来?
示例公式:
每个供应商每月一次。
每个客户每个供应商每季度两次。
每六个供应商每月一次。
技术堆栈是C#,.NET 3.5,SQLServer 2005。
答案 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)
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怎么样?
创建一个包含公式(过程或sql脚本)库的表,这些公式足以涵盖您的案例。对于公式参数,使用占位符,例如'#number of iterations here#'。公式列是nvarchar(max) - 字符串。
创建任务步骤表,为要运行的每个步骤点和要使用的参数列表。
动态构建功能脚本(文本),用实际参数替换占位符(搜索和替换)。
使用sp_executesql执行函数N'my_funcion_text_here'