Combobox e database

di il
36 risposte

36 Risposte - Pagina 2

  • Re: Combobox e database

    Moto bene grazie. sempre nelle query che mi hai aiutato a fare, vorrei ora selezionare due attributi e non più uno. seguendo i suggerimenti di visual studio ho fatto
    Dim tavola As DataTable = GolfDataSet.Tables("Gare")        'cerco il tipo di gara e la data
            Dim v = From o In tavola
                    Where o.Item("Denominazione") = ComboBoxGara.Text
                    Select o.Item("Tipo"), o.Item("Data")
    ma dà errore e dice "range variable name can be infered only..."
    una soluzione sarebbe tipo
    ...
    select nome1 = o.Item("Tipo"), nome2 = o.Item("Gara")
    ma poi dentro a v(0) troverei "nome1 = ...".
    Come si può fare?
  • Re: Combobox e database

    Ciao minomic,

    Intanto potresti cominciare con selezionare tutti i campi in questo modo:
    
            Dim v = From o In tavola
                    Where o.Item("Denominazione") = ComboBoxGara.Text
                    Select o
    
            Dim s = v(0).Item("Denominazione") + " " + v(0).Item("CampoTalDelTali")
    
    Avresti una lista di record con tutti i campi, poi ne fai quello che vuoi.

    Oppure puoi scrivere:
    
            Dim v = From o In tavola
                    Where o.Item("Denominazione") = ComboBoxGara.Text
                    Select Tipo = o.Item("Tipo"), Data = o.Item("Data")
    
            Dim s As String = v(0).Tipo + " " + v(0).Data
    
    In pratica hai creato una lista di 'tipi anonimi' con in campi Data e Tipo (vedi Anonymous Type).

    Edit: nota che nei due esempi il tipo di 'v' cambia, anche se non lo scrivi è tipizzato, nel secondo caso sarebbe un 'System.Data.EnumerableRowCollection(Of <anonymous type>)' decisamente scomodo da scrivere.
  • Re: Combobox e database

    Perfetto come al solito. grazie!
  • Re: Combobox e database

    Avrei un altro quesito: sto cercando, tramite un clic su un bottone, di applicare delle modifiche a certi valori contenuti in una tabella del database.
    Ho provato a fare così
    Dim adapter_giocatori = New golfDataSetTableAdapters.GiocatoriTableAdapter
            Dim tablePrima As DataTable = GolfDataSet.Tables("RisultatiPrima")
            Dim tableSeconda As DataTable = GolfDataSet.Tables("RisultatiSeconda")
            Dim tableGiocatori As DataTable = GolfDataSet.Tables("Giocatori")
    
            Dim v = From o In tablePrima
                    Where o.Item("Netto") < 32
                    Select o.Item("Nome")
    
            Dim w = From o In tableGiocatori
                    Where o.Item("Nome") = v(0)
                    Select o.Item("Handicap") = o.Item("Handicap") + 0.1
    
            adapter_giocatori.Update(GolfDataSet)
            GolfDataSet.AcceptChanges()
    ma non succede nulla!
    In pratica dovrei vedere nella tabella risultati chi ha fatto meno di 32, prendere il suo nome, andare nella tabella giocatori e aumentare l'handicap di quel giocatore di 0.1
    Dove sbaglio?
  • Re: Combobox e database

    Ciao minomic,
    vedo che stai usando il LINQ a manetta!

    L' operatore 'Select' è un operatore di 'proiezione' permette di effettuare trasformazioni sui risultati di una query (quindi normalmente crea nuovi oggetti), se ad esempio scrivi:
    
    var v = FROM o in Ordini Select o.Id
    
    L' elenco sarà un elenco di interi e non di 'Ordini', oppure si possono creare oggetti anomini (ne abbiamo già parlato) ecc. Nel tuo esempio l' elenco 'w' contiene degli oggetti creati a partire da quelli nella tabella, ma sono altri oggetti, se li modifichi non alteri quelli nella tabella.

    Puoi fare cosi:
    
            Dim w = From o In tableGiocatori
                    Where o.Item("Nome") = v(0)
                    Select o  
    	
            For Each row As DataRow In W
                row("Handicap") = row("Handicap") + 0.1
    
            adapter_giocatori.Update(GolfDataSet)
            GolfDataSet.AcceptChanges()
    
    In questo esempio la select non crea dei duplicati ma restituisce i DataRow contenuti nella tabella, quindi la loro modifica sarà poi salvata.

    P.S. Una curiosità che database usi?
  • Re: Combobox e database

    P.S. Una curiosità che database usi?
    intendi come tipo di database? E' un database di access .accdb
    appena ho tempo provo le soluzioni che mi hai postato e ti so dire se funzionano, anche se non ho molti dubbi...

    EDIT: ho pensato che forse volevi sapere cosa c'è dentro al database... si tratta delle gare, dei giocatori e dei risultati delle gare di un circolo di golf. la parte di database è insieme a una parte "matematica" che fa i calcoli dei punteggi, eccetera, poi torna nella parte database e applica le modifiche del caso.
  • Re: Combobox e database

    Mmm no c'è qualche problema. Il codice che mi avevi dato tu funzionava, ma applicava la variazione solo a un giocatore, credo per via di quel v(0) che quindi tralascia gli eventuali v(1), v(2), ...
    Ho provato a risolvere così
    Dim v = From o In tablePrima
                    Where o.Item("Netto") < 32
                    Select o.Item("Nome")
    
            For Each player As Object In v
                Dim w = From o In tableGiocatori
                                Where o.Item("Nome") = v(0)
                                Select o
    
                For Each row As DataRow In w
                    MsgBox(row("Nome") & "  " & row("Handicap"))
                    row("Handicap") = row("Handicap") + 0.1
                Next
            Next
    ma il risultato è che la variazione viene applicata due volte allo stesso giocatore, credo sempre a causa di quel v(0).
    Questo è un altro tentativo che ho fatto.
    Dim v = From o In tablePrima
                    Where o.Item("Netto") < 32
                    Select o
    
            For Each riga As DataRow In v
                Dim w = From o In tableGiocatori
                                            Where o.Item("Nome") Is v("Nome")
                                            Select o
    
                For Each row As DataRow In w
                    MsgBox(row("Nome") & "  " & row("Handicap"))
                    row("Handicap") = row("Handicap") + 0.1
                Next
            Next
    Secondo me ha un po' più di senso, ma dà errore di conversione qui
    Where o.Item("Nome") Is v("Nome")
    EDIT: forse ho risolto così
    Dim v = From o In tablePrima
                    Where o.Item("Netto") < 32
                    Select o
    
            For Each riga As DataRow In v
                Dim w = From o In tableGiocatori
                        Where o.Item("Nome") = riga("Nome")
                        Select o
    
                For Each row As DataRow In w
                    MsgBox(row("Nome") & "  " & row("Handicap"))
                    row("Handicap") = row("Handicap") + 0.1
                Next
            Next
    In questo modo funziona bene però bisogna sempre vedere se c'è del senso in quello che ho scritto... In particolare visual studio mi dice che non dovrei usare "riga" dentro alla query...
  • Re: Combobox e database

    Penso di aver risolto tutti i problemi.
     Dim risposta As MsgBoxResult
            risposta = MsgBox("Vuoi applicare le variazioni handicap?", MsgBoxStyle.YesNo, "Attenzione!")
    
            If risposta = MsgBoxResult.Yes Then
    
                Dim adapter_giocatori = New golfDataSetTableAdapters.GiocatoriTableAdapter
                Dim tablePrima As DataTable = GolfDataSet.Tables("RisultatiPrima")
                Dim tableSeconda As DataTable = GolfDataSet.Tables("RisultatiSeconda")
                Dim tableGiocatori As DataTable = GolfDataSet.Tables("Giocatori")
                adapter_giocatori.Fill(GolfDataSet.Tables("Giocatori"))
    
                Dim v = From o In tablePrima
                       Select o
    
                For Each riga As DataRow In v
                    Dim score As Integer = riga("Netto")
                    Dim w = From o In tableGiocatori
                            Where o.Item("Nome") = riga("Nome")
                            Select o
    
                    For Each row As DataRow In w
                        row("Handicap") = variazione(Convert.ToSingle(row("Handicap")), score)
                    Next
                Next
    
                adapter_giocatori.Update(GolfDataSet)
                GolfDataSet.AcceptChanges()
                MsgBox("Variazioni applicate")
    
            End If
    
        End Sub
    
        Public Function variazione(ByVal hcp_part As Single, ByVal score As Integer)
            If score < 32 Then
                hcp_part = hcp_part + 0.1
            ElseIf score > 36 Then
                For i As Byte = 37 To score
                    If hcp_part <= 6 Then
                        hcp_part = hcp_part - 0.2
                    ElseIf hcp_part > 6 And hcp_part < 13 Then
                        hcp_part = hcp_part - 0.3
                    ElseIf hcp_part >= 13 Then
                        hcp_part = hcp_part - 0.5
                    End If
                Next
            End If
    
            hcp_part = Math.Round(hcp_part, 3)
            Return hcp_part
        End Function
    Forse non è la soluzione più elegante o efficiente ma sembra funzionare. Se qualcuno ha qualche suggerimento...sono qui!
  • Re: Combobox e database

    Rieccomi, avrei un'altra domanda sull'interazione tra programma e database.
    Mi avevi spiegato come eseguire alcune query usando LINQ, ma come dovrei fare se volessi usare SQL (che conosco meglio)?
    Avevo letto in rete che si salva la query in una stringa però poi, negli esempi che ho visto, al momento di chiamarla si presuppone che il collegamento con il database sia stato fatto via codice e che quindi si abbia un oggetto Conn (cioè una connection) che io ovviamente non ho (dato che ho usato il wizard). Come posso fare quindi?
  • Re: Combobox e database

    Ciao minomic
    A creare una connessione si fa prima a farlo che a dirlo:
    
            Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Store.mdb;"
            Dim con As OleDbConnection = New OleDbConnection(connectionString)
            con.Open()
            Dim query As String = "SELECT * FROM Products"
            Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(query, con)
            Dim table As DataTable = New DataTable()
            adapter.Fill(table)
    
            ' riempi i datagrid o i list box ecc
    
            con.Close()
    
    Il fatto di avere usato il Wizard non ti vieta di aprire una connessione quando ti pare, personalmente preferisco fare tutto da codice e non usare i wizard, però sono gusti.

    Un motivo per preferire la creazione via codice ad esempio è che magari il percorso del database varia da installazione a installazione e quindi và letto da un file di configurazione, probabilmente non è il tuo caso, era solo per dire che lavorare da codice è più flessibile.
  • Re: Combobox e database

    Ottimo! grazie delle informazioni
  • Re: Combobox e database

    Ho qualche problema: la grid resta vuota. Posto il codice
    
    Private Sub ComboBoxNome_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBoxNome.SelectedIndexChanged
            nome_scelto = ComboBoxNome.Text
            Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=golf.accdb;"
            Dim con As OleDb.OleDbConnection = New OleDb.OleDbConnection(connectionString)
            con.Open()
            Dim query As String = "select Gara, Handicap, Netto, Lordo from Risultati where Nome = '" & nome_scelto & "'"
            MsgBox(query)
            Dim adapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(query, con)
            Dim table As DataTable = New DataTable()
            adapter.Fill(table)
            DataGridView1.DataSource = adapter
            con.Close()
        End Sub
    EDIT: ho risolto
    ...
    adapter.Fill(table)
            Dim riempimento As DataView = New DataView(table)
            DataGridView1.DataSource = riempimento
  • Re: Combobox e database

    Ciao, ho un problemino: come ormai ben sai in un form c'è una combobox che visualizza l'elenco delle gare (prese dalla tabella "gare" del database). Ho aggiunto la possibilità di inserire una nuova gara: l'utente clicca sul menu "Amministrazione" -> inserisci nuova gara -> si apre un nuovo form nel quale si inseriscono le informazioni -> si clicca il bottone "inserisci". Tutto funziona bene ma quando chiudo questo form e torno quindi a quello principale l'elenco delle gare non è aggiornato e non lo sarà fino al riavvio dell'applicazione.
    Questo è ovvio perchè l'elenco delle gare viene caricato nell'evento load del form1 e una volta caricato resta quello. C'è un modo per far aggiornare l'elenco all'uscita dal form2?
    Sicuramente si potrebbe chiudere il form1 quando si apre il 2 e poi aprire un altro form1 quando si chiude il 2, ma vorrei che l'1 rimanesse aperto...
    Alla chiusura del form2 avevo provato a scrivere
    
    Dim dataset = New golfDataSet
            Dim adapter_gare = New golfDataSetTableAdapters.GareTableAdapter
            adapter_gare.Fill(dataset.Tables("Gare"))
            Dim ordinare_gare As DataView = New DataView(dataset.Tables("Gare"))
            ordinare_gare.Sort = "Data ASC"
            Form1.ComboBoxGara.DataSource = ordinare_gare
            Form1.ComboBoxGara.DisplayMember = "Denominazione"
    
    ma non funziona...
  • Re: Combobox e database

    Ciao minomic

    minomic ha scritto:


    Questo è ovvio perchè l'elenco delle gare viene caricato nell'evento load del form1 e una volta caricato resta quello.
    Mi puoi far vedere come carichi l' elenco nel Form Load?
  • Re: Combobox e database

    Certo! c'è questa prima riga inserita direttamente da visual studio
    Me.GareTableAdapter.Fill(Me.GolfDataSet.Gare)
    e poi ho messo
    Dim ordinare_gare As DataView = New DataView(GolfDataSet.Tables("Gare"))
            ordinare_gare.Sort = "Data ASC"
            ComboBoxGara.DataSource = ordinare_gare
            ComboBoxGara.DisplayMember = "Denominazione"
    tutto questo nell'evento load del form1
Devi accedere o registrarti per scrivere nel forum
36 risposte