Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Problemi con VB e JOIN in Access

    Sto cercando di implementare un programma in VB il quale interfacciandosi su un database Access 2000,il quale mi permetta di effettuare un JOIN fra due entità una la quale mi identifica i Proprietari di esercizi commerciali e l'altra mi identifica gli Esercizi commerciali steffi; ovviamente si sta parlando di una relazione 1:N, inquanto un proprietario può avere èiù di un negozio. Lasciando stare comunque problematiche di carattere relazionale, le quali mi sembrano corrette, ho avuto due problemi durante l'implementazione di VB, le quali vengono di seguito riportate in elenco:

    1.
    Avrei voluto effettuare una connessione al database senza DSN, ma ho un messaggio d'errore il quale mi afferma: "IMPOSSIBILE TROVARE ISAM INSTALLABILE"; premetto che uso un SO Windows 2000 Prof. e che ho installato SP5, quindi in teoria non dovrei avere tale messaggio d'errore, comunque per ovviare temporaneamente a tale problematica ho effettuato una connessione DSN. Sotto viene riportata la sintassi accusata d'errore a Run-Time:

    codice:
        'APRE LA CONNESSIONE
        Set cn = New ADODB.Connection
        cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=SchedaE.mdb"
        cn.ConnectionString = "Driver=Microsoft Access Driver (*.mdb);DBQ=SchedaE.mdb"
        cn.Open
    2.
    Nella visualizzazione di una sola tabella con una semplice SELECT non ho problemi, diversamente si verifica per il JOIN fra le entità Proprietari ed Esecizi inquanto al momento dell'esecuzione della query ho il seguente messaggio d'errore: "[Microsoft][Driver ODBC Microsoft Access] Parametri Insufficienti. Previsto 1."
    Già vi anticipo che la riga incriminata è nel momento in cui si tenta di eseguire il metodoto Open dell'oggetto rs il quale identifica il recordset
    codice:
    Private Sub cmdEsercizi_Click()
        'CIUDO IL VECCHIO RECORDSET
        rs.Close
        
        'JOIN
        rs.Source = "SELECT * FROM Proprietari,Esercizi WHERE Proprietari.IdProprietaro = Esercizi.IdProprietario"
        rs.Open	'ERRORE!!!!
        rs.MoveFirst
        
        'VISUALIZZA IL CONTENUTO NEL FORM
        txtDenominazione.Visible = True
        txtDenominazione.Text = rs.Fields("Denominazione")
    End Sub
    
    Per completezza e maggior chiarezza sotto viene riportato l'intero listato del programma:
    
    Option Explicit
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    
    Private Sub Form_Load()
        'APRE LA CONNESSIONE
        Set cn = New ADODB.Connection
        'cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=SchedaE.mdb"
        'cn.ConnectionString = "Driver=Microsoft Access Driver (*.mdb);DBQ=SchedaE.mdb"
        cn.Open "DSN=SchedaE"
        
        'APRE UN RECORDSET
        Set rs = New ADODB.Recordset
        rs.ActiveConnection = cn
        rs.CursorType = adOpenStatic
        rs.Source = "SELECT * FROM Proprietari"
        rs.Open
        rs.MoveFirst
        
        'VISUALIZZA IL CONTENUTO NEL FORM
        DisplayCurrentRecord
    End Sub
    
    Private Sub cmdEsercizi_Click()
        'CIUDO IL VECCHIO RECORDSET
        rs.Close
        
        'JOIN
        rs.Source = "SELECT * FROM Proprietari,Esercizi WHERE Proprietari.IdProprietaro = Esercizi.IdProprietario"
        rs.Open
        rs.MoveFirst
        
        'VISUALIZZA IL CONTENUTO NEL FORM
        txtDenominazione.Visible = True
        txtDenominazione.Text = rs.Fields("Denominazione")
    End Sub
    
    Sub DisplayCurrentRecord()
        Dim i As Integer
        Dim s As String
        
        If rs.BOF Then rs.MoveFirst
        If rs.EOF Then rs.MoveLast
        
        Clear
        
        txtCognome.Text = rs.Fields("Cognome")
        txtNome.Text = rs.Fields("Nome")
        
    End Sub
    
    Private Sub cmdNext_Click()
        rs.MoveNext
        DisplayCurrentRecord
    End Sub
    
    Private Sub cmdPrevious_Click()
        rs.MovePrevious
        DisplayCurrentRecord
    End Sub
    
    Sub Clear()
        txtCognome.Text = ""
        txtNome.Text = ""
    End Sub
    
    Private Sub cmdEsci_Click()
        'CHIUDE TUTTO
        rs.Close
        Set rs = Nothing
        cn.Close
        Set cn = Nothing
        End
    End Sub
    P.S. All'università usiamo MYSQL è possibile interfacciarlo con VB? Se si qualcuno ha qualche esempio da farmi studiare?
    Giuseppe SPECCHIO

  2. #2
    ti ho solo modificato l'impaginazione del codice per facilitare la lettura d'ora in poi quando devi postare del codice racchiudilo tra code e /code entrambi tra []
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  3. #3

    ma insomma....

    ........possibile che nessuno è in grdo di risolvermi il problema?
    Giuseppe SPECCHIO

  4. #4
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=SchedaE.mdb"
    questa stinga non può funzionare
    devi dire dove si trova schedaE.mdb altrimenti non trova il db
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  5. #5
    sta nella stessa cartella del programma!!

    Ti ringrazione
    Giuseppe SPECCHIO

  6. #6
    e per quanto riguarda il JOIN che mi dici, la sintassi e correta xkè non funziona?
    Giuseppe SPECCHIO

  7. #7
    Allora modificala così
    codice:
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
    "Data Source = " & app.path & "\SchedaE.mdb;"
    per la query prova a non metterla sulla prop source
    ma di seguito al metodo open

    codice:
    rs.open "SELECT * FROM Proprietari,Esercizi WHERE Proprietari.IdProprietaro = Esercizi.IdProprietario"
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  8. #8

    niente di fatto....

    Per quanto riguarda il primo suggerimento ho modificato la subroutine nel seguente modo:

    codice:
    Private Sub Form_Load()
        'APRE LA CONNESSIONE
        Set cn = New ADODB.Connection
        'cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=SchedaE.mdb"
        'cn.ConnectionString = "Driver=Microsoft Access Driver (*.mdb);DBQ=SchedaE.mdb"
        'cn.Open "DSN=SchedaE"
        cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
    "Data Source = " & App.Path & "\SchedaE.mdb;"
    
        'APRE UN RECORDSET
        Set rs = New ADODB.Recordset
        rs.ActiveConnection = cn
        rs.CursorType = adOpenStatic
        rs.Source = "SELECT * FROM Proprietari"
        rs.Open
        rs.MoveFirst
        
        'VISUALIZZA IL CONTENUTO NEL FORM
        DisplayCurrentRecord
    End Sub
    ma al momento che eseguo il programma ho il seguente messaggio d'errore a run-time:

    'Operazione non consentita per un oggetto che fa riferimento a una connessione chiusa o non valida.'

    e se vado a fare il debug mi rimanda alla seguente riga:

    codice:
    rs.ActiveConnection = cn
    Per quanto riguarda il join, anche qui niente da fare, seguendo il tuo consiglio ho modificato la subroutine nel seguente modo:

    codice:
    Private Sub cmdEsercizi_Click()
        'CIUDO IL VECCHIO RECORDSET
        rs.Close
        
        'JOIN
        'rs.Source = "SELECT * FROM Proprietari,Esercizi WHERE Proprietari.IdProprietaro = Esercizi.IdProprietario"
        'rs.Open
        rs.Open "SELECT * FROM Proprietari,Esercizi WHERE Proprietari.IdProprietaro = Esercizi.IdProprietario"
        rs.MoveFirst
        
        'VISUALIZZA IL CONTENUTO NEL FORM
        txtDenominazione.Visible = True
        txtDenominazione.Text = rs.Fields("Denominazione")
    End Sub
    ma al momento dell'esecuzione della query ho il seguente messaggio di errore:

    '[Microsoft][Driver ODBC Microsoft Access] Parametri insufficienti. Previsto 1.'

    e se eseguo il debug mi rimanda proprio al metodo open.

    In attesa di una tua evetuale risposta colgo l'occasine per ringraziarti.
    Giuseppe SPECCHIO

  9. #9
    Utente di HTML.it L'avatar di JamesD
    Registrato dal
    Oct 2001
    Messaggi
    415
    Beh nel primo caso hai impostato la connectionstring ma non hai aperto la connessione.

    Nel secondo caso hai aperto il recordset senza indicare la connessione e i tipi di cursore e blocco che se non ricordo male sono parametri obbligatori.


  10. #10
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    Questa select:
    codice:
    SELECT * FROM Proprietari,Esercizi WHERE Proprietari.IdProprietaro = Esercizi.IdProprietario
    deve essere scritta cos':
    codice:
    SELECT * FROM Proprietari INNER JOIN Esercizi ON Proprietari.IdProprietaro = Esercizi.IdProprietario
    E ti ritrovi un recordset con tutti i valori di proprietari che trovano corrispondenza in Esercizi.

    Se vuoi anche gli altri devi usare una LEFT OUTER JOIN. Cerca JOINT nella guida e vedi le varie sintassi

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 © 2025 vBulletin Solutions, Inc. All rights reserved.