我的应用。在C#2008中,后端是SQL Server。我的数据库中的表包含以下列:
总金额
折扣
SpecialDiscount
纳税
NetAmount
我想要我的应用。可由用户定制。用户可以根据他的需要从上面的列创建公式来计算 NetAmount 。
例如:一个用户可以简单地使用:
(TotalAmount - Discount - SpecialDiscount)+ Tax
但其他用户可能会使用Tax / 2或Tax * 3.5
如何处理此类情况?存储自定义公式的位置以及如何在运行时替换值?
答案 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语法。
如果要为它们编写构建器,可以将子表的每一行中的每个操作都放在具有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)
我也经常使用搜索条件。
如果您有权访问,最简单的方法是将公式存储到他们自己的数据库表中,然后由用户选择它们,显示给用户选择使用哪个。