Errore 3027

di il
17 risposte

Errore 3027

Buongiorno e buon anno a tutti, 

rieccomi con un nuovo quesito sul quale batto la testa da stamani e non riesco a trovarne soluzione, nessun help in linea è riuscito darmi alcuna indicazione.

L'ambito è sempre il solito, una applicazione condivisa da magazzino e ufficio aquisti che il magazziniere usa per far sapere articoli e quantità da comprare.

L'applicazione lavora su una tblMancanti che è riempita dal magazziniere a mano tramite maschera, e da un foglio excel generato dall'ufficio acquisti tramite apposita procedura sul gestionale aziendale, gestito come tabella collegata, e che contiene la lista degli ordini effettuati a partire da una certa data.

In una maschera apposita l'ufficio acquisti ha la possibilità di comunicare al magazziniere per ogni singolo codice richiesto i parametri dell'ordine effettuato, tramite importazione dei dati dal foglio excel menzionato sopra tramite procedura VBA.

Dalla tabella interna prelevo i dati di interesse tramite la query qryDaOrdinare, dal file excel tramite la query qryOrdiniFornitore.

La qryDaOrdinare è stata fatta manualmente su access tramite le apposite funzioni, mentre la qryOrdiniFornitore la creo ed eseguo tramite VBA con 

DoCmd.OpenQuery (strNomeQuery)
DoCmd.Close acQuery, strNomeQuery

Fatto questo apro i Recordset:

Set dbsLocale = CurrentDb
Set rstOrdini = dbsLocale.OpenRecordset("qryOrdiniFornitore", dbOpenDynaset)
Set rstMancanti = dbsLocale.OpenRecordset("qryDaOrdinare", dbOpenDynaset)

La lettura dei dati dalla query OrdiniFornitore e la scrittura nella query DaOrdinare e da qui nella tabella funziona correttamente.

Quello che non funziona è l'aggiornamento della quantità ordinata nella query OrdiniFornitore, lo scopo è aggiornare la quantità di pezzi ancora disponibili di quell'articolo per eventuali altre commesse che usano lo stesso pezzo. Quindi:

If rstMancanti.Fields("QuantitaInevasa").Value > 0 Then
   rstOrdini.Fields("Qta").Value = 0
Else
   rstOrdini.Fields("Qta").Value = rstOrdini.Fields("Qta").Value - rstMancanti.Fields("QuantitaOrdinata").Value
End If

mi genera l'errore 3027 "Impossibile aggiornare. Database o oggetto di sola lettura" nella riga sotto l'Else.

Le prove le sto facendo sul mio pc che non è in rete, il foglio excel è chiuso, l'apertura in modalità Dynaset dovrebbe consentirmi di fare quello che voglio fare, invece ho questo errore e non riesco a capire quale sia il problema.

Qualche idea ?

Grazie

Ste

17 Risposte

  • Re: Errore 3027

    Dimenticavo, modificando quanto scritto sopra in 

    If rstMancanti.Fields("QuantitaInevasa").Value > 0 Then
        rstOrdini.Edit
        rstOrdini.Fields("Qta").Value = 0
        rstOrdini.Update
    Else
        rstOrdini.Edit
        rstOrdini.Fields("Qta").Value = rstOrdini.Fields("Qta").Value - rstMancanti.Fields("QuantitaOrdinata").Value
        rstOrdini.Update
    End If

    l'errore 3027 mi viene riferito alla riga Edit dopo l'Else.

    Ovviamente appare lì perchè è quella la condizione che soddisfa l'IF.

    Ste

  • Re: Errore 3027

    Query complesse che coinvolgono “molte” tabelle non sono modificabili.

  • Re: Errore 3027

    03/01/2023 - OsvaldoLaviosa ha scritto:


    Query complesse che coinvolgono “molte” tabelle non sono modificabili.

    Buongiorno, 

    non ho capito cosa vuoi dire. 

    Le query sono solo due, la “mancanti” ha 12 campi e la “ordini” ne ha 7.

    Trasferisco 6 valori dalla “ordini” alla “mancanti” e l'unico che voglio aggiornare nella “ordini” è un problema ?

    E' sbagliato il metodo che sto usando ?

    Grazie per l'interesse

    Ste

  • Re: Errore 3027

    Non è che per caso gai in update dopo il close?

  • Re: Errore 3027

    04/01/2023 - fratac ha scritto:


    Non è che per caso gai in update dopo il close?

    Ho controllato per sicurezza ma no, i Close sono successivi.

    Sono anche sicuro dei permessi di accesso alla cartella e allo stesso file.

    C'è comunque qualcosa di marcio, ho messo il file excel nella stessa cartella dell'applicazione ovviamente aggiornando le directory e ottengo un errore 2001 all'esecuzione della query. Sta cosa proprio non mi torna…

    Grazie

    Ste

  • Re: Errore 3027

    Devi mostrarci le query (SQL) altrimenti parliamo del nulla.

    E' possibile che tu abbia una query che sia nativamente NON aggiornabile e quindi l'errore NON sarebbe un errore …

  • Re: Errore 3027

    03/01/2023 - OsvaldoLaviosa ha scritto:


    Query complesse che coinvolgono “molte” tabelle non sono modificabili.

    Veramente è così…?
    L'affermazione così come è fatta è superficiale ed errata…!

    Le query Complesse che coinvolgono molte tabelle SONO AGGIORNABILI se mantengono i requisiti necessari.
    Le query Complesse che coinvolgono molte tabelle NON SONO AGGIORNABILI se, riassumo nuovamente le principali cause

    1) It has a GROUP BY clause. A Totals query is always read-only.
    2) It has a TRANSFORM clause. A Crosstab query is always read-only.
    3) It uses First(), Sum(), Max(), Count(), etc. in the SELECT clause. Queries that aggregate records are read-only.
    4) It contains a DISTINCT predicate. Set Unique Values to No in the query's Properties.
    5) It involves a UNION. Union queries are always read-only.
    6) It has a subquery in the SELECT clause. Uncheck the Show box under your subquery, or use a domain aggregation function instead.
    7) It use JOINs of different directions on Multiple Tables in FORM Clause
    8) The fields in a JOIN are NOT INDEXED correctly, there is no Primary Key or Unique index on JOINed Fields

  • Re: Errore 3027

    04/01/2023 - max.riservo ha scritto:


    Devi mostrarci le query (SQL) altrimenti parliamo del nulla.

    E' possibile che tu abbia una query che sia nativamente NON aggiornabile e quindi l'errore NON sarebbe un errore …

    Eccola qui:

        ' Qui creo la query e la salvo in strSQL per poi lanciarla. Genero il msg di errore in caso il file sia mancante.
        If (Len(Dir(strPathFileNameEsportazioneOrdini)) > 0) Then
            strNomeQuery = "qryOrdiniFornitore"
            strPercorsoDb = CurrentDb.Name
            strSQL = "SELECT " & strFileNameEsportazioneOrdini & ".[N# Ordine], " & strFileNameEsportazioneOrdini & ".[Data Ordine], " & _
                     strFileNameEsportazioneOrdini & ".[Descr# Cliente], " & strFileNameEsportazioneOrdini & ".[Codice Articolo], " & _
                     strFileNameEsportazioneOrdini & ".Qta, " & strFileNameEsportazioneOrdini & ".Prezzo, " & _
                     strFileNameEsportazioneOrdini & ".[Data Evasione] " & _
                     "FROM " & strFileNameEsportazioneOrdini & " ORDER BY " & strFileNameEsportazioneOrdini & ".[N# Ordine], " & _
                     strFileNameEsportazioneOrdini & ".[Data Evasione];"
        Else
            glbstrMsgBox = "Il file degli ordini " & strFileNameEsportazioneOrdini & " non esiste. " & Chr(13) & Chr(10) & Chr(13) & Chr(10) & _
                   "Crearlo tramite l'apposita funzione di AdHoc, e salvarlo nella stessa cartella di questa " & Chr(13) & Chr(10) & _
                   "procedura rinominandolo EsportazioneOrdini.xls. Dopo la creazione aprirlo con Excel " & Chr(13) & Chr(10) & _
                   "ed eliminare la prima riga con la scritta Portafoglio Ordini e l'ultima con i totali delle varie colonne."
                   DoCmd.OpenForm ("frmMyMsgBox")
                   GoTo cmdImporta_Click_fine
        End If
        
        If CreaQueryDefPermanente(strPercorsoDb, strNomeQuery, strSQL) = False Then
            MsgBox "Non è stato possibile creare la Query."
            blnQueryOk = False
        Else
            blnQueryOk = True
        End If
        
        'La query è stata creata, la eseguo per popolarla e la chiudo subito.
        If blnQueryOk = True Then
            DoCmd.OpenQuery (strNomeQuery)
            DoCmd.Close acQuery, strNomeQuery
        End If

    A questo si aggiunge 

    Public Const strFileNameEsportazioneOrdini = "EsportazioneOrdini"
    Public Const strPathFileNameEsportazioneOrdini = "C:\Users\Boss\Documents\Creo\Progetti\ZeCIP\EsportazioneOrdini.xlsx"

    Grazie

    Ste

  • Re: Errore 3027

    Scusa ma cosa ti costa fornire la Query già risolta…?
    Quella Tabella ottenuta dall'importazione del File da EXCEL, come minimo non ha la PK… ovviamente non può essere editabile come ho scritto sopra. 

  • Re: Errore 3027

    04/01/2023 - @Alex ha scritto:


    Scusa ma cosa ti costa fornire la Query già risolta…?
    Quella Tabella ottenuta dall'importazione del File da EXCEL, come minimo non ha la PK… ovviamente non può essere editabile come ho scritto sopra. 

  • Re: Errore 3027

    Continuo a sostenere che non hai la PK, mi pare tu faccia fatica a comprendere il concetto dietro alla mia osservazione.

  • Re: Errore 3027

    Direi che la risposta l'ha già fornita Alex : molto probabilmente la tabella non ha un chiave primaria …

  • Re: Errore 3027

    04/01/2023 - @Alex ha scritto:


    Quella Tabella ottenuta dall'importazione del File da EXCEL, come minimo non ha la PK… ovviamente non può essere editabile come ho scritto sopra. 

    Nessuna delle query che ho ha una chiave primaria, indipendentemente da come l'ho creata, eppure funziona tutto (tranne una).

    In riferimento alla lista, non uso nessuna delle clausole indicate, anche il discorso della chiave primaria la vedo associata a campi JOINed che non ho… 

    Grazie

    Ste

  • Re: Errore 3027

    04/01/2023 - @Alex ha scritto:


    Continuo a sostenere che non hai la PK, mi pare tu faccia fatica a comprendere il concetto dietro alla mia osservazione.

    Infatti…

Devi accedere o registrarti per scrivere nel forum
17 risposte