PDA

Visualizza versione completa : query SQL in VB6


maefe
08-11-2007, 13.31.23
Ho cercato nel forum ma non ho trovato una risposta SU come visualizzare il VB6 una query fatta in SQL.

Mi spiego meglio, fatta una qualsiasi query usando SQL, come posso mostrare il risultato in una casella di testo?

grazie

LoryOne
08-11-2007, 14.32.32
Dopo che il motore SQL ha elaborato il risultato, quest' ultimo è memorizzato in un recordset.
Un recordset è come un foglio di Excel,una tabella di ACCESS, una tabella di Word, una griglia in pratica.
Così come accedi alle celle specificando riga e colonna, così accedi ai record distinti attraverso delle proprietà del recordset.

maefe
08-11-2007, 14.37.43
che sarebbe quello della tabella che ho interrogato.

se dovessi usare il comando GROUP (che evita i doppi, unendo diversi record) vedo solo un record?

LoryOne
08-11-2007, 14.45.28
Ti riferisci a GROUP BY ... HAVING del linguaggio SQL ?
Guarda, ti spiego da cosa deriva la parola Recordset.
Record(Riga) Set(righe), ossia gruppo di righe.

LoryOne
08-11-2007, 14.47.55
che sarebbe quello della tabella che ho interrogato.

se dovessi usare il comando GROUP (che evita i doppi, unendo diversi record) vedo solo un record?

Mmm, SELECT DISTINCT[Row]

maefe
08-11-2007, 15.10.37
grazie anche se sono al punto di prima.
una volta fatta la query sul mio database (access), con

do until eof
....

elenco i records filtrati?

LoryOne
08-11-2007, 15.15.43
Furbastro (Y)
Tu hai scoperto il modo più veloce per creare una query sintatticamente corretta ed interpretabile dal motore JET/ODBC.
Avendo creato le relazioni tra tabella, la query si forma da sola.
Muy bien, ma devi capire che SQL è un po come il linguaggio parlato.
Detto questo, devi far riferimento al motore, poi eseguira la query ed agire sul recordset.
do until eof, ecc, ecc.
Si, il senso è quello, ma è l'EOF del recordset.
non ti dico altro, ora è tempo che procedi da solo.
You're on the right way. Good luck.

maefe
08-11-2007, 15.25.50
mi è piaciuto il "furbastro".
le query semplici, riesco a gestirle e visualizzarle scorrendo il database record per record.
mi manda in crisi il GROUP.

maefe
09-11-2007, 08.46.54
noto con rammarico che non riesco ad ottenere alcun aiuto.
se mi sono rivolto al forum è perchè evidenti miei limiti non mi hanno consentito di proseguire nonostante gli inviti a proseguire da solo.
un grazie sincero comunque.

maefe
10-11-2007, 15.31.50
mi permetto di insistere.
Ho risolto parzialmente il problema scrivendo qualche riga di codice in + come sege:

Filtro$ = "SELECT * FROM BOLLE WHERE NUMEROFATTURA <> NULL ORDER by NUMEROFATTURA,NUMEROBOLLA"
FrmMENU.DB_BOLLE.RecordSource = Filtro$
FrmMENU.DB_BOLLE.Refresh

TreeView1.Nodes.Clear
skey = GetNextKey()
'iIndex = TreeView1.SelectedItem.Index
Dim INCREMENTO As Integer
INCREMENTO = 1
With DB_BOLLE.Recordset
.MoveLast
.MoveFirst
INCREMENTO = .RecordCount
If .RecordCount > 0 Then

M_Fattura1 = .NUMEROFATTURA
M_Fattura2 = .NUMEROFATTURA
Set Node = TreeView1.Nodes.Add(, , "Node " & DB_BOLLE.Recordset("ID").Value, DB_BOLLE.Recordset("NUMEROFATTURA").Value & " - " & DB_BOLLE.Recordset("NOMECLIENTE").Value)

Do Until .EOF
M_Fattura1 = .NUMEROFATTURA
If M_Fattura1 = M_Fattura2 Then

Set Node1 = TreeView1.Nodes.Add(Node, tvwChild, "Node1 " & DB_BOLLE.Recordset("ID").Value, DB_BOLLE.Recordset("NUMEROBOLLA").Value & " - " & DB_BOLLE.Recordset("NOME_PRODOTTO").Value)
Else
Set Node = TreeView1.Nodes.Add(, , "Node " & DB_BOLLE.Recordset("ID").Value, DB_BOLLE.Recordset("NUMEROFATTURA").Value & " - " & DB_BOLLE.Recordset("NOMECLIENTE").Value)
Set Node1 = TreeView1.Nodes.Add(Node, tvwChild, "Node1 " & DB_BOLLE.Recordset("ID").Value, DB_BOLLE.Recordset("NUMEROBOLLA").Value & " - " & DB_BOLLE.Recordset("NOME_PRODOTTO").Value)
End If
M_Fattura2 = M_Fattura1
TreeView1.Refresh
INCREMENTO = INCREMENTO - 1
Label10.Caption = "Mancano ancora " & INCREMENTO & " records"
Label10.Refresh
If INCREMENTO = 0 Then Exit Do
.MoveNext
Loop

End If

End With
Label10.Caption = "Finito!"
MousePointer = 0

il treeview viene popolato dalla query, ma ho il seguente problema:
quando la variabile INCREMENTO è = 0, ossia ho finito il popolamento, anzichè vedere "finito" nel label10, il pc mi si ferma per almento 5 minuti.
cosa sta succedendo?

LoryOne
10-11-2007, 18.15.27
"Mancano ancora " & INCREMENTO & " records"
Quanto vale INCREMENTO quando si blocca per 5 min ?

maefe
11-11-2007, 13.39.57
la variabile INCREMENTO l'ho messa per vedere il pc che lavora e dare la sensazione che sta succedendo qualche cosa.
quando lo vedo a 0, ossia ' alla fine del recordset, dovrebbe uscire dal ciclo do until .eof e mostrarmi la label con "finito!|". invece questa appare dopo diversi minuti.
potrebbe essere un problema legato al treview? questa routine la uso in diversi altri casi (ma non con il controllo treeview) e funziona alla grande.

LoryOne
11-11-2007, 13.53.14
http://www.devx.com/vb/Article/9707
Questo articolo dovrebbe esserti uitle a comprendere come gestire il treeview.

LoryOne
11-11-2007, 14.13.52
Il treeview è il controllo VB più difficile da gestire in quanto è quello che consuma più memoria rispetto a tutti gli altri. Non bisognerebbe mai abusarne.

LoryOne
11-11-2007, 14.25.47
la variabile INCREMENTO l'ho messa per vedere il pc che lavora e dare la sensazione che sta succedendo qualche cosa.


Potresti inserire una barra di scorrimento.
il numero di record presenti nel recordset lo conosci.
L'incremento pure. Aggiungeresti un controllo, è vero, ma faresti a meno di una variabile inutile e daresti un tocco di profesisonalità al tuo software.
Ho notato anche che aggiungi refresh alla caption ed al controllo treeview.
E' inutile utilizzarla a meno che l'eleborazione sia così pesante da non consentire il refresh dei componenti.
Basta aggiungere un DoEvents affinchè il S.O. possa finire di elaborare i processi in sospeso.

LoryOne
11-11-2007, 14.38.47
Vedo pure che il recordset deriva da un controllo data associato ad un DB e popolato da una query.
Questo controllo data è visibile ed utilizzabile, oppure lo hai messo solo per crearti il recordset ?
Io ti consiglio di leggerti la guida a proposito di OpenDatabase e OpenRecordset e di far il minor uso possibile dei controlli Data associati a DB.

maefe
12-11-2007, 10.56.39
grazie per la risposta sei stato molto gentile
il refresh lo avevo messo per dare l'idea che qualche cosa stava succedendo, come pure la label.
il treeview 'ho messo per dare maggior chiarezza nei dati anzichè usare il dbgrid che ti fa vedere ogni singolo record. con il treeview avrei avuto la possibilità attraverso i nodi di dar modo all'utente di selezionare ed eventualmente espandere la vista.
credo che abbandonerò questa idea caricando i dati in un combo per poi, alla selezione mostrare il dettaglio in un altro controllo.
ultima domanda:
non è possibile mostrarre il risultAto di una query usando GROUP BY in un dbgrid o in un combo?

LoryOne
12-11-2007, 13.18.52
A ridaje :D :D
Come ti ho già detto, ti consiglio di leggerti la guida a proposito di OpenDatabase e OpenRecordset e di far il minor uso possibile dei controlli Data associati a DB.
Il controllo data crea lui stesso un recordset, consente di spostarsi tra i record con i pulsanti che rende disponibili all' utente con le pressioni dei tasti relativi, ossia fa ricorso ai metodi referenti al recordset che gestisce.
Tu devi essere in grado di accedere al DB e crearti tu stesso un recodset, compilandolo in base alla query del caso.
Per quanto riguarda il GROUP BY, c'è sempre un HAVING che specifica la condizione di raggruppamento.
In rete trovi molti manuali SQL ben fatti, oltre allo stesso ACCESS.

maefe
13-11-2007, 10.51.35
grazie per la risposta.
ho visto che il risultato lo vedo automaticamente con il controllo dbgrid e penso così di aver risolto finalemte il mio problema e essermi aperto nuove strade con il linguaggio sql che è molto + veloce del codice che scrivevo io.

LoryOne
13-11-2007, 11.25.47
Infatti è molto veloce
Altre strade, altri componenti
http://www.vbaccelerator.com/home/index.asp