Получение суммы в час от 2 датированных - PullRequest
1 голос
/ 18 марта 2020

Я пишу текстовый файл из 2 таблиц данных.
Ниже приведена таблица 2 данных.

dt1
Transaction No.    Time         Amount     Date
    1              10:00:00     200.00     03/05/2020
    2              10:30:11     250.00     03/05/2020
    3              11:05:22     140.00     03/05/2020
    4              11:45:33     230.00     03/05/2020
    5              12:15:10     220.00     03/05/2020

dt2
Transaction No.    Added Amount   Date
    1              40.00          03/05/2020
    2              25.00          03/05/2020
    3              40.00          03/05/2020
    4              30.00          03/05/2020
    5              30.00          03/05/2020

следующий мой код

using (StreamWriter sw = File.AppendText(fileName))
        {
            for (int a = 6; a <= 23; a++)
            {
                string aa = a.ToString().PadLeft(2, '0');

                double salex = double.Parse(dt1.Rows[0]["Amount"].ToString());
                if (salex.Equals(""))
                {
                    salex = 0;
                }
                else
                {
                    salex = double.Parse(dt1.Rows[0]["Amount"].ToString());
                }

                double vatx = double.Parse(dt2.Rows[0]["Added Amount"].ToString());
                if (vatx.Equals(""))
                {
                    vatx = 0;
                }
                else
                {
                    vatx = double.Parse(dt2.Rows[0]["Added Amount"].ToString());
                }

                double dailysaleHRLY = -salex + -vatx;

                sw.Write(dtpDate.Value.ToString("MM/dd/yyyy") + ",");
                sw.Write(aa + ":00" + ",");
                sw.Write(dailysaleHRLY.ToString("0.00") + ",");
            }

            for (int a = 0; a <= 5; a++)
            {
                string aa = a.ToString().PadLeft(2, '0');                    
                double salex = double.Parse(dt1.Rows[0]["Amount"].ToString());
                if (salex.Equals(""))
                {
                    salex = 0;
                }
                else
                {
                    salex = double.Parse(dt1.Rows[0]["Amount"].ToString());
                }

                double vatx = double.Parse(dt2.Rows[0]["Added Amount"].ToString());
                if (vatx.Equals(""))
                {
                    vatx = 0;
                }
                else
                {
                    vatx = double.Parse(dt2.Rows[0]["Added Amount"].ToString());
                }
                double dailysaleHRLY = -salex + -vatx;
                sw.Write(dtpDate.Value.ToString("MM/dd/yyyy") + ",");
                sw.Write(aa + ":00" + ",");
                sw.Write(dailysaleHRLY.ToString("0.00") + ",");
            }
            MessageBox.Show("Txt File succesfully created!", "SYSTEM", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

Это вывод моего кода.

Дата, время, сумма
03/05 / 2020,06: 00,515.00
03/05 / 2020,07: 00,515.00
03/05 / 2020,08: 00,515.00
03/05 / 2020,09: 00,515.00
03/05 / 2020,10: 00,515.00
03/05 / 2020,11: 00,515.00
03/05 / 2020,12: 00,515.00
03/05 / 2020,13: 00,515.00
03/05 / 2020,14: 00,515.00
03/05 / 2020,15: 00,515.00
03 / 05 / 2020,16: 00,515.00
03/05 / 2020,17: 00,515.00
03/05 / 2020,18: 00,515.00
03/05 / 2020,19: 00,515.00
03/05 / 2020,20: 00,515.00
03/05 / 2020,21: 00,515.00
03/05 / 2020,22: 00,515.00
03/05 / 2020,23: 00,515.00
03/05/2020, 00: 00,515.00
03/05 / 2020,01: 00,515.00
03/05 / 2020,02: 00,515.00
03/05 / 2020,03: 00,515.00
03/05 / 2020,04: 00,515.00
03/05 / 2020,05: 00,515.00

Я просто хочу получить сумму Сумма и Добавленная сумма по часам.
Как это.

Дата, время, сумма
03/05/2020, 06: 00,0.00
03/05 / 2020,07: 00,0,00
03/05 / 2020,08: 00,0,00
03/05 / 2020,09: 00,0,00
03/05 / 2020,10: 00,515.00
03/05 / 2020,11: 00,440.00
03/05 / 2020,12: 00,250.00
03/05 / 2020,13: 00,0.00
03/05 / 2020,14: 00,0.00
03/05 / 2020,15: 00,0.00
03/05 / 2020,16: 00,0.00
03/05 / 2020,17: 00,0.00
03/05 / 2020,18: 00,0,00
03/05 / 2020,19: 00,0,00
03/05 / 2020,20: 00,0,00
03 / 05 / 2020,21: 00,0,00
03/05 / 2020,22: 00,0,00
03/05 / 2020,23: 00,0,00
03/05 / 2020,00: 00, 0,00
03/05 / 2020,01: 00,0,00
03/05 / 2020,02: 00,0,00
03/05 / 2020,03: 00,0,00
03/05 / 2020,04: 00,0,00
03/05 / 2020,05: 00,0,00

1 Ответ

1 голос
/ 18 марта 2020

Предполагая, что у вас есть два DataTable-s и они заполнены указанными данными.

var dt1 = new DataTable();
var dt2 = new DataTable();

dt1.Columns.AddRange(new[]
    {
    new DataColumn("Transaction No.", typeof(int)),
    new DataColumn("Time", typeof(DateTime)),
    new DataColumn("Amount", typeof(decimal)),
    new DataColumn("Date", typeof(DateTime)),
});

dt2.Columns.AddRange(new[]
{
    new DataColumn("Transaction No.", typeof(int)),
    new DataColumn("Added Amount", typeof(decimal)),
    new DataColumn("Date", typeof(DateTime)),
});

Примечание: The double типы были заменены типами decimal, поскольку это правильный тип, который следует использовать при работе с деньгами.

Насколько я понимаю, вы хотите group строки dt1 на час часть поля Time, суммируйте Amount и добавьте к сумме Added Amount из dt2 строк, где их Transaction No. равно любому Transaction No. из сгруппированных строк dt1.

Это будет делать:

var group = dt1.AsEnumerable().GroupBy(x => x.Field<DateTime>(1).Hour);
var sb = new StringBuilder();

sb.Append("Date,");
sb.Append("Time,".PadLeft(12, ' '));
sb.AppendLine("Sum".PadLeft(5, ' '));

//if PadLeft is not required in the output, then just:
//sb.AppendLine($"Date, Time, Sum");

foreach (var g in group)
{
    var sum = 0M;
    foreach (var r in g)
        sum += r.Field<decimal>(2) + dt2.AsEnumerable()
            .Where(x => x.Field<int>(0) == r.Field<int>(0))
            .Sum(x => x.Field<decimal>(1));
    sb.AppendLine($"{g.First().Field<DateTime>(3).ToString("MM/dd/yyyy")}, {g.Key.ToString("00")}:00, {sum.ToString("0.00")}");
}

Примечание: Вы можете использовать поля имена вместо их индексов.

Вывод:

Date,       Time,  Sum
03/05/2020, 10:00, 515.00
03/05/2020, 11:00, 440.00
03/05/2020, 12:00, 250.00

Я не знаю, содержит ли DataTable-s необходимые данные для генерации вывода, упомянутого в последний блок цитаты или вы хотите добавить остальные перед записью в текстовый файл. В случае второго сценария вы можете сделать что-то вроде:

var group = dt1.AsEnumerable().GroupBy(x => x.Field<DateTime>(1).Hour);
var sb = new StringBuilder();

sb.AppendLine($"Date, Time, Sum");

for (var i = 0; i < 24; i++)
{
    var g = group.FirstOrDefault(x => x.Key == i);

    if (g != null)
    {
        var sum = 0M;
        foreach (var r in g)
            sum += r.Field<decimal>(2) + dt2.AsEnumerable()
                .Where(x => x.Field<int>(0) == r.Field<int>(0))
                .Sum(x => x.Field<decimal>(1));
        sb.AppendLine($"{g.First().Field<DateTime>(3).ToString("MM/dd/yyyy")}, {g.Key.ToString("00")}:00, {sum.ToString("0.00")}");
    }
    else
        sb.AppendLine($"{group.First().First().Field<DateTime>(3).ToString("MM/dd/yyyy")}, {i.ToString("00")}:00, 0.00");
}

Если вам нужно сохранить тот же порядок часов:

for (var ii = 6; ii < 30; ii++)
{
    var i = ii > 23 ? ii % 24 : ii;
    var g = group.FirstOrDefault(x => x.Key == i);

    if (g != null)
    {
    //The same...
}

Наконец, чтобы создать или перезаписать текстовый файл (fileName):

File.WriteAllText(fileName, sb.ToString());

Или добавить вывод:

File.AppendAllText(fileName, sb.ToString());
...