Bottaweb
Ciao,
come va ? ho letto i capitoli relativi alla programmazione dei database con ADO e volevo porti alcune domande... :-)
Volevo realizzare una sub che conti , cosi' come fatto per la frequenza, tutti i numeri che iniziano con 1 con 2 ...8 . insomma le cosiddette decine.Da SQL un' operazione di questo tipo la si ottiene con la sintassi "1%" quindi ho implementato questa routine con i che varia da 0 a 8 ma non riesco a capire come inserire % , difatti non mi funziona
Private Sub Command5_Click()
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.CursorLocation = adUseServer
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2.mdb;Jet OLEDBatabase;"
rs.CursorLocation = adUseServer
For i = 0 To 8 Step 1
rs.Open "SELECT COUNT(*) AS TOTALE FROM STORICO WHERE RUOTA='BA' AND PRIMO='" & i & "';", cn ' dove lo metto %?
' ho inserito solo primo per esempio
totale1 = rs(0)
MsgBox totale1
rs.Close
Next
End Sub
Volendo sfruttare le query parametriche( leggendo i capitoli ho capito xchè sono + veloci) il problema mi si ripresenta non sapendo combinare % con ?.
tipo...
'cmdCalcola.CommandText = "SELECT COUNT(*) AS TOTALE FROM STORICO WHERE PRIMO=? OR SECONDO=? OR TERZO=?.........
cmdCalcola.Parameters("UNO").Value = stringa + "%"
' cmdCalcola.Parameters("DUE").Value = stringa + "%"
' cmdCalcola.Parameters("TRE").Value = stringa + "%"
.....
ecc ecc ...ma davvero sto andando per intuito ..il libro non dice come fare...
Ho letto che con il DataEnviroment molte operazioni vengono smplificate . Una volta creata la connection si crea la command che viene richiamata da codice. Ad esempio trascinando la command nel form si creano automaticamte i campi per i record solo che per spostarsi bisogna creare 2 bottoni con eventi del tipo:
Private Sub Command1_Click()
DataEnvironment1.rsCommand1.MoveNext
End Sub
Private Sub Command2_Click()
DataEnvironment1.rsCommand1.MovePrevious
End Sub
ogni record contiene una singola esrtazione per una ruota . Anche usando dei controlli associati all'oggetto ADO riesco a spostarmi su una singola ruota ...ma io vorrei visualizzare , e magari poter modificare tutte e 10 le estrazioni di una singola data. Cioè 50 Text relative alle 10 ruote . Con ADO vorrei spostarmi di 10 in 10 . Oppure avevo pensato di realizzare una query paramentrica con DataEnv. inserendo nel form:
Private Sub Form_Load()
DataEnvironment1.Command3 "12/02/2002"
Set DataGrid1.DataSource = DataEnvironment1.rsCommand3
End Sub
con Command3 in DataEnv. del tipo SELECT * FROM STORICO WHERE data = ? ma mi da errore di sintassi. Come iserire i parametri in Dataenviroment :-(
Un ultima cosa :-) . Tempo fa ho realizzato un'applicazione di rete con Java per la comunicazione client/server. Il testo che ho parla di VB6 e DHTML ma a me interessa realizzare una semplice applicazione tramite Socket sapresti darmi delle indicazioni al riguardo ..appunti dalla rete eccc
GRAZIE 100000
ciao
Bottaweb
Ho provato in questo modo:
Form3:
Private Sub Command1_Click()
Dim de As New DataEnvironment1
de.Command3 12/5/2002
Do Until de.rsCommand3.EOF
Text1(i).Text = de.rsCommand3("primo")
Text1(i + 1).Text = de.rsCommand3("secondo")
Text1(i + 2).Text = de.rsCommand3("terzo")
Text1(i + 3).Text = de.rsCommand3("quarto")
Text1(i + 4).Text = de.rsCommand3("quinto")
i = i + 5
MsgBox Text1(i).Text
de.rsCommand3.MoveNext
Loop
de.rsCommand3.Close
End Sub
Private Sub Form_Initialize()
Dim i As Integer
i = 0
End Sub
con Command3 di Enviroment:
SELECT * FROM STORICO WHERE data = ?
mi dice che devo impostare i parametri nella finestra parameter di Enviroment. Ho impostato size scale e tipo e nome come specificato nella finestra proprety di Data View . Ma quando eseguo la routine nelle 10 caselle textBox non mi compaiono i valori e non mi da nemmeno una segnalazione di errore :-(
P.S x Jupy Preverisci lavorare con i database direttamente da codice o utilizzando il design Enviroment?
Bottaweb
Ciao, sono di corsa, pertanto ti do soltanto alcune indicazioni con le quali dovresti risolvere i problemi..anche se poi ci sarebbere delle ottimizzazioni da fare per quello che vuoi fare tu..
Allora, per fare una ricerca usando il carattere jolly "%" devi usare l'istruzione LIKE nella query, riprendo il tuo pezzo di codice
Se vui usare le query parametriche, devi sostituire "=" con LIKE e poi fai una cosa del genere:codice:Private Sub Command5_Click() Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.CursorLocation = adUseServer cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2.mdb;Jet OLEDBatabase;" rs.CursorLocation = adUseServer For i = 0 To 8 Step 1 rs.Open "SELECT COUNT(*) AS TOTALE FROM STORICO WHERE RUOTA='BA' AND PRIMO LIKE '" & i & "%';", cn totale1 = rs(0) MsgBox totale1 rs.Close Next End Sub
Comunque ricordati che l'operatore LIKE è più lento di un operatore di uguaglianza (=) pertanto vedi sempre se puoi ottimizzare il tutto..senza usare tanti LIKE..codice:stringa=tuoNum & "%" cmdCalcola.Parameters("UNO").Value = stringa
Per quanto riguarda il DataEnviroment, non ho un buon rapporto, nel senso che non mi è mai piaciuto, questioni di gusti! e comunque penso che appesantisca anche l'applicazione..anche se questo non si nota tanto.
Il VB per fare programmi client/server c'è l'oggetto winsocket, ora non so darti un link dove andare, ma se hai la guida msdn di vb, guarda li, ci sono anche esempi..vedrai che non è tanto difficile usarli...
Spero che queste poche indicazioni ti permettano di andare avanti..altrimenti chiedi pure..
![]()
Jupy
Grande. Non saprei proprio come ringraziarti :-)
Dunque... grazie alle tue puntuali delucidazioni ho realizzato queste due sub che funzionano alla grande ..dai un occhio alla forma:
Private Sub Command5_Click()
Dim stringa As String
Dim totale As Integer
Dim rsCalcola As New ADODB.Recordset, cmdCalcola As New ADODB.Command
cmdCalcola.CommandText = "SELECT COUNT(*) AS TOTALE FROM STORICO WHERE ruota = 'BA' AND PRIMO LIKE ? OR SECONDO LIKE ? OR TERZO LIKE ? OR QUARTO LIKE ? OR QUINTO LIKE ?;"
Dim prm As New ADODB.Parameter
Dim cn As New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2.mdb;Jet OLEDBatabase;"
Set cmdCalcola.ActiveConnection = cn
Set prm = cmdCalcola.CreateParameter("UNO", adChar, adParamInput, 2, "00")
cmdCalcola.Parameters.Append prm
Set prm = cmdCalcola.CreateParameter("DUE", adChar, adParamInput, 2, "00")
cmdCalcola.Parameters.Append prm
Set prm = cmdCalcola.CreateParameter("TRE", adChar, adParamInput, 2, "00")
cmdCalcola.Parameters.Append prm
Set prm = cmdCalcola.CreateParameter("QUATTRO", adChar, adParamInput, 2, "00")
cmdCalcola.Parameters.Append prm
Set prm = cmdCalcola.CreateParameter("CINQUE", adChar, adParamInput, 2, "00")
cmdCalcola.Parameters.Append prm
Set rsCalcola = cmdCalcola.Execute
Do Until rsCalcola.EOF
stringa = 1 & "%"
cmdCalcola.Parameters("UNO").Value = stringa
cmdCalcola.Parameters("UNO").Value = stringa
cmdCalcola.Parameters("DUE").Value = stringa
cmdCalcola.Parameters("TRE").Value = stringa
cmdCalcola.Parameters("QUATTRO").Value = stringa
cmdCalcola.Parameters("CINQUE").Value = stringa
Set rsCalcola = cmdCalcola.Execute
totale = rsCalcola("TOTALE")
rsCalcola.MoveNext
MsgBox totale
Loop
rsCalcola.Close
End Sub
Che conta tutti i numeri che iniziamo con 1 per la ruota di BARI. Ovvio che se ora voglio cambiare ruota usando la stessa query non mo resta che creare un altro parametro e passarlo al segnaposto ?![]()
per la seconda SUB senza usare ADO ho creato 10 TextBox usandole per visualizzare le 10 estrazioni per data :
Private Sub Command2_Click()
Dim cmd As New ADODB.Command, rs As New ADODB.Recordset
cmd.CommandText = " SELECT * FROM STORICO WHERE data = ?"
Dim param As New ADODB.Parameter
Dim cn As New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2.mdb;Jet OLEDBatabase;"
Set cmd.ActiveConnection = cn
Set param = cmd.CreateParameter("estrai", adWChar, adParamInput, 10, "")
cmd.Parameters.Append param
cmd.Parameters("estrai").Value = "22/05/2002"
Set rs = cmd.Execute
Do Until rs.EOF
Text1(i).Text = rs("primo")
Text1(i + 1).Text = rs("secondo")
Text1(i + 2).Text = rs("terzo")
Text1(i + 3).Text = rs("quarto")
Text1(i + 4).Text = rs("quinto")
i = i + 5
rs.MoveNext
Loop
End Sub
Per questa però volevo fare in modo che con altri due bottoni sia possibile spostarsi sulle 10 succ e cosi' via ..o sulle precedenti alla data corrente (per provare ho passato 22/05/2002). Il recordSet non contiene tutte le estrazioni quindi dovrei ricrearlo oppure fare una SELECT * from Storico e posi spostarmi sul recordset totale.Che mi consigli? :master:
Ho notato dal testo che l'oggetto REcordSet (anche Connection e Command ) dispongono di molti metodi assovciati Filter, Sort, ecc Quale è miglior approccio in termini di prestazioni ? Lavorare con SQL o sfruttare questi ultimi?![]()
Sono daccordo per quanto riguarda il Design Ev. ...non ti permette di capire quello che succede. Meglio il codice.
Grazie per l'indicazione del Winsocket ora faccio una ricerca da interner. Ho una rete a casa con 3 pc e volevo realizzare un semplice software per lo scambio di messaggi ...non tanto perchè mi serve ma per capire come funziona con VB6![]()
Ultima cosa i miei molti errori in compilazione derivano dal fatto che non riesco ad inserire i carattere & " ' eccc nelle query. Non risco a combinarli in maniera corretta ed il testo stranamente non dice niente o ancora ci devo arrivare![]()
Thanks a presto
Bottaweb
Ciao, sempre di corsa ma vediamo alcuni punti
forse c'è qualcosa che mi sfugge.. tu dici "Che conta tutti i numeri che iniziamo con 1 per la ruota di BARI. "
non è tanto esatto, quella qery non conta "tutti" i numeri, ma conta quanti record ci sono che contengono almeno un numero che inizia con 1, ad esempio se tu hai due estrazioni sulla ruota di bari:
10 22 44 19 17
41 03 57 12 89
facendo un filtro con la tua query, sui campi che hanno un valore che inizia per 1, in questo caso non ottengo 4, ma 2, in quanto sono due i record che soddisfano le tue condizioni!
spero di essermi spiegato...
Per passare da un record all'altro, senza dover immettere ogni volta la data, allora devi caricarti tutta la tabella delle estrazioni e poi ti muovi con i metodi MoveNext/MovePrevious, altrimenti se vuoi immettere la data di volta in volta, ti conviene usare una query, magari parametrica e comunque ti sconsiglio di usare metodi come Filter o Sort, a meno che non sia una cosa sporadica, in quanto sono più lenti di una select
Il carattere & in vb è il carattere di concatenamento in poche parole è come se usasi il + per concatenare le stringe..solo che il carattere & non equivoco come il + davanti a due stringhe che contengono numeri...
![]()
Jupy
afferato :-) mi sono creato un db + semplice per testare i metodi di recordSet ma mi da un errore :
Private Sub Form_Load()
cn.Mode = adModeShareDenyRead
cn.CommandTimeout = 25
cn.Open Adodc1.ConnectionString
cn.CursorLocation = adUseServer
Set rs.ActiveConnection = cn
rs.Source = " SELECT * FROM CLIENTI"
rs.Open
End Sub
mi da errore 3219 su rs.Moveprevious !! Ho provato tutti i tipi di cursori anche il dymamic ma non funziona :-((
Private Sub cmdIndietro_Click()
rs.MovePrevious
Caricadati
End Sub
Private Sub cmdAvanti_Click()
rs.MoveNext
Caricadati
End Sub
...ancora![]()
in fase di progettazione creo una connessione ad un database del tipo:
Private Sub Form_Load()
Dim cn As New Connection
cn.Mode = adModeShareDenyRead
cn.CommandTimeout = 25
cn.Open Adodc1.ConnectionString
End Sub
Ora però vorrei inserire nel codice le sub relative agli eventi dell'oggetto connection ma dal menu questi non mi compaiono . Ad es se è un oggetto ADO allora a sinistra lo seleziono e a destra mi scelgo l'evento. Ma cn non mi compare a sinistra quindi non posso selezionare i vari metodi Willxxxx ..come fare li devo scrivere a mano?
Bye e grazie
Bottaweb
fai queste modifiche:Originariamente inviato da bottaweb
afferato :-) mi sono creato un db + semplice per testare i metodi di recordSet ma mi da un errore :
Private Sub Form_Load()
cn.Mode = adModeShareDenyRead
cn.CommandTimeout = 25
cn.Open Adodc1.ConnectionString
cn.CursorLocation = adUseServer
Set rs.ActiveConnection = cn
rs.Source = " SELECT * FROM CLIENTI"
rs.Open
End Sub
mi da errore 3219 su rs.Moveprevious !! Ho provato tutti i tipi di cursori anche il dymamic ma non funziona :-((
Private Sub cmdIndietro_Click()
if rs.Bof
rs.MovePrevious
Caricadati
End Sub
Private Sub cmdAvanti_Click()
rs.MoveNext
Caricadati
End Sub
Logicamente prima di abilitare i bottoni Avanti e Indietro devi testare se il recorset contiene qualcosa, del tipo (una volta fatta la query di estrazione)codice:Private Sub cmdIndietro_Click() rs.MovePrevious if rs.Bof then rs.MoveFirst end if Caricadati End Sub Private Sub cmdAvanti_Click() rs.MoveNext if rs.Eof then rs.MoveLast end if Caricadati End Sub
codice:if rs.recordcount>0 then abilita i bottoni Avanti e Indietro end ifdichiara l'oggetto connection in questa maniera:...ancora![]()
in fase di progettazione creo una connessione ad un database del tipo:
Private Sub Form_Load()
Dim cn As New Connection
cn.Mode = adModeShareDenyRead
cn.CommandTimeout = 25
cn.Open Adodc1.ConnectionString
End Sub
Ora però vorrei inserire nel codice le sub relative agli eventi dell'oggetto connection ma dal menu questi non mi compaiono . Ad es se è un oggetto ADO allora a sinistra lo seleziono e a destra mi scelgo l'evento. Ma cn non mi compare a sinistra quindi non posso selezionare i vari metodi Willxxxx ..come fare li devo scrivere a mano?
codice:Dim WithEvents cn As ADODB.Connection![]()
Jupy
Ciao Jupy ..ho dichiarato le due sub per scorrere il recordset ed ho capito perchè le dichiari cosi' ma continua a darmi il solito errore
operazione non consentita nel contesto corrente 3219.![]()
mi è chiara anche la dichairazione Dim WithEvents cn As ADODB.Connection ma dopo averla inserita in questo modo:
Option Explicit
Dim i As Integer
Dim Validate As Boolean
Dim WithEvents cn As ADODB.Connection
Dim WithEvents rs As ADODB.Recordset
compaiono gli eventi di cui ho bisogno ma cn e rs non mi vengono visti in:
Private Sub Form_Load()
cn.CommandTimeout = 25
cn.Open Adodc1.ConnectionString
cn.CursorLocation = adUseServer
' L'oggetto Connection ha 9 eventi
Set rs.ActiveConnection = cn
rs.Source = " SELECT * FROM CLIENTI"
rs.Open
End Sub
mi da errore 91 . Object Variable o With Block not Set
Bottaweb
Il secondo problema sembra essere risolto:
Private Sub Form_Load()
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Mode = adModeShareDenyRead
cn.CommandTimeout = 25
cn.Open Adodc1.ConnectionString
cn.CursorLocation = adUseServer
Set rs.ActiveConnection = cn
rs.Source = " SELECT * FROM CLIENTI"
rs.Open
If rs.RecordCount > 0 Then
'abilita i bottoni Avanti e Indietro
End If
End Sub
Ora funziona perchè in sostanza ho creato con NEW le due Istanze degli oggetti ?
per quanto riguarda le due funzioni continuo ad avere problemi . Quando uso il bottone avanti ed eccedo la dimensione del recordset mi dice che il set di stringhe non supporta operazioni di recupero all'indietro . Penso che questo sia lo stesso problema per il quale l'operazione della sub dietro si blocca su rs.MovePrevious :master:
Bottaweb