PDA

Visualizza la versione completa : [vb]errrore nel with


matilde
11-07-2001, 10:15
Ciao a tutti.
Io sto facendo un programma in VB, con database.
Ho fatto i 4 bottoni Avanti, Indietro, Primo e Ultimo, per accedere ai vari record del database, ma nell'esecuzione quando schiaccio uno qualsiasi dei 4 bottoni mi esce l'errore:
"Variabile oggetto o variabile del blocco With non impostata"
Io non ho inserito nessun With e tutte le variabili sono dichiarate, sapreste darmi un aiuto?
Grazie

sebamix
11-07-2001, 10:24
Puoi postare il codice dove dichiari e dove imposti TUTTE le variabili oggetto del tuo programma? Il with non centra nulla. L'errore significa che in quel momento stai cercando di utilizzare una variabile oggetto che non è stata inizializzata.
Posta anche la linea di codice che ti da il problema!

Ah, per variabili oggetto si intendono tutte quelle del tipo Recordset, Connection,...

matilde
11-07-2001, 10:31
Queste sono le variabili che ho dichiarato:

Option Explicit
Public rec As ADODB.Recordset
Public sSelect As String
Public MyConn As New ADODB.Connection
Dim x As Integer

e questo è il codice:

Private Sub Avanti_Click()

Call SelectDB
rec.MoveNext
Form2.Text1 = (rec.Fields(1).Value)
Form2.Text2 = (rec.Fields(2).Value)
Form2.Combo1 = (rec.Fields(3).Value)
Form2.Text3 = (rec.Fields(4).Value)
Form2.Text4 = (rec.Fields(5).Value)
Call CloseDB
End Sub



Public Sub SelectDB()
Call openDB
sSelect = "SELECT * FROM Hms_Planning ORDER BY Id"
rec.Open sSelect, MyConn, , , adCmdText
End Sub


Questa è la connessione al DB:

Public Sub openDB()
'Dim MyConn As ADODB.Connection
MyConn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=hmsDB"
Set rec = New ADODB.Recordset
rec.CursorLocation = adUseServer
rec.CursorType = adOpenKeyset
rec.LockType = adLockBatchOptimistic
End Sub


e qui la chiudo:

Public Sub CloseDB()
MyConn.Close
End Sub


Queste ultime tre Sub le ho messe in un modulo ho inserito nel modulo la dichiarazione delle variabili uguale a quella sopra.

sebamix
11-07-2001, 10:49
Prima di aprire tutte le varie connection o recordset fai questo:

Set Variabile = New Tipo

Per esempio:

Set MyConn = New ADODB.Connection

Posso poi farti un'osservazione:
Tu praticamente apri il database (la connessione) ogni volta che premi uno dei 4 tasti, il che non va tanto bene (spero tu la connessione la chiuda almeno) sia per motivi di tempo che di integrità del database stesso. Poi cosi' facendo il recordset resta fermo al primo record sempre...

La SelectDB chiamala nel Form_Load e la CloseDB nel Form_Unload .

Nella Private Sub Avanti_Click() metti rec.MoveNext

Poi ci sono anche MovePrevious (precedente) MoveFirst (Primo) e MoveLast (ultimo)
Devi mettere dei controlli per vedere che il recordset non sia arrivato alla fine o all'inizio (ADO è stupido e ti lascia fare ma poi va in errore) quindi quando fai MovePrevious o MoveNext devi controllare le rispettive Proprietà BOF ed EOF di rec

al posto di rec.Fields(1).Value puoi scrivere anche rec.Fields("nome_del_campo").Value è molto più leggibile e non ti incasini... :)

Invece di riempire ogni volta i campi (modalità unbound) puoi passare alla bound (si arrangia VB a riempire tutti i campi :) ) Per fare questo devi impostare la proprietà "DataField" delle textbox che ti interessano siano legate con il recordset con il nome dei relativi campi. Per esempio: Text1.DataField = "NomeDelCampo 1"... e così via.
Poi (a run time - cioè attraverso codice nel Form_Load della maschera) imposti la proprietà "DataSource" al recordset. Per esempio:

Set Text1.DataSource = rec
Set Text2.DataSource = rec
...

Quando ti muovi di record i textbox ti seguiranno :)
Puoi mettere anche check, datacombo, datalist, ...

Ah... quando chiudi tutti gli oggetti impostali anche a nothing...
Es.
Set MyConn = Nothing

Se hai ancora problemi non esitare a postare!!!

matilde
11-07-2001, 11:49
Grazie per i consigli, sto modificando il programma.
Comunque ho fatto 4 sub con MoveNext, MovePrevious ecc...
Non mi è molto chiaro il passaggio del DataField:
Io scrivo nella form_load:
Text1.DataField = "Nome_Del_Campo"
e quando mi serve al posto di:
Form2.Text1 = (rec.Fields("Date").Value)
devo scrivere:
Set Text1.DataSource = rec
Ho capito bene?

Comunque mi da ancora errore di with.
Ecco il nuovo codice aggiustato un pò:
Private Sub Avanti_Click()

rec.MoveNext
If rec.EOF = False Then
Form2.Text1 = (rec.Fields("Date").Value)
Form2.Text2 = (rec.Fields("Inputby").Value)
Form2.Combo1 = (rec.Fields("Priority").Value)
Form2.Text3 = (rec.Fields("Item").Value)
Form2.Text4 = (rec.Fields("Note").Value)
Else
rec.MoveFirst
Form2.Text1 = (rec.Fields("Date").Value)
Form2.Text2 = (rec.Fields("Inputby").Value)
Form2.Combo1 = (rec.Fields("Priority").Value)
Form2.Text3 = (rec.Fields("Item").Value)
Form2.Text4 = (rec.Fields("Note").Value)
End If
End Sub

Se hai altri suggerimenti da darmi li accetto volentieri.

sebamix
11-07-2001, 12:53
Messaggio originariamente pubblicato da matilde
Non mi è molto chiaro il passaggio del DataField:
Io scrivo nella form_load:
Text1.DataField = "Nome_Del_Campo"
e quando mi serve al posto di:
Form2.Text1 = (rec.Fields("Date").Value)
devo scrivere:
Set Text1.DataSource = rec
Ho capito bene?
[/B]

No... :)

Set Text1.DataSource = rec
lo devi mettere nel Form_Load e nella procedura

Private Sub Avanti_Click()
If rec.EOF = False Then
rec.MoveNext
Else
rec.MoveLast
End If
End Sub

matilde
11-07-2001, 13:46
devo fare:
Private Sub Avanti_Click()
If rec.EOF = False Then
rec.MoveNext
Set Form2.Text1.DataSource = rec
Set Form2.Text2.DataSource = rec
Set Form2.Text3.DataSource = rec
else
rec.MoveFirst(perché lo vuoi far fermare all'ultimo? Preferisco rifargli fare il ciclo, è giusto?)

Set Form2.Text1.DataSource = rec
Set Form2.Text2.DataSource = rec
Set Form2.Text3.DataSource = rec
end if

Ho scritto giusto?

matilde
11-07-2001, 14:15
Problema:
- if rec.EOF = False then
else

Se lo metto così mi entra nell'else e non nel then

Se lo metto così:
if rec.EOF = True then
else
mi entra nel then, ma non mi fa rec.MoveNext
Cosa devo fare?

matilde
11-07-2001, 14:24
Il problema di prima c'è sempre, ma se io faccio Avanti, dopo la prima volta che non mi entra le altre mi entra, ma alla fine quando è finito il data base non mi rimanda alla prima, ma mi dà errore.

sebamix
11-07-2001, 15:23
Cioè tu riesci ad andare avanti fino all'ultimo record e poi dopo l'ultimo ti da l'errore?

Loading