PDA

View Full Version : [VB.NET] Problema con libreria ZedGraph


jackk87
02-02-2011, 20:19
Buonasera,
sto sviluppando un gestionale per bilancio familiare.
Nel database ho una tabella che si chiama gruppoentrate(id,gruppo) e un'altra che si chiama entrate(id,data,importo,descrizione,saldata,idgruppo) dove tra le due c'è una relazione 1 a molti tra gruppoentrate.id e entrate.idgruppo.

Posto il codice per creare il grafico:

Private Sub CreaGrafico()
Dim myPane As GraphPane = zgcGrafico.GraphPane
Dim titolo, asseX As String
Dim sql, saldate, nomesaldate As String
Dim list = New PointPairList()


titolo = "Statistiche per Gruppi nell'anno " & dtpAnno.Value.Year & " , Gruppo: Tutti"
asseX = "Gruppi"

' Set Titolo e Nome Assi
myPane.Title.Text = titolo
myPane.XAxis.Title.Text = "Mesi"
myPane.YAxis.Title.Text = "Valore (€)"

'Query
sql = "SELECT idgruppo,SUM(importo) AS sommai " & _
"FROM entrate " & _
"WHERE Year(data)=" & dtpAnno.Value.Year & " ' GROUP BY idgruppo"

'esegue la query
Dim cmd As New OleDbCommand(sql, Cn)

Dim dr As OleDbDataReader

Try
'inserisce il risultato nel datareader
dr = cmd.ExecuteReader
'legge il datareader
While dr.Read()
Dim importo As Double
If dr.IsDBNull(1) = False Then
importo = dr.Item("sommai")
Else
importo = 0
End If

list.Add(dr.Item("id"), importo)
End While

dr.Close()
Catch ex As Exception
MessageBox.Show("Errore: " & ex.Message.ToString, "Errore..", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End Try
End Select

' Genero la barra con la leggenda
Dim myBar As BarItem = myPane.AddBar("Entrate (Saldate: Tutte)", list, Color.Blue)

' Riempio lo sfondo degli assi con un colore gradiente
myPane.Chart.Fill = New Fill(Color.White, Color.LightGoldenrodYellow, 45.0F)


myPane.Fill = New Fill(Color.White, Color.FromArgb(220, 220, 255), 45.0F)

myPane.XAxis.Scale.FontSpec.Angle = 90

myPane.XAxis.MajorTic.IsBetweenLabels = True

myPane.YAxis.Scale.Format = "C"

zgcGrafico.IsShowPointValues = True

' Calculate the Axis Scale Ranges
zgcGrafico.AxisChange()
End Sub


Il risultato è questo:

http://jackvc09.altervista.org/Grafico.JPG


e fin qui tutto ok adesso al posto dell'idgruppo sull'assex vorrei visualizzare il nome del gruppo dovrei cambiare la query in questo modo:

'Query
sql = "SELECT gruppo,SUM(importo) AS sommai " & _
"FROM gruppoentrate INNER JOIN entrate ON gruppoentrate.id = entrate.idgruppo " & _
"WHERE Year(data)=" & dtpAnno.Value.Year & " ' GROUP BY gruppo"

'esegue la query
Dim cmd As New OleDbCommand(sql, Cn)

Dim dr As OleDbDataReader

Try
'inserisce il risultato nel datareader
dr = cmd.ExecuteReader
'legge il datareader
While dr.Read()
Dim importo As Double
If dr.IsDBNull(1) = False Then
importo = dr.Item("sommai")
Else
importo = 0
End If

list.Add(dr.Item("gruppo"), importo)
End While

dr.Close()

Dim myBar As BarItem = myPane.AddBar("Entrate (Saldate: Tutte)", list, Color.Blue)


Adesso il problema è sulla riga in rosso perchè la lista (PointPairList() di ZedGraph) accetta solo campo double, lo stesso vale per la stringa il blu dove va la lista li si accetta solo un campo double.

Come posso fare per visualizzare i nomi del gruppo?

Grazie in anticipo a tutti

jackk87
04-02-2011, 15:32
up

jackk87
13-02-2011, 14:03
up :help:

jackk87
13-02-2011, 14:32
Sono riuscito a risolvere il problema.
Lo posto così se può servire a qualcun'altro che ha lo stesso problema:

Ho modificato la query dove prima utilizzavo un pointparlist() adesso invece utilizzo un datasourcepointlist() dove lo chiamp dspl:

sql = "SELECT gruppo,SUM(importo) AS sommai " & _
"FROM gruppoentrate INNER JOIN entrate ON gruppoentrate.id = entrate.idgruppo " & _
"WHERE Year(data)=" & dtpAnno.Value.Year & " AND Saldata<>'" & saldate & "' GROUP BY gruppo"

Dim DS As New DataSet 'Variabile per DataSet
Dim DA As OleDb.OleDbDataAdapter 'crea il dataadapter

Try
'Dataset
DS = New DataSet("entrate")
'DataAdapter
DA = New OleDb.OleDbDataAdapter(sql, Cn)
DA.Fill(DS, "entrate")

dspl.DataSource = DS.Tables(0)

dspl.XDataMember = "gruppo"
dspl.YDataMember = "sommai"
Catch ex As Exception
MessageBox.Show("Errore: " & ex.Message.ToString, "Errore..", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End Try


poi prima di associare la query alla barra (dove dgwriepiloco è un datagridview che contiene il nome del gruppo delle entrare si può utilizzare anche una query):


myPane.XAxis.Scale.FontSpec.Angle = 90

Dim nomegruppo(dgwRiepilogo.Rows.Count - 1) As String

For i = 0 To dgwRiepilogo.Rows.Count - 1
nomegruppo(i) = dgwRiepilogo.Item(0, i).Value
Next

myPane.XAxis.Type = AxisType.Text
myPane.XAxis.Scale.TextLabels = nomegruppo


e infine associare la query alla barra:


Dim myCurve As BarItem = myPane.AddBar("Entrate (Saldate: " & nomesaldate & ")", dspl, Color.Blue)