代码之家  ›  专栏  ›  技术社区  ›  Matthew Jones

变量公式的数据库存储

  •  4
  • Matthew Jones  · 技术社区  · 15 年前

    这有点复杂,你放心吧。

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

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

    如何设计一个数据库来保存这些公式,以便以后计算它们?

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

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

    5 回复  |  直到 14 年前
        1
  •  7
  •   Nestor    15 年前

    看一看 NCalc (CODULTEX) 您可以将该分析器嵌入到sqlcr中,并将公式保存到表中。

        2
  •  4
  •   Sam Harwell    15 年前

    我会这样储存它们:

    每个供应商每月一次。

    (* month supplier)

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

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

    每六个供应商每月一次。

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

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

        3
  •  0
  •   Bravax    15 年前

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

    然后,一些程序使用这些动词/占位符来处理公式,从技术上计算出它要做什么。

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

    不过,您只需要处理有限数量的公式模板,否则这将变得一团糟。

    如果您不需要非常灵活,这种方法也可以工作,但是如果您希望完全灵活,您将转向自创建的报告类型,这要复杂得多。

        4
  •  0
  •   Adrian    15 年前

    你觉得这种技术怎么样?(使用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()));
            }
        }
    }
    
        5
  •  0
  •   Damir Sudarevic    15 年前

    动态SQL怎么样?

    1. 使用足够通用的公式库(过程或SQL脚本)创建一个表,以覆盖您的事例。对于公式参数,请使用像“迭代次数”这样的占位符。公式列是nvarchar(max)——字符串。

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

    3. 动态生成函数脚本(文本),用实际参数替换占位符(搜索和替换)。

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