Динамический Google пончик диаграмма из данных SQL-запроса

1

Я хочу сделать диаграмму пончика Google, заполненную данными из SQL-запроса.

Я искал пример кода, но не смог отобразить диаграмму.

Автор сценария:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
    // Global variable to hold data
        google.load('visualization', '1', { packages: ['corechart'] });
        google.setOnLoadCallback(DrawDonut);

        $(function DrawDonut() {

            var options = {
                pieHole: 0.4,      
                colors: ['#286090', '#d7d7d7']  
            };

            $.ajax({
                type: 'POST',
                dataType: 'json',
                contentType: 'application/json',
                url: 'Default.aspx/GetChartData',
                data: '{}',
                success:
                    function (response) {
                        drawchart(response.d);
                    },

                    error: function () {
                        alert("Error loading data! Please try again.");
                    }
            });
        })
            function drawchart(dataValues) {
            var data = new google.visualization.DataTable();
            data.addColumn('string', 'UnitID');
            data.addColumn('number', 'TotalUse');
            for (var i = 0; i < dataValues.length; i++) {
                data.addRow([dataValues[i].UnitID, dataValues[i].TotalUse]);
            }
            new google.visualization.PieChart(document.getElementById('chart')).
                draw(data, { title: "Use distributed on units" });
        }    
    </script>

Html:

<div id="chart" style="width: 900px; height: 600px;"></div>

Код позади:

<WebMethod()> 
Public Shared Function GetChartData(ByVal MemberIndex As String) As List(Of Object)
    Dim query As String = "SELECT Log.[UnitID], COUNT(*) As [TotalUse] FROM Log WHERE (MemberIndex_Log = @MemberIndex AND (GramSup1 + GramSup2) > 0 AND Log.[UnitID] > 5000) GROUP BY Log.[UnitID]"
    Dim constr As String = ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString
    Dim chartData As List(Of Object) = New List(Of Object)()
    chartData.Add(New Object() {"UnitID", "TotalUse"})
    Using con As SqlConnection = New SqlConnection(constr)
        Using cmd As SqlCommand = New SqlCommand(query)
            cmd.CommandType = CommandType.Text
            cmd.Connection = con
            cmd.Parameters.AddWithValue("@MemberIndex", Convert.ToInt32(HttpContext.Current.Session("MemberIndex")))
            con.Open()
            Using sdr As SqlDataReader = cmd.ExecuteReader()
                While sdr.Read()
                    chartData.Add(New Object() {sdr("UnitID"), sdr("TotalUse")})
                End While
            End Using

           con.Close()
           Return chartData
        End Using
    End Using
End Function

Я хочу, чтобы появилась динамическая кольцевая диаграмма, показывающая использование единиц (обычно от 2 до 10 единиц), распределенных на диаграмме.

Теги:
sql-server
google-visualization

1 ответ

0

jsapi первых, jsapi - это старая версия диаграмм Google, и ее больше нельзя использовать.

используйте взамен loader.js, запишите путь...

<script src="https://www.gstatic.com/charts/loader.js"></script>

это только изменит оператор load.


Затем Google Chart будет ждать загрузки страницы по умолчанию.
нет необходимости размещать код внутри функции готовности сокращенного документа jquery → $(function() {
размещение функции DrawDonut внутри функции ready,
выводит его из области видимости из обратного вызова Google.
поскольку он не может быть достигнут, он не запускается.


наконец, обратные вызовы success & error для $.ajax устарели,
вместо этого используйте обещания " done и fail.


рекомендуем настроить аналогично следующему фрагменту...

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
  google.charts.load('current', {
    packages: ['corechart']
  }).then(function () {
    var options = {
      title: 'Use distributed on units',
      pieHole: 0.4,
      colors: ['#286090', '#d7d7d7'],
      width: 900,
      height: 600
    };

    $.ajax({
      type: 'POST',
      dataType: 'json',
      contentType: 'application/json',
      url: 'Default.aspx/GetChartData',
      data: '{}'
    }).done(function (response) {
      drawchart(response.d);
    }).fail(function () {
      console.log('Error loading data! Please try again.');
    });

    function drawchart(dataValues) {
      var data = new google.visualization.DataTable();
      data.addColumn('string', 'UnitID');
      data.addColumn('number', 'TotalUse');
      for (var i = 0; i < dataValues.length; i++) {
        data.addRow([dataValues[i].UnitID, dataValues[i].TotalUse]);
      }
      new google.visualization.PieChart(document.getElementById('chart')).
        draw(data, options);  // <-- use options already defined above
    }
  });
</script>

<div id="chart"></div>

примечание: вы определяете свой объект options, здесь...

var options = {
    pieHole: 0.4,      
    colors: ['#286090', '#d7d7d7']  
};

но не используя его, чтобы нарисовать график, здесь...

draw(data, { title: "Use distributed on units" });
  • 0
    Спасибо за ваше предложение, но, к сожалению, оно все еще не работает. Есть идеи?
  • 0
    пожалуйста, отредактируйте вопрос с помощью последней версии вашего кода?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню