DotNet.Highcharts: стоимость не соответствует правильной дате

Я создаю диаграмму DotNet.Highcharts, в которой используются данные из двух таблиц: "Расходы" и "Входы". Я использую оператор SQL для создания DataTable для каждого. Первый (для входящих) под названием Dt содержит IncCost и IncDate. Второй (для расходов) под названием Dt2 содержит ExpCost и ExpDate.

Я могу составить график IncCost против IncDate и ExpCost против ExpDate. Проблема возникает, когда я пытаюсь объединить IncDate и ExpDate (окончание), поскольку стоимость для IncCost и ExpCost отображается в зависимости от положения даты в (окончание), а не фактической даты, с которой она связана.

Вот вызовы, которые я использую для создания каждой DataTable:

SqlDataAdapter Adp = new SqlDataAdapter("select CONVERT(DATETIME, IncDate, 103) AS IncDate, SUM(IncCost) AS IncCost from Incomings GROUP BY CONVERT(DATETIME, IncDate, 103) ORDER BY CONVERT(DATETIME, IncDate, 103)", con);

SqlDataAdapter Adp2 = new SqlDataAdapter("select CONVERT(DATETIME, ExpDate, 103) AS ExpDate, SUM(ExpCost) AS ExpCost from Expenditures GROUP BY CONVERT(DATETIME, ExpDate, 103) ORDER BY CONVERT(DATETIME, ExpDate, 103)", con);

Вот код для вызова каждого из них из datatable

var dateArr = Dt.AsEnumerable().Select(r => r.Field<DateTime>("IncDate")).ToArray();
var objectArr = Dt.AsEnumerable().Select(r => r.Field<object>("IncCost")).ToArray();

var dateArr2 = Dt2.AsEnumerable().Select(r => r.Field<DateTime>("ExpDate")).ToArray();
var objectArr2 = Dt2.AsEnumerable().Select(r => r.Field<object>("ExpCost")).ToArray();   

var res = dateArr.Concat(dateArr2).ToArray();
var final = res.Select(d => d.ToString(@"dd\/MM\/yyyy")).ToArray();

А вот код, который я использую для создания своего highchart:

Highcharts chart = new Highcharts("graph")
  .SetTitle(new Title { Text = "Incoming Stats" })
  .SetXAxis(new[] { new XAxis { Categories = final } })
  .SetYAxis(new YAxis { Title = new YAxisTitle { Text = "Amount Incoming" } })
  .SetSeries(new[]
    {
      new Series { Name = "inc", Data = new Data(objectArr)},
      new Series { Name = "exp", Data = new Data(objectArr2) }
    });

Участок 1

Как видите, ряды создаются, но строятся по номеру в массиве, а не по дате, к которой он должен быть привязан.

Я не уверен, насколько я близок или далек от решения, но любая помощь приветствуется. Вот мои данные о поступлениях

Вот данные для моей таблицы входящих данных Dt

Вот мои данные о расходах

Вот данные для моих данных о расходах (Dt2)

Искренне не знаю, как это сделать. любая информация очень ценится


person Stuart    schedule 04.03.2016    source источник


Ответы (1)


Ваши значения Y полностью отделены от значений X. Чтобы достичь того, чего вы хотите, вам необходимо реструктурировать данные, как показано ниже:

        DateTime dt = new DateTime(2016, 2, 27);

        Highcharts chart = new Highcharts("graph")
           .SetTitle(new Title { Text = "Incoming Stats" })
           .SetXAxis(new XAxis { Type = AxisTypes.Datetime })
           .SetYAxis(new YAxis { Title = new YAxisTitle { Text = "Amount Incoming" } })
           .SetSeries(new[]
             {
              new Series { Name = "inc", Data = new Data(new object[,] { 
                  {dt , 23 }, 
                  {dt.AddDays(1) , 223 }, 
                  {dt.AddDays(2) , 51 }, 
                  {dt.AddDays(11) , 200 }, }) },
              new Series { Name = "exp", Data = new Data(new object[,] { 
                  {dt.AddDays(5) , 100 }, 
                  {dt.AddDays(6) , 23 }, 
                  {dt.AddDays(11) , 23 }, 
                  {dt.AddDays(19) , 35 }, 
                  {dt.AddDays(35) , 288 }, }) }
             });

введите здесь описание изображения

EDIT: Как это сделать динамически:

        object[,] data1 = new object[Dt.Rows.Count, 2];
        for (int i = 0; i < Dt.Rows.Count; i++)
        {
            data1[i, 0] = Dt.Rows[i]["IncDate"];
            data1[i, 1] = Dt.Rows[i]["IncCost"];
        }

        object[,] data2 = new object[Dt2.Rows.Count, 2];
        for (int i = 0; i < Dt2.Rows.Count; i++)
        {
            data2[i, 0] = Dt2.Rows[i]["ExpDate"];
            data2[i, 1] = Dt2.Rows[i]["ExpCost"];
        }

        Highcharts chart = new Highcharts("graph")
           .SetTitle(new Title { Text = "Incoming Stats" })
           .SetXAxis(new XAxis { Type = AxisTypes.Datetime })
           .SetYAxis(new YAxis { Title = new YAxisTitle { Text = "Amount Incoming" } })
           .SetSeries(new[]
             {
                    new Series { Name = "inc", Data = new Data(data1) },
                    new Series { Name = "exp", Data = new Data(data2) }
             });

введите здесь описание изображения

Данные получены из базы данных:

введите здесь описание изображения

введите здесь описание изображения

person jsanalytics    schedule 07.03.2016
comment
Спасибо за это, хотя я надеялся, что это будет динамично, а не вручную вводить данные - person Stuart; 08.03.2016
comment
Вы можете сделать это динамически... Я указываю на основную проблему: вы используете неправильную перегрузку конструктора Data(object[] data), из-за чего X и Y для вашего Series полностью отсоединяются друг от друга. Вместо этого используйте Data(object[ , ] data), таким образом, у вас есть массив пар [X, Y], который решает вашу проблему, в отличие от двух отдельных массивов [X] и [Y], которые не связаны друг с другом. Ваша структура данных, содержащая результаты, должна иметь ту же структуру, что и показанная выше, независимо от того, получаете вы ее динамически или нет. - person jsanalytics; 08.03.2016
comment
Спасибо за помощь. Хотя я понятия не имею, как бы я реструктурировал свой код так, как вы предложили, чтобы сделать его динамическим. - person Stuart; 08.03.2016
comment
блестяще спасибо. Я смогу вручить его тебе через 13 часов. - person Stuart; 08.03.2016
comment
Еще раз спасибо, награда будет доступна через 3 часа. Есть ли способ изменить мой код, чтобы стоимость добавлялась к предыдущей стоимости? Чтобы линия постоянно двигалась вверх, а не вверх и вниз? - person Stuart; 08.03.2016
comment
Вам нужно будет соответствующим образом изменить свой запрос, возможно, используя коррелированный подзапрос для расчета частичных итогов до текущей даты. - person jsanalytics; 08.03.2016
comment
Если вы ищете в Интернете подзапрос или коррелированный подзапрос, вы найдете много материала. - person jsanalytics; 08.03.2016