Error en respuesta a storage.get: TypeError: no se puede leer la propiedad 'estilo' de nulo

Estoy tratando de obtener datos de una base de datos de Oracle en un LineChart usando GoogleCharts, pero siempre me encuentro con algunos errores.

¡Si alguien pudiera ayudarme, sería muy apreciado!

Aquí está el script para obtener el gráfico de líneas:

<html>
<head>


    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script type="text/javascript">


    $( document ).ready(function() {

      google.load("visualization", "1", {packages:["corechart"]});
        google.setOnLoadCallback(drawChart);

        function drawChart (callback) {
        var jsonData = $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url:"getData.php",
            dataType:"json",
            async:false,



        }).responseText;

        //Create our data table out of JSON data loaded from server
        var data = new google.visualization.DataTable(jsonData);

        //PieCharts expects 2 columns of data: a label and a value, so we need to use a DataView to restrict to 2 columns
        var view = new google.visualization.DataView(data);
        view.setColumns([0, 1]);


        var options = {
      title: 'Whatever'
    };
        //Instantiate and draw our chart, passing in some options
        var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
        chart.draw(data, options);
    }
    });




    </script>

</head>

<body>
     <!--Div that will hold the pie chart-->
<div id="chart_div">Test</div>
</body>

Y aquí está el Phpscript para obtener los datos en una tabla:

    <?php 





//On exécute la requete









//on appelle la page connexion
include 'connexion.php';

//La requete

$query = "

select A.*  
from (
SELECT 
         EB_RESULTAT_DTM.VALEUR AS EB_RESULTAT_VALEUR, 
         EB_RESULTAT_DTM.INSERT_DATE AS EB_RESULTAT_INSERT_DATE,

         rank() over (partition by EB_INDICATEUR_DTM.INDICATEUR_NUM,to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') order by to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymmdd') asc) as rang,
         to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') as MOIS_M
    FROM COMPTEUR_OWNER.EB_DOMAINE_DTM EB_DOMAINE_DTM
         INNER JOIN
         COMPTEUR_OWNER.EB_INDICATEUR_DTM EB_INDICATEUR_DTM
            ON EB_DOMAINE_DTM.EB_DOMAINE_DTM_NUM =
                  EB_INDICATEUR_DTM.X_EB_DOMAINE_DTM_NUM
         INNER JOIN
         COMPTEUR_OWNER.EB_RESULTAT_DTM EB_RESULTAT_DTM
            ON EB_INDICATEUR_DTM.INDICATEUR_NUM =
                  EB_RESULTAT_DTM.X_EB_INDICATEUR_DTM_NUM
   WHERE     EB_INDICATEUR_DTM.INDICATEUR_NUM = 106
         AND EB_RESULTAT_DTM.INSERT_DATE BETWEEN ADD_MONTHS (SYSDATE, -9) 
                                               AND SYSDATE
) a where a.rang=1
";

$stid = oci_parse($conn, $query);
oci_execute($stid);

$table = array();
$table['cols'] = array(
    /* define your DataTable columns here
     * each column gets its own array
     * syntax of the arrays is:
     * label => column label
     * type => data type of column (string, number, date, datetime, boolean)
     */
    array('label' => 'Nombres', 'type' => 'number'),
    array('label' => 'Date', 'type' => 'date'),
    // etc...
);

$rows = array();
while($r = oci_fetch_assoc($stid)) {
    $temp = array();
    // each column needs to have data inserted via the $temp array
    $temp[] = array('v' => $r['EB_RESULTAT_VALEUR']);
    $temp[] = array('v' => $r['EB_RESULTAT_INSERT_DATE']);
    // etc...

    // insert the temp array into $rows
    $rows[] = array('c' => $temp);
}

// populate the table with rows of data
$table['rows'] = $rows;

    // encode the table as JSON
    $jsonTable = json_encode($table);



    // return the JSON data
    echo $jsonTable;

    ?>

Alguna vez recibo este mensaje:

Error in response to storage.get: TypeError: Cannot read property 'style' of null

O bien:

undefined is not a function

preguntado el 12 de junio de 14 a las 11:06

¿Puede actualizar su pregunta con una muestra de los datos devueltos por su llamada AJAX? -

Hola, acabo de responder en la parte inferior si eso te ayuda a entender dónde está el problema. -

2 Respuestas

Hay algunos errores que puedo ver. Primero, está analizando el objeto incorrecto en el arrayToDataTable método:

var data = google.visualization.arrayToDataTable($.parseJSON(drawChart));

debiera ser:

var data = google.visualization.arrayToDataTable($.parseJSON(jsonData));

Entonces, sus columnas están en el orden incorrecto. Los LineCharts esperan que los valores del eje x (sus fechas) sean la primera columna, luego los valores y en la segunda columna. Además, debe generar sus números como números en lugar de cadenas; solo agrega JSON_NUMERIC_CHECK En el correo electrónico “Su Cuenta de Usuario en su Nuevo Sistema XNUMXCX”. json_encode Llamada de función:

echo json_encode($rows, JSON_NUMERIC_CHECK);

Respondido el 25 de junio de 14 a las 14:06

Hola, gracias de nuevo por tu tiempo ¡Finalmente logré hacerlo funcionar! Aunque no pude usar JSON_NUMERIC_CHECK porque no estaba usando PHP 5.3. En su lugar usé float : while($row = oci_fetch_array($sql, OCI_BOTH)){ array_push($rows, array(substr($row[1], 0, 9), floatval($row[0]))); } echo json_encode($rows); - oscynth

Así que cambié tanto el PHP como el script, pero ahora recibo otro mensaje de error:

Uncaught Error: Not an array 

Aquí está el php getData2.php:

<?php



include 'connexion.php';
//


$sql  = oci_parse($conn, "select A.*  
from (
SELECT 
         EB_RESULTAT_DTM.VALEUR AS EB_RESULTAT_VALEUR, 
         EB_RESULTAT_DTM.INSERT_DATE AS EB_RESULTAT_INSERT_DATE,

         rank() over (partition by EB_INDICATEUR_DTM.INDICATEUR_NUM,to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') order by to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymmdd') asc) as rang,
         to_char(EB_RESULTAT_DTM.INSERT_DATE,'yyyymm') as MOIS_M
    FROM COMPTEUR_OWNER.EB_DOMAINE_DTM EB_DOMAINE_DTM
         INNER JOIN
         COMPTEUR_OWNER.EB_INDICATEUR_DTM EB_INDICATEUR_DTM
            ON EB_DOMAINE_DTM.EB_DOMAINE_DTM_NUM =
                  EB_INDICATEUR_DTM.X_EB_DOMAINE_DTM_NUM
         INNER JOIN
         COMPTEUR_OWNER.EB_RESULTAT_DTM EB_RESULTAT_DTM
            ON EB_INDICATEUR_DTM.INDICATEUR_NUM =
                  EB_RESULTAT_DTM.X_EB_INDICATEUR_DTM_NUM
   WHERE     EB_INDICATEUR_DTM.INDICATEUR_NUM = 106
         AND EB_RESULTAT_DTM.INSERT_DATE BETWEEN ADD_MONTHS (SYSDATE, -9) 
                                               AND SYSDATE
) a where a.rang=1");

oci_execute($sql);

//while (($row = oci_fetch_array($sql, OCI_BOTH)) != false) {
    // Utilisez des noms de colonne en majuscule pour les indices des tableau associatif
   // echo $row['EB_RESULTAT_VALEUR'];
 //   echo $row['EB_RESULTAT_INSERT_DATE'];
//}

//json_encode($row);

$rows = Array();

while($row = oci_fetch_array($sql, OCI_BOTH)){
     array_push($rows, $row[0], $row[1]);
}

echo json_encode($rows);

    oci_free_statement($sql);
    oci_close($conn);
?>

Me devuelve esto:

["9415094","14\/09\/13 14:39:56,000000","9419954","02\/11\/13 13:25:26,000000","9355868","07\/12\/13 13:25:58,000000","9369691","04\/01\/14 13:24:19,000000","9385231","01\/02\/14 13:26:36,000000","9414700","01\/03\/14 13:26:28,000000"]

Y aquí está el index_4.php (script):

<html>
<head>
    <title>Donné volumétrique</title>
    <!-- Load jQuery -->
    <script language="javascript" type="text/javascript" 
        src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
    </script>
    <!-- Load Google JSAPI -->
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">

        google.load("visualization", "1", { packages: ["corechart"] });
        google.setOnLoadCallback(drawChart);

        function drawChart() {
            var jsonData = $.ajax({
                url: "getData2.php",
                dataType: "json",
                async: false
            }).responseText;

            var data = google.visualization.arrayToDataTable($.parseJSON(drawChart));

            var options = {
                title: 'Donnée Volumétrique'
            };

            var chart = new google.visualization.LineChart(
                        document.getElementById('chart_div'));
            chart.draw(data, options);
        }

    </script>
</head>
<body>
    <div id="chart_div" style="width: 900px; height: 500px;">
    </div>
</body>
</html>

Y esto es lo que obtengo:

http://imgur.com/w8jexhJ "Mensaje de error"


EDITAR 1: $rows = Array(); a $rows = Array(array('Nombres', 'Date'));

E

array_push($rows, $row[0], $row[1]); a array_push($rows, array($row[0], $row[1]));

Obtener : [["Nombres","Date"],["9419954","02\/11\/13 13:25:26,000000"],["9355868","07\/12\/13 13:25:58,000000"],["9369691","04\/01\/14 13:24:19,000000"],["9385231","01\/02\/14 13:26:36,000000"],["9414700","01\/03\/14 13:26:28,000000"]]

Respondido el 24 de junio de 14 a las 11:06

Este falla porque el arrayToDataTable La función espera una matriz de matrices. Cambiar $rows = Array(); a $rows = Array(array('Nombres', 'Date')); para agregar los encabezados de sus columnas y cambiar array_push($rows, $row[0], $row[1]); a array_push($rows, array($row[0], $row[1])); para arreglar las filas. - valiente

Hola, primero gracias por tu tiempo. Hice el cambio que sugirió, pero todavía devuelve un error: "La tabla no tiene columnas. ×" - oscynth

¿Puede actualizar su pregunta con una muestra del contenido de jsonData? - valiente

Espero que eso sea lo que quisiste decir: [["Nombres","Date"],["9419954","02\/11\/13 13:25:26,000000"],["9355868","07\/12\/13 13:25:58,000000"],["9369691","04\/01\/14 13:24:19,000000"],["9385231","01\/02\/14 13:26:36,000000"],["9414700","01\/03\/14 13:26:28,000000"]] - oscynth

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.