Condividi tramite

Maschera ACCESS, Evento "Su Not In List" su casella combinata su tabella collegata al SQL Server 2017

Anonimo
2018-01-05T18:08:08+00:00

Buonasera !!

In un database di Access ho importato alcune tabelle da SQL Server 2017.

Su una di queste tabelle ho creato una maschera con alcuni campi.

Tra questi campi ci sono delle caselle combinate (cbo).

Nelle proprietà di una di queste cbo in corrispondenza di EVENTO - SU NOT IN LIST,  ho provato a fare in modo che potessi aggiungere un nome nuovo laddove non fosse già presente nell'elenco.

Questo è il codice usato:

Private Sub cboFornitore_NotInList(NewData As String, Response As Integer)

Dim db As DAO.Database

Dim rs As DAO.Recordset

Dim strMsg As String

    strMsg = "'" & NewData & "' non è un nome disponibile"

    strMsg = strMsg & vbCrLf & "Desidera aggiungerlo all'elenco ?"

    strMsg = strMsg & vbCrLf & "Clic su Sì per aggiungerlo, su No " & "per selezionarne uno esistente."

    If MsgBox(strMsg, vbQuestion + vbYesNo, "Aggiungere un nuovo FORNITORE ?") = vbNo Then

        Response = acDataErrContinue

    Else

        Set db = CurrentDb

        Set rs = db.OpenRecordset("dbo_FORNITORE", dbOpenDynaset)

        rs.AddNew

        rs!NomeFornitore = NewData

        rs.Update

        rs.Close

        Response = acDataErrAdded

    End If

End Sub

Ho fatto una prova per aggiungere un nuovo nome e mi è uscito il seguente errore:

Microsoft Visual Basic

Errore di run-time '3622':

Usare dbSeeChanges con OpenRecordset

per accedere a una tabella SQL SERVER con una colonna IDENTITY.

Come si risolve ?

Microsoft 365 e Office | Accesso | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2018-01-05T22:01:49+00:00

    ciao Roberto.

    prova ad eseguire direttamente l'inserimento con :

    DBEngine(0)(0).Execute "insert into dbo_FORNITORE (NomeFornitore ) values ('" & NewData & "')", &H80

    eliminando questa parte :

    Set db = CurrentDb

            Set rs = db.OpenRecordset("dbo_FORNITORE", dbOpenDynaset)

            rs.AddNew

            rs!NomeFornitore = NewData

            rs.Update

            rs.Close

    se la tabella sul server non ha vincoli di compilazione ( not null)  o check constraint dovrebbe andare...da me è così...

    Da valutare forse un approccio diverso, magari una stored procedure eseguita sul server...se il grande Giorgio partecipasse ancora ci renderebbe edotti :-).

    Facci sapere.

    ciao, Sandro.

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-01-07T10:40:31+00:00

    Buona Domenica !

    Ho risolto il problema riformulando la logica del database, togliendo la chiave esterna che dava problema.

    Con il codice del primo messaggio:

    <  DBEngine(0)(0).Execute "insert into dbo_FORNITORE (NomeFornitore ) values ('" & NewData & "')", &H80  >

    funziona bene l'evento NOT IN LIST su tabella collegata al SQL Server 2017.

    Rimangono due cose: 

    1. gestire l'evento NOT IN LIST su combo box su Access con una stored procedure sul database su SQL Server,
    2. popolare più campi con una combo box, passando un parametro per la combo box, ed altri parametri per popolare gli altri campi della tabella su cui poggia la combo box.   (Spero di essere stato chiaro).

    Grazie dell'aiuto.  E' stato in ogni caso molto utile.

    Saluti.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-01-06T17:21:58+00:00

    ciao Roberto,

    nella tabella hai una chiave esterna con vincolo not null, credo sia proprio quello il problema.

    Inoltre devi popolare anche la chiave primaria in quanto non ha caratteristiche di identity.

    Devi rivedere il codice dell'action query popolandole :

    DBEngine(0)(0).Execute "insert into dbo_FORNITORE (NomeFornitore,IDF,IDR2) values ('" & NewData & "',valorePK, valoreFK)", &H80

    facci sapere.

    Ciao, Sandro

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-01-06T11:23:32+00:00

    Per completezza d'informazione, la tabella FORNITORE sul SQL Server 2017 ha questi campi:

    IDF PK INT NOT NULL,

    NomeFornitore NVARCHAR(100) NULL,

    IDM2 INT NULL,

    IDR2 FK INT NOT NULL

    La presenza di questi campi NOT NULL nella chiave primaria ed in quella esterna, incidono sul risultato negativo ?

    Per quanto riguarda il codice VBA proposto, il nuovo codice VBA risulta questo:


    Private Sub cboFornitore_NotInList(NewData As String, Response As Integer)

    Dim db As DAO.Database

    Dim rs As DAO.Recordset

    Dim strMsg As String

        strMsg = "'" & NewData & "' non è un nome disponibile"

        strMsg = strMsg & vbCrLf & "Desidera aggiungerlo all'elenco ?"

        strMsg = strMsg & vbCrLf & "Clic su Sì per aggiungerlo, su No " & "per selezionarne uno esistente."

        If MsgBox(strMsg, vbQuestion + vbYesNo, "Aggiungere un nuovo FORNITORE ?") = vbNo Then

            Response = acDataErrContinue

        Else

            DBEngine(0)(0).Execute "insert into dbo_FORNITORE (NomeFornitore ) values ('" & NewData & "')", &H80

            Response = acDataErrAdded

        End If

    End Sub


    Esce il seguente errore: 

    Errore di run time '3146':

    ODBC: chiamata non riuscita.


    Probabilmente c'è da gestire il collegamento OBDC via VBA usando anche i riferimenti giusti del menu Strumenti nella scheda Visual Basic.

    Tra i riferimenti ho:

    • Visual Basic For Applications
    • Microsoft Access 15.0 Object Library
    • OLE Automation
    • Microsoft Office 15.0 Access database engine Object
    • Microsoft Scripting Runtime

    Oltre questi ci vuole altro o vanno bene ?

    La risposta è stata utile?

    0 commenti Nessun commento