French graphique tableau croisé dynamique

BugNot

Member
Salut à tous,

Je cherche désespérément un moyen de créer un graphique avec googlechart avec une requete sqlite qui me donne un tableau croisé.

ex:
mes données résultat de ma requête
table.jpg


et le graphique qui devrait ressembler à quelque chose comme ça:
graph.jpg


J'arrive a faire des graphiques basés sur des requêtes simples qui donnent des graph en XY, mais là j'y arrive pas. ☹

Merci pour votre aide.
 

BugNot

Member
je suis parti de LA

B4X:
Private graphLunePrises As clsGoogleChart
Private cursor As Cursor

cursor = Main.sql1.ExecQuery(sql)

graphLunePrises.AddColumn("lunes", graphLunePrises.DT_String)
    For i=0 To cursor.RowCount-1
        cursor.Position=i
        'ajoute autant de colonnes que de dates'
        graphLunePrises.AddColumn(cursor.GetString("Date"), graphLunePrises.DT_Number)
    Next
cursor.Close

C'est maintenant que ça se complique!

Les données sont dépendantes de l'utilisateur, donc il peut y avoir 1, 2, 3, 5, 15... années présentes et donc autant de valeurs dans chaque colonnes "lunes"
Comment automatiser le remplissage du graphique?
 

klaus

Expert
Licensed User
Longtime User
Je n'ai aucune expérience avec Google Charts, mais je connais la bibliothèque xChart.
Il n'y a pas de correspondance entre le tableau et le graphique dans ton premier message.
Si j'ai bien compris, c'est ce genre de graphique que tu voudrais?

1586530814900.png

J'ai joint mon programme test. Il nécessite la bibliothèque xChart.b4xlib.

Pour automatiser il faudrait connaître structure de la base de données.
 

Attachments

  • LuneChart.zip
    9.8 KB · Views: 229
Last edited:

BugNot

Member
Bonjour Klaus,

Je n'ai aucune expérience avec Google Charts, mais je connais xChart.
J'ai vu que ça existe, j'ai essayé aussi en vain lol.

Il n'y a pas de correspondance entre le tableau et le graphique dans ton premier message.
Effectivement les valeurs du tableau ne représente pas le graphique et inversement, c’était juste un exemple.


Est-ce que le nombre de valeurs de Lunes et constant,
Oui le nombre de colonnes des lunes sera toujours au nombre de 8. (j'ai mis une colonne de trop dans mon exemple de tableau)

La base de données est structurée comment?
Pour faire simple (la base de donnée est assez fournie!) je tire mes données pour ce graphique) d'une requête sqlite que voici:

SQL:
    sqlCroiseLunePrises = "Select substr(Tbl_Session.DateSession, 1 , 4) As Date, " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L0.jpg' THEN Tbl_Poisson.Quantite end) as [Nouvelle lune], " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L3.jpg' THEN Tbl_Poisson.Quantite end) as [Premier croissant], " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L5.jpg' THEN Tbl_Poisson.Quantite end) as [Premier quartier], " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L6.jpg' THEN Tbl_Poisson.Quantite end) as [Gibeuse croissante], " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L8.jpg' THEN Tbl_Poisson.Quantite end) as [Pleine lune], " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L10.jpg' THEN Tbl_Poisson.Quantite end) as [Gibeuse décroissante], " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L11.jpg' THEN Tbl_Poisson.Quantite end) as [Dernier quartier], " _
                        & " sum(Case WHEN Tbl_Session.TypeLune = 'L13.jpg' THEN Tbl_Poisson.Quantite end) as [Dernier croissant] " _
                        & " FROM (Tbl_Poisson INNER JOIN Tbl_Session ON Tbl_Poisson.Session_ID = Tbl_Session.ID_Session) " _
                        & " WHERE Tbl_Poisson.ResultatCombat = 'Attrapé' " _
                        & " GROUP BY substr(Tbl_Session.DateSession, 1 , 4) " _
                        & " ORDER BY substr(Tbl_Session.DateSession, 1 , 4)"

Edit: j'avais pas vu ton message en écrivant le miens Klaus, ton programme est bon, c'est ce que j'aimerai avoir.
Seulement pour la partie automatisation ça va être corsé :rolleyes:
J'ai toujours le même problème, c'est pour automatiser les valeurs en fonction des lunes et des dates. (que ce soit avec googleChart, xcharts ou MPAndroidCharts )

)

J'arrive bien à récupérer mes valeurs mais après ....???
B4X:
    'boucle colonnes
    For j = 1 To cursor.ColumnCount - 1
        cursor.Position = j
        nomLune(j-1) = cursor.GetColumnName(j)
        Log("colonne : " & nomLune(j-1))
       
        'boucle lignes
        For k = 0 To cursor.RowCount -1
            cursor.Position = k
            valeurs(k) = cursor.GetInt2(j)
            Log("ligne : " & valeurs(k))
        Next
    Next
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Si j'ai bien compris, chaque ligne contient une année.
La première colonne contient l'année et les suivantes les valeurs par lune.
Le code ci-dessous devrait fonctionner, mais comme je ne peux pas le tester il se peut qu'il y ait des erreurs.

B4X:
Private Sub InitChart
    Private Cursor As Cursor
    
    'ton code SQL
    
    Private ListeValeurs As List
    Private nomLune(Cursor.ColumnCount - 1) As String
    Private Annee(Cursor.RowCount) As String
    
    ListeValeurs.Initialize
'    Lunes = Array As String("Nouvelle lune", "Premier croissant", "Premier quartier", "Gibeuse croissante", "Pleine lune", "Gibeuse décroissante", "Dernier quartier", "Dernier croissan")

    'récupère les noms des lunes
    For j = 1 To Cursor.ColumnCount - 1
        nomLune(j-1) = Cursor.GetColumnName(j)
    Next
    
    'récupère les années avec les valeurs
    'les valeurs sont mémorisées dans une matrice
    For row = 0 To Cursor.RowCount - 1
        Annee(row) = Cursor.GetString2(0)
        Private Valeurs(Cursor.RowCount - 1, Cursor.ColumnCount - 1) As Double
        For col = 1 To Cursor.ColumnCount - 1
            Valeurs(row, col - 1) = Cursor.GetDouble2(col)
        Next
    Next
    
    xChart1.ClearData
    
    'définit les barres
    For i = 0 To Annee.Length - 1
        xChart1.AddBar(nomLune(i), Colors.RGB(Rnd(0, 256), Rnd(0, 256), Rnd(0, 256)))
    Next
    'répartit les valeurs par lune
    For j = 0 To nomLune.Length - 1
        Private Vals(Annee.Length) As Double
        For i = 0 To Annee.Length - 1
            Vals(i) = Valeurs(i, j)
        Next
        xChart1.AddBarMultiplePoint(nomLune(j), Vals)
    Next
    
    xChart1.DrawChart
End Sub
 

BugNot

Member
Si j'ai bien compris, chaque ligne contient une année.
La première colonne contient l'année et les suivantes les valeurs par lune.
Oui c'est ça 👍

Déjà un grand merci à toi pour ton code, je vais intégrer ça dans mon code et je te ferais part du résultat.
 

BugNot

Member
J'ai réussi à corriger 2 p'tites bricoles ici:
B4X:
    'récupère les années avec les valeurs
    'les valeurs sont mémorisées dans une matrice
    For row = 0 To cursor.RowCount - 1
        cursor.Position = row          '<-- sans ça, ça plante
        Annee(row) = cursor.GetString2(0)
      
        Private Valeurs(cursor.RowCount, cursor.ColumnCount) As Double   '<-- pas de -1 pour la taille du tableau à 2 dimensions
        For col = 1 To cursor.ColumnCount - 1
            Valeurs(row, col-1) = cursor.GetDouble2(col)
            Log(Valeurs(row, col-1))   '<-- ici les valeurs sont justes
        Next
    Next


Ensuite il doit rester un problème dans cette boucle, je n'ai qu'une seule barre qui s'affiche sur le graphique.
B4X:
    'répartit les valeurs par lune
    For j = 0 To nomLune.Length - 1
        Private Vals(Annee.Length) As Double
        For i = 0 To Annee.Length - 1
            Vals(i) = Valeurs(i, j)   '<--ici que ça coince
            Log(Valeurs(i, j))        '<--ici les valeurs correspondent pas à celles ligne 10 du code précédent
        Next
        xChart1.AddBarMultiplePoint(nomLune(j), Vals)
    Next

Je sens qu'on est pas loin du résultat final 😛

Edit:
Eureka!!!!!!!! j'ai trouvé le dernier problème, le tableau "Valeurs" perdait la "mémoire", du coup en la déclarant avant les boucles for imbriquées, tout se passe bien.

C'est magnifique Klaus, t'es un champion 👍👏🏆, je bugais la dessus depuis 3 jours !
Mille merci

Par contre j'ai encore une p'tite question, quel est la limite des graphique avec xChart? J'me dit qu'à un moment à force de rentrer des données le graphique va dire STOOOOP ? Du coup il serait judicieux que je limite le nombre de données pour le graphique?
 
Last edited:

klaus

Expert
Licensed User
Longtime User
La limite est variable en fonction de la largeur du graphique, de la largeur pour l'inscription de l'échelle l'axe Y et s'il y a un nom pour l'axe Y..
Tu utilises le graphique sur un téléphone, sur une tablette ou sur les deux, plein écran ou seulement sur une partie?
Donc, ça peut être très variable.
Si la largeur d'une barre est inférieure à 4dip, le programme affiche une erreur.
 

BugNot

Member
Ok c'est noté, pas moins de 4dip.
Merci pour tout Klaus.

Voici le code final si ça peut servir à quelqu'un:
B4X:
    Dim cursor As Cursor
    
    'TON CODE SQL'

    Private nomLune(cursor.ColumnCount - 1) As String
    Private Annee(cursor.RowCount) As String
        
    'récupère les noms des lunes
    For j = 1 To cursor.ColumnCount - 1
        nomLune(j-1) = cursor.GetColumnName(j)
    Next
    
    Private Valeurs(cursor.RowCount, cursor.ColumnCount) As Double
    
    'récupère les années avec les valeurs
    'les valeurs sont mémorisées dans une matrice
    For row = 0 To cursor.RowCount - 1
        cursor.Position = row
        Annee(row) = cursor.GetString2(0)   
        For col = 1 To cursor.ColumnCount - 1
            Valeurs(row, col-1) = cursor.GetDouble2(col)
        Next
    Next
    
    graphCroise.ClearData
  
    'définit les barres
    For i = 0 To Annee.Length - 1
        graphCroise.AddBar(Annee(i), Colors.RGB(Rnd( 0, 256), Rnd( 0, 256), Rnd( 0, 256)))
    Next
    
    'répartit les valeurs par lune
    For j = 0 To nomLune.Length - 1
        Private Vals(Annee.Length) As Double
        For i = 0 To Annee.Length - 1
            Vals(i) = Valeurs(i, j)
        Next
        graphCroise.AddBarMultiplePoint(nomLune(j), Vals)
    Next
    
    graphCroise.DrawChart
    cursor.close
 
Top