在表列上创建自定义公式

时间:2010-10-25 14:30:13

标签: c# sql-server

我的应用。在C#2008中,后端是SQL Server。我的数据库中的表包含以下列:

总金额

折扣

SpecialDiscount

纳税

NetAmount

我想要我的应用。可由用户定制。用户可以根据他的需要从上面的列创建公式来计算 NetAmount

例如:一个用户可以简单地使用:

(TotalAmount - Discount - SpecialDiscount)+ Tax

但其他用户可能会使用Tax / 2或Tax * 3.5

如何处理此类情况?存储自定义公式的位置以及如何在运行时替换值?

3 个答案:

答案 0 :(得分:1)

过去我用两种方式解决了这个问题:Firs是允许用户在单个表中定义存储在数据库中的公式,包含列的公式: UserName - 因为每个用户都可以定义公式 FormulaHeading - 在GUI中显示 FormulaText - SQL表达式 TableName应用forumla的表的名称

在代码中,从Formula中选择FormulaHeading,FormulaText,并将每个公式文本作为字段添加到选择SQL中。所以你的代码看起来像这样:

string query = string.Format("SELECT TotalAmount, Discount, SpecialDiscount, Tax, NetAmount {0} From SomeTable", GetUserFormula(userName, tableName));

private string GetUserFormula(string userName, string tableName)
    {
        StringBuilder result = new StringBuilder();
        using (SqlConnection con = new SqlConnection("someConnectionString"))
        {
            using (SqlCommand com = new SqlCommand("Select FormulaText, FormulaHeading FROM Formula WHERE UserName = @userName AND TableName =@TableName"))
            {
                com.Parameters.AddWithValue("userName", userName);
                com.Parameters.AddWithValue("tableName", tableName);
                SqlDataReader reader = com.ExecuteReader();
                if (reader == null)
                    return result.ToString();
                while (reader.NextResult())
                {
                    result.AppendFormat(", ({0}) AS [{1}]", reader["FormulaText"], reader["FormulaHeading"]);
                }
                return result.ToString();
            }
        }
    }

如果您的GUI是数据绑定的,那么您应该获得一些新的正确命名的列,其中的数据由SQL服务器完成。

我使用的另一种方法是允许用户定义公式并将它们包装在SQL Server中的视图中。逻辑类似,但视图在服务器上是stoerd,您需要为具有公式的每个用户创建视图而不是触发器。

答案 1 :(得分:1)

re:存储自定义公式的位置以及如何在运行时替换值?

我同意目前的答案,因为公式必须存储在源代码外部,数据库表甚至文本文件中。

要在运行时替换值,您有几个选项。

  • 存储文字sql语法
  • 存储sql的标记化版本

您还需要决定如何处理这些操作。如果你存储文字sql,你可以直接执行,你很好,但你的最终用户必须学习sql语法。

如果要为它们编写构建器,可以将子表的每一行中的每个操作都放在具有userID的表中。

父表有列

userID
formulaID
formulaName

子表有列

userID
formulaID
operationSequence
field
operator
value

为您的例子,

(TotalAmount - Discount - SpecialDiscount) + Tax / 2 

子表中的行将一次分解计算一个算术运算:

userID  formulaID  operationSequence  field     operator  value
1       1          1                  tax       /         2
1       1          2                  netamount +         totalAmount
1       1          3                  netamount -         discount
1       1          4                  netamount -         specialDiscount

您的代码知道将每个操作的结果存储在netamount字段中。

如果只有少数因自定义操作而异的事情,例如税收字段中的乘数,您也可以只存储它(示例中为1,0.5或3.5)

答案 2 :(得分:0)

我也经常使用搜索条件。

如果您有权访问,最简单的方法是将公式存储到他们自己的数据库表中,然后由用户选择它们,显示给用户选择使用哪个。