Newsgroup: it.comp.lang.visual-basic
Titolo: combo box con elementi caricati da database

Chiedo ancora una volta iuto a questo newsgroup che + volte mi ha cavato
d'impiccio :-)
ho un semplice database che contiene i prodotti ed il relativo codice.
In un form di visual basic, come posso fare per caricare in una combo box
tutti i nomi dei prodotti dalla tabella del database per poterne scegliere
1?
Inoltre, in una list box, ad esempio, come posso visualizzare il riepilogo
di tutti i prodotti che ho scelto? La voglio utilizzare come una specie di
carrello della spesa... e magari farci delle operazioni..
vi prego aiutatemi!
Grazie a tutti

 di tutti i prodotti che ho scelto?
oggetto.AddItem stringa
Sia per (oggetto) il Combo che per il ListBox

il problema è che "stringa" è un record composto dai campi nome prodotto,
codice e quantità...
come fare?
E poi come faccio per caricarli dal database? immagino debba inserire
sequenzialmnte ttutti i record della tabella, ma qual'è l'istruzione che mi
fa avanzare con i record del dtabase?
E poi rimane il problema che non posso caricare un record nella combo..
C'è qualche metodo alternativo che mi automatizzi la corrispondenza tra nome
del prodotto e codice? Oppure devo caaricarmi la tabella dei in un vettore
di record e cercare il codice corrispndente al solo nome del prodotto scelto
dalla combo?
Cmq come faccio a realizzare il mio "carrello della spesa"? mica devo
inserire una listbox per ogni campo (nome, codice e quantità) e lavorarci in
corrispondenza di indici?

 E poi come faccio per caricarli dal database?
Se ti dico
"Select * From Tabella Where Campo1=123 And Campo2='abc' Order By Campo3"
e poi
Combo1.Additem recordset!Campo_Codice
tu ci capisci qualcosa?
Se no devi prima studiarti il linguaggio SQL e tutti gli strumenti per la
gestione, scrittura, lettura e navigazione di un database...

 corrispondenza di indici?
Se vuoi usare il listbox per esporre tutti i campi dell'articolo corrente,
non devi far altro che recuperli dal database ad ogni cambio del codice del
combobox e poi ripulire e ricaricare la listbox...

si, conosco le interrogazioni in SQL, ma dove lo devo scrivere questo
codice?
Poi non ho capito bene che fa
Combo1.Additem (recordset!Campo_Codice)
...cosa mi aggiunge alla combo?
forse significa "aggiungi alla combo il record con chiave CAMPO_CODICE
prelevato da recordset (non ho ancoara ben capito che diavolo č sto
recordset)
cmq mi 6 davvero di grande aiuto! Grazie!

 cmq mi 6 davvero di grande aiuto! Grazie!
Prego, ma non mi hai ancora risposto: La guida ce l'hai o no?
Seriamente, ho la sensazione che ti serva un po' di teoria. Comprati un
libricino che parli di database e SQL...

la guida ce l'ho, ma non funziona correttamente, ad esempio non sono
presenti i collegamenti agli esempi, alle proprietà ai metodi... quindi non
mi è di grande aiuto.
Il mio problema è integrare l'sql in visual basic... e poi ho detto conosco
bene il comando SELECT, non il resto.
Però imparo in fretta, in quello che hai scritto sarebbe tutto chiarissimo
se avessi capito cos'è il recordset e come si apre... ho capito che
rappresenta l'insieme dei record che visualizzo, ed è associato ad un
controllo data al quale collego tutte le textbox che mi servono ecc.
sull'evento form.load che devo fare per aprire?
ho bisogno di capire solo quello che viene prima di "Ora hai il recordset"
:-) e di capire come si avanza dal primo all'ultimo record.
(il database è realizzato con access 2000)
ti ringrazio molto della tua pazienza....

>di capire come si avanza dal primo all'ultimo record.
che stupido! con movenext :-)

ho provato a scrivere questo codice..
Private Sub Form_Load()
 Data1.Recordset.MoveFirst
 For i = 1 To Data1.Recordset.RecordCount
  cmbNome.AddItem (Data1.Recordset!nome)
  Data1.Recordset.MoveNext
 Next i
End Sub
ma come era prevedibile non funziona...  mi dice, riguardo a
Data1.Recordset.MoveFirst
errorre di runtime 91
variabile oggetto o variabile del blocco with non impostata

mi ero dimenticato di impostare data1.recordsource..
cmq quando tento di farlo di dice formato di database non riconosciuto

 ho provato a scrivere questo codice..

Ho la sensazione di essermi incastrato... ;-)
Non uso i controlli Data (li odio visceralmente), ma faccio tutto da codice.
Comunque (vado a naso e potrei dire una frescaccia), prova con
Data1.MoveFirst

leggi il mio post precedente... mi sa che devo finire qua... se non mi
riconosce il formato del database č inutile che proseguo

 riconosce il formato del database è inutile che proseguo
Se usi DAO, fra i riferimenti togli DAO 3.5x metti DAO 3.6

invece ho convertito il database in access 97 e funziona (tanto non devo
fare niente di particolare...)
scusa ma da codice come fai a gestire il recordset? mi illustreresti le
istruzioni di apertura e gestione senza utilizzare il controllo data

 invece ho convertito il database in access 97 e funziona (tanto non devo

Vedi (e studia) il codice qui sotto. Presume ADO, ma è facilmente adattabile
le DAO
--------------------------------------------------------------------
'Dichiarare fra i riferimenti Microsoft ActiveX Data Object Library (della
versione pia' alta disponibile)
'Aprire un progetto con un form. Nessun controllo sul form. Incollare il
codice che segue:
Option Explicit
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim db_nome As String
Private Sub Form_Load()
    Me.AutoRedraw = True
    If chiede_database = "" Then Unload Me
End Sub
Private Sub Form_Activate()
    Dim comando_sql As String
    Dim totale_records As Long
    comando_sql = ""
    Do
        Do
            comando_sql = InputBox("Imposta il comando SQL (di tipo Select)
da eseguire" & vbNewLine & "sul database:" & vbNewLine & db_nome & vbNewLine
& vbNewLine & "(Annulla per cambiare database)", , comando_sql)
            If comando_sql <> "" Then Exit Do
            If chiede_database = "" Then Exit Sub
        Loop
        If apri_recordset(conn, rs, comando_sql) = 0 Then
            If rs.BOF = True And rs.EOF = True Then
                Call MsgBox("Non vi sono records!", vbOKOnly +
vbExclamation)
            Else
                Me.Cls
                Me.Print "ATTENDERE LO SCORRIMENTO DEI RECORDS: " &
rs.RecordCount
                Me.Refresh
                rs.MoveFirst
                totale_records = 0
                Do
                    If rs.EOF Then Exit Do  'Fine records
                    totale_records = totale_records + 1
'                       Trattare i campi come desiderato
                    'campo1 = rs!Nome_Campo1
                    'campo2 = rs!Nome_Campo2
                    '...
                    rs.MoveNext
                Loop
                Me.Cls
                Call MsgBox("Trovati " & totale_records & " records",
vbOKOnly + vbInformation)
            End If
            Call chiudi_recordset(rs)
        End If
    Loop
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Call chiudi_recordset(rs)
    Set rs = Nothing
    Call chiudi_connessione(conn)
    Set conn = Nothing
End Sub
Function chiede_database() As String
'   Restituisce il percorso e nome del database
    Dim db_password As String
    chiede_database = ""
    Do
        db_nome = InputBox("Imposta il percorso e il nome del database
(Access)" & vbNewLine & vbNewLine & "(Annulla per terminare)", , db_nome)
        If db_nome = "" Then
            Unload Me
            Exit Function
        End If
        If Dir(db_nome) <> "" Then Exit Do
        Call MsgBox("Il file" & vbNewLine & db_nome & vbNewLine & "non
esiste!", vbExclamation)
    Loop
    chiede_database = db_nome
    db_password = InputBox("Imposta la password del database" & vbNewLine &
vbNewLine & "(Annulla se assente)")
    Call apri_connessione(conn, db_nome, db_password)
End Function
Sub apri_connessione(connessione_passata As ADODB.Connection, nome_database
As String, password_database As String)
    Dim stringa_connessione As String
    stringa_connessione = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" &
nome_database & ";USER ID=;"
    If password_database <> "" Then
        stringa_connessione = stringa_connessione & "Jet OLEDB:Database
Password=" & password_database & ";"
    Else
        stringa_connessione = stringa_connessione & "PASSWORD=;"
    End If
    Call chiudi_connessione(connessione_passata)
    connessione_passata.Open stringa_connessione
End Sub
Sub chiudi_connessione(connessione_passata As ADODB.Connection)
    If connessione_passata Is Nothing = False Then
        If connessione_passata.State <> adStateClosed Then
connessione_passata.Close
    End If
End Sub
Function apri_recordset(connessione_passata As ADODB.Connection,
recordset_passato As ADODB.Recordset, comando_sql As String) As Long
'   In caso di errore restituisce il codice, viceversa 0
    Call chiudi_recordset(recordset_passato)
    apri_recordset = 0
    On Error GoTo errore
    recordset_passato.Open comando_sql, connessione_passata, adOpenStatic,
adLockOptimistic
dopo_errore:
    On Error GoTo 0
    Exit Function
errore:
    apri_recordset = Err.Number
    Call MsgBox("Errore Codice:" & vbNewLine & vbNewLine & Err.Number &
vbNewLine & vbNewLine & "Descrizione:" & vbNewLine & vbNewLine &
Err.Description, vbOKOnly + vbCritical)
    Resume dopo_errore
End Function
Sub chiudi_recordset(recordset_passato As ADODB.Recordset)
    If recordset_passato Is Nothing = False Then
        If recordset_passato.State <> adStateClosed Then
recordset_passato.Close
    End If
End Sub


 Ti consiglio di ignorare quell'accozzaglia di codice che ti è stato postato
sopra, non tanto perchè non funzioni ( a dir la verità non lo so ma se
funziona è davvero un miracolo...) ma semplicemente per il "vomitevole" modo
con il quale è stato scritto.
Credimi lo dico per il tuo bene ( da programmatore ? ).
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 con il quale è stato scritto.
Ora, però, basta chiacchiere e ci fai vedere come lo scrivi tu.
Sei obbligato, per tuo stesso volere.
Non capirò mai perchè l'hai fatto, ma hai vinto.
Le idee che io posso avere sulla tua persona, e su altri tuoi nick, non mi
faranno perdere un minuto solo del mio tempo. Credo, comunque, di aver
diritto al canto del cigno: "Imbecille".

 diritto al canto del cigno: "Imbecille".
  ngueeeeeee ngueeeeee ngueeeeeeee


se č un'accozzaglia di codice scrivimi tu qualcosa di pi semplice... non per
dimostrare qualcosa a qualcuno, ma per aiutarmi... ok?
ti ringrazio in anticipo


  Con molto piacere, se mi contatti per E.Mail ti invio un pň di codice!
Ciao a presto
