Простите за мой отвратительный метод: я не смог сделать это в SQL (поскольку я использую динамически, и я не разбираюсь в способах SQL достаточно, чтобы заставить его создавать динамический вывод, в котором я нуждаюсь / нуждаюсь) или EF, так как я не смог заставить его работать по неизвестной причине (если у кого-то есть пример, который может помочь новичку с EF и DataTables, поделитесь)
У меня есть DataTable (dt
) со значениями, которые я пытаюсь получить, вычислить и затем ввести в другую таблицу данных (fDt
).
Пример dt
:
+-------------------------------------------------------+
| ID | CustName | 201501 | 201502 | 201503 | 201504 | ..|
+-------------------------------------------------------+
| 32 | CustOne | 100.00 | 200.00 | 400.00 | 700.00 | ..|
| 56 | CustTwo | | | | 500.00 | ..|
| 89 | CustThree| 222.22 | 333.33 | 444.44 | 555.55 | ..|
| .. | ... | .. | .. | .. | .. | ..|
+-------------------------------------------------------+
Я хочу взять значения после CustName
для использования в моих вычислениях.
Затем вычисление дает процентную разницу между двумя столбцами из предыдущей таблицы:
+-------------------------------------------------------+
| ID | CustName | PerDiff02 | PerDiff03 | PerDiff04 | ..|
+-------------------------------------------------------+
| 32 | CustOne | 0 | 100 | 200 | ..|
| 56 | CustTwo | | | 85.00 | ..|
| 89 | CustThree| 66.66 | 75.00 | 80.00 | ..|
| .. | ... | .... | .... | .... | ..|
+-------------------------------------------------------+
(проценты подделаны, но они показывают, чего я пытаюсь достичь.)
* PerDiff
должны начинаться со второго показанного месяца (201502
) и продолжаться до текущего.
Я считаю, что я сделал это, однако с кодом, который у меня сейчас есть:
for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
for (int j = 0; j < (dt.Columns.Count); j++)
{
//decimal? month1 = dt.Rows[i].Field<decimal?>(j);
//decimal? month2 = dt.Rows[i].Field<decimal?>(j + 2);
decimal? month1 = (decimal?)dt.Rows[i][j];
decimal? month2 = (decimal?)dt.Rows[i][j + 2];
fDt.Rows[i][j - 1] = ((month1 - month2) / month1) * 100;
}
}
Я включил две закомментированные строки, так как они выдают ту же ошибку, которую я сейчас получаю с этим циклом:
Указанное приведение недопустимо.
Для строк, объявляющих month1
и month2
.
ВОПРОС:
Как мне взять данные из одного из моих Cells
в одном DataTable
в уравнении, а затем введите в другое DataTable
?
Если что-то неясно, пожалуйста, дайте мне знать!
РЕДАКТИРОВАТЬ:
Вот весь мой метод получения моей таблицы данных:
public DataTable GetPerDiff(DataTable dt)
{
var fDt = new DataTable();
int i;
int fieldCount = dt.Columns.Count;
string[] colHeaders = new string[fieldCount];
for (i = 0; i < fieldCount; i++)
{
colHeaders[i] = dt.Columns[i].ToString();
}
fDt.Columns.Add(colHeaders[0]);
fDt.Columns.Add(colHeaders[1]);
//Get's the data into the new table
for (i = 1; i < dt.Rows.Count-1; i++)
{
fDt.Rows.Add(dt.Rows[i][0], dt.Rows[i][1]);
}
// Gets the column headers for dataTable fDt
for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
string colName = "PerDiff" + dt.Columns[i + 1];
fDt.Columns.Add(colName);
}
for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
for (int j = 0; j < (dt.Columns.Count); j++)
{
//decimal? month1 = dt.Rows[i].Field<decimal?>(j);
//decimal? month2 = dt.Rows[i].Field<decimal?>(j + 2);
decimal? month1 = (decimal?)dt.Rows[i][j];
decimal? month2 = (decimal?)dt.Rows[i][j + 2];
fDt.Rows[i][j - 1] = ((month1 - month2) / month1) * 100;
}
}
return dt;
}