繁体   English   中英

C#中DataTable的两行之间的计算

[英]calculation between two rows of DataTable in C#

我有将两个表附加在一起的数据表。 我有很多行,其中两行是总计和费率。(请注意,这是我的数据表中的行)。 我想通过将两行相乘来计算总数。 我该怎么做。 数据表来自sql Compact,我无法对其进行计算,因为并非总是需要此计算,具体取决于某些设置。 它甚至可以是百分比计算或其他任何东西。 有什么方法可以在数据表的两行之间执行计算? 我正在使用C#。 我尝试了计算功能,但无法实现。 该表可能如下所示:

标题Prod1 Prod2 Prod3 10 20 30 0 20 10 5 6 0 50 0 0总计65 46 40费率10 20 10金额650920400

即Total = Prodi之和,i = 1,2,3
和Amount = Total * Rate。 应该有一些方法可以实现这一目标。 我该怎么办???

提前致谢。

您可以做的是:

  1. 从数据库获取数据到数据表
  2. 从结果中选择“费率”和“总计”两行
  3. (如果不需要显示它们,请从表中删除这些行)
  4. 根据两行中的值进行计算
  5. 将新行手动添加到表中以获取结果

编辑
也许我不太了解您的数据结构。 因此,让我们看一些情况。 如果您不在那儿,请提供更多有关数据表中的一行实际外观的详细信息:

案例a :数据存储在列中,您也希望该行中的总计和金额列

Value1 Value2 Value3 Rate Total Amount
1      5      3      10     ?     ?

您可以如下修改SQL语句:

SELECT Value1, Value2, Value3, Rate, 
       (Value1+Value2+Value3) AS Total, 
       ((Value1+Value2+Value3) * Rate) AS Amount 
FROM <table>

另外,如果您在C#中使用类型化数据集,则可以使用普通的SELECT * ...语句,将具有各自表达式( Expression属性-等效于计算列)的列手动添加到类型化数据集中的表中。

情况b :数据存储在行中,您也希望“总计”和“金额”也是行

RowTitle Value
Value1   1
Value2   5
Value3   2
Rate     10

现在,您需要在C#中使用for循环对所有行进行迭代,对值求和,然后使用RowTitle “ Total”和“ Amount”创建两个新行,并将它们添加到表中。

编辑2
您,因此我从您的第二条评论中了解到您的数据库中实际上有两个表。 一种包含实际数据,另一种包含费率。 现在,您可以根据用户定义的设置从这些表中进行选择,实际上,您在C#中的数据集中获得了两个表-一个用于该数据,一个用于Rate。

AFAIK SQL Server Compact Edition不允许您使用JOIN ,但是那是最简单的:从数据表中选择数据并将其加入“费率”表,然后根据用户设置选择相应的费率。 然后,您可以进行上面“案例a”中提到的计算。

但是,我认为您不能使用JOIN ,因此建议您将数据放入应用程序中(产生两个单独的表,一个用于数据,一个用于Rate)。 您修改数据SELECT语句,以便获得默认值为0的附加列Amount

SELECT *, 0 AS Amount FROM <data table>

然后,在C#中,您遍历数据表中的所有记录并计算记录的Amount值。

private void GetData(...)
{
    // Call SELECT statements to fill a dataset with two tables
    DataSet set = new DataSet();
    ....

    // set now contains tables[0] (for the data) and tables[1] (for the Rate).
    // Get the Rate
    int rate = (int)set.Tables[1].Rows[0]["Rate"]; // Assuming that the column is named "Rate"

    // Now iterate over all data rows and calculate amount
    foreach (DataRow row in set.Tables[0])
    {
        row["Amount"] = ((int)row["Total"] * rate);
    }

    // Mark the data set as unmodified
    set.AcceptChanges();
}

请注意,此代码可能需要进行一些调整-我尚未实际对其进行测试。 如果“费率”表包含多个行,并且需要根据其他设置选择正确的费率,则可以考虑创建一个函数,这些函数根据以下设置返回正确的行:

private DataRow FindRateRow(DataSet set, <parameters for selecting the correct row>)
{
    DataRow[] row = set.Tables[1].Select(<Filter string according to parameters>);
    if (row != null && row.Length > 0)
        return row[0];
    return null;
}

使用int rate = (int)FindRateRow(set, ...)["Rate"]; 以上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM