【问题标题】:Calculations between two rows of DataTable in C#C#中两行DataTable之间的计算
【发布时间】:2010-09-03 06:39:25
【问题描述】:

我有DataTable,它附加了两个表。我有很多行,其中两个是 TotalRate(注意:这些是我的 DataTable 中的行)。我想通过将两行相乘来计算总金额。我该怎么做?

DataTables 来自 SQL Compact,我无法在那里进行计算,因为根据必须完成的某些设置,并不总是需要它。它甚至可以是百分比计算或任何东西。有没有办法在DataTable????的2行之间进行计算?

我正在使用 C#。我尝试了计算功能,但做不到。该表可能如下所示:

Title Prod1  Prod2   Prod3
       10     20       30
       0      20       10
       5      6        0
       50     0        0
Total  65     46       40
Rate   10     20       10
Amount 650    920      400

Total=sum of Prodi   i=1,2,3   Amount=Total*Rate 

应该有一些方法来实现这一点。我该怎么办????

提前致谢。

【问题讨论】:

    标签: c# datatable datarow


    【解决方案1】:

    你可以做的是:

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

    编辑
    也许我没有完全理解你的数据结构。所以让我们看一些场景。如果您的不在其中,请提供有关数据表中一行实际外观的更多详细信息:

    案例 a:数据存储在列中,您也希望该行中的 Totals 和 Amount 列

    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:数据存储在行中,您也希望 Total 和 Amount 为行

    RowTitle Value
    Value1   1
    Value2   5
    Value3   2
    Rate     10
    

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

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

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

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

    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();
    }
    

    请注意,此代码可能需要一些调整 - 我还没有实际测试过它。如果“Rates”-Table 包含多行并且需要根据其他设置选择正确的比率,您可以考虑创建一个函数,根据这些设置返回正确的行:

    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"];

    【讨论】:

    • 这意味着我需要为表中的列运行“for循环”???嗯,我现在只是这样做,但我们没有办法对行进行计算,因为我们有一个函数 COMPUTE for column????
    • 我将费率存储在不同的表中。我使用 SQL compact 作为我的数据库,具体取决于用户对表视图的选择。使用数据表的计算功能计算总计。比我沿着计算表附加费率表比我需要计算 TotalAmount。如果用户需要,所有这些都是设置,并且可能因人而异。所以我需要一个函数而不是循环。有什么想法!!!
    • 再次编辑 - 也许这对你有用。否则,您必须编辑原始问题并添加更多详细信息。
    • 嗯,仪式现在我只运行for循环:-(但我认为应该有一些方法可以对C#中数据表的特定行进行一些计算,但现在找不到任何仪式。
    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2014-05-06
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多