Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 57

Discussione: [vb]errrore nel with

  1. #1
    Utente di HTML.it L'avatar di matilde
    Registrato dal
    Apr 2001
    Messaggi
    132
    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

  2. #2
    Utente di HTML.it L'avatar di sebamix
    Registrato dal
    Aug 2000
    Messaggi
    1,028
    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,...



  3. #3
    Utente di HTML.it L'avatar di matilde
    Registrato dal
    Apr 2001
    Messaggi
    132
    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.

  4. #4
    Utente di HTML.it L'avatar di sebamix
    Registrato dal
    Aug 2000
    Messaggi
    1,028
    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!!!


  5. #5
    Utente di HTML.it L'avatar di matilde
    Registrato dal
    Apr 2001
    Messaggi
    132
    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.

  6. #6
    Utente di HTML.it L'avatar di sebamix
    Registrato dal
    Aug 2000
    Messaggi
    1,028
    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

  7. #7
    Utente di HTML.it L'avatar di matilde
    Registrato dal
    Apr 2001
    Messaggi
    132
    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?



  8. #8
    Utente di HTML.it L'avatar di matilde
    Registrato dal
    Apr 2001
    Messaggi
    132
    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?

  9. #9
    Utente di HTML.it L'avatar di matilde
    Registrato dal
    Apr 2001
    Messaggi
    132
    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.

  10. #10
    Utente di HTML.it L'avatar di sebamix
    Registrato dal
    Aug 2000
    Messaggi
    1,028
    Cioè tu riesci ad andare avanti fino all'ultimo record e poi dopo l'ultimo ti da l'errore?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.