расчет между двумя строками DataTable в C # - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть Datatable, к которому добавлены буксирные таблицы. У меня есть много строк в этих двух из которых являются Total и Rate. (Обратите внимание, это строки в моей Datatable). Я хочу рассчитать общую сумму путем умножения двух строк. Как мне это сделать. Таблицы данных получены из sql Compact, и я не могу выполнить их расчет, поскольку это не всегда необходимо, в зависимости от некоторых настроек, которые необходимо выполнить. Это может быть даже процентный расчет или любая вещь. Есть ли способ выполнить вычисление между 2 рядами в datatable ???? Я использую C #. Я пытался вычислить функцию, но не могу сделать это. Таблица может выглядеть так:

Название Prod1 Prod2 Prod3 10 20 30 0 20 10 5 6 0 50 0 0 Итого 65 46 40 Оценить 10 20 10 Сумма 650 920 400

т.е. итого = сумма проди, i = 1,2,3
и сумма = общая * ставка. Должен быть какой-то способ достичь этого. Как мне поступить ????

Заранее спасибо.

1 Ответ

1 голос
/ 03 сентября 2010

Что вы могли бы сделать:

  1. Получить данные из базы данных в таблицу данных
  2. Выберите две строки для Rate и Total из результата
  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 : данныехранящиеся в строках, вы также хотите, чтобы Total и Amount были строками

RowTitle Value
Value1   1
Value2   5
Value3   2
Rate     10

Теперь вам нужно использовать цикл for в C #, чтобы перебрать все строки, суммировать значения и затем создать два новыхстроки с RowTitle «Итого» и «Сумма» и добавьте их в свою таблицу.

РЕДАКТИРОВАТЬ 2
Вы, так что я понимаю из вашего второго комментария, что у вас на самом деле есть дватаблицы в вашей базе данных.Тот, который содержит фактические данные, и тот, который содержит цены.Теперь вы выбираете из этих таблиц в соответствии с заданными пользователем настройками и фактически получаете две таблицы в своем наборе данных на C # - одну для этих данных, одну для скорости.

AFAIK, SQL Server Compact Edition не позволяет вамиспользовать JOIN, но это было бы проще всего: выберите данные из таблицы данных и присоедините их к таблице «Тарифы», выбрав соответствующую скорость в соответствии с настройками пользователя.Тогда вы могли бы сделать расчет, который я отметил в «Случае а» выше.

Однако я думаю, что вы не можете использовать 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» содержит более одной строки и необходимо выбрать правильную скорость в зависимости от других настроек, вы можете рассмотреть возможность создания функции, которая возвращает правильную строку в зависимости от этих настроек:

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"]; выше.

...