Come risolvere "This recordset is not updateable"

di il
14 risposte

Come risolvere "This recordset is not updateable"

Buongiorno,

Vorrei utilizzare una query per aggiornare una tabella ma access mi risponde "This recordset is not updateable".

La tabella da aggiornare è DOC_TAG_Flag

La query che non funziona “Query_DOC_TAG_Select_1”

La query “Query_DOC_TAG_Select_1” è composta da due colonne:

Colonna 1 ) Nome campo: TAG , provenienza da Query: DOC_TAG_Select (questa query è una query di riepilogo)

Colonna 2) Nome campo: FLAG , provenienza da Tabella: DOC_TAG_Flag

La query DOC_TAG_Select e la tabella DOC_TAG_Flag sono legate da una relazione semplice (non rinforzata) tramite il campo TAG presente in entrambe.

Il campo TAG della tabella DOC_TAG_Flag è impostato come chiave primaria.

Non sono sicuro se il mio intento è fattibile.

Ringrazio anticipatamente

Francesco

14 Risposte

  • Re: Come risolvere "This recordset is not updateable"

    Devi pubblicare il predicato SQL della query. E' collegato immagino al thread di ieri. (così magari se c'è bisogno si va a buttar l'occhio pure su quello)

  • Re: Come risolvere "This recordset is not updateable"

    16/10/2024 - Philcattivocarattere ha scritto:


    Devi pubblicare il predicato SQL della query. E' collegato immagino al thread di ieri. (così magari se c'è bisogno si va a buttar l'occhio pure su quello)

    @Phil

    Si ti confermo che questo thread è collegato a quello di ieri. Sto lavorando alla definizione di un metodo di selezione multipla con tabella FLAG.

    il predicato SQL della query DOC_TAG_Select_1 che non accetta aggiornamento è di sotto riportata:

    DOC_TAG_Select è una Query

    DOC_TAG_Flag è una tabella (quella che intendo popolare aggiornando la query)

    SELECT DOC_TAG_Select.TAG, DOC_TAG_Flag.FLAG
    FROM DOC_TAG_Select LEFT JOIN DOC_TAG_Flag ON DOC_TAG_Select.TAG = DOC_TAG_Flag.TAG;
    
    
  • Re: Come risolvere "This recordset is not updateable"

    16/10/2024 - fcaliandro ha scritto:

    DOC_TAG_Select è una Query

    E allora serve anche quella, per sicurezza. Forse qualcosa già si può dire su quella che hai già pubblicato ma con la visione completa si evitano risposte “parziali”.

  • Re: Come risolvere "This recordset is not updateable"

    16/10/2024 - fcaliandro ha scritto:


    La tabella da aggiornare è DOC_TAG_Flag

    quindi Update doc_tag_flag set (campo1, campo2, …, campoN) value (????) qui non capisco da dove vuoi prendere i dati.

    in select bla bla…? 

    questa select?

    SELECT DOC_TAG_Select.TAG, DOC_TAG_Flag.FLAG
    FROM DOC_TAG_Select LEFT JOIN DOC_TAG_Flag ON DOC_TAG_Select.TAG = DOC_TAG_Flag.TAG;

    16/10/2024 - fcaliandro ha scritto:


    La query DOC_TAG_Select e la tabella DOC_TAG_Flag sono legate da una relazione semplice (non rinforzata) tramite il campo TAG presente in entrambe.

    la query doc_tag_select che predicato  sql ha?

    perchè legare doc_tag_select con Doc_Tag_Flag? non ha senso legare una query con la tabella che la origina.

    16/10/2024 - fcaliandro ha scritto:


    il predicato SQL della query DOC_TAG_Select_1 che non accetta aggiornamento è di sotto riportata:

    DOC_TAG_Select è una Query

    doc_tag_Select_1 una query che viene fuori dalla query Doc_tag_select??? modifica direttamente la Doc_Tag_select! (Che non stai mostrando)

    uhm… scrivi nomi tabelle e relativi campi 

    es. clienti: idcliente; nominativo; …; ultimocampo;

    le query scrivi il nome e il predicato

    es. SqlestraiClienti: select * fron clienti where provincia=PV

    almeno possiamo(posso) analizzare meglio cosa devi fare.

  • Re: Come risolvere "This recordset is not updateable"

    Stai cercando di aggiornare un record generato con valori che provengono da diverse tabelle, ma le tabelle non sono collegate tra di loro con relazioni tra di loro.

    E' possibile ad esempio visualizzare dati non collegati tra di loro con relazioni dirette ma con elementi comuni ad entrambe , impostando nella query relazioni diverse a quelle generali, ma non è possibile modificare o aggiungere record.

  • Re: Come risolvere "This recordset is not updateable"

    @ Phil , @ Andrea

    Scusate ma in effetti non ho molta fantasia nel nominare gli oggetti.

    Si parte da un grande tabellone che si chiama TFGH. Esso non è altro che una lista della spesa composta dai campi NUMERO ORDINE DI ACQUISTO, TAG ACQUISTATO, DATA DI ACQUISTO. Questa tabella contiene tutte le righe d'ordine emessi in un arco temporale molto lungo (circa 2 anni). Di conseguenza contiene un numero di righe superiore a 10.000 con un numero consistente di duplicati del campo TAG ACQUISTATO.

    Se si trattasse di elettrodomestici potrebbe essere il modello di una lavatrice (TAG = ARISTON-LD20) acquista n volte da n clienti.

    Per questo motivo nasce la prima query di riepilogo che lista tutti i TAG ACQUISTATI senza ripetizioni. Questa query è la DOC_TAG_Select.

    Essa però non contiene in campo FLAG che mi occorre per poter selezionare i TAG da registrare in una maschera che dovrà gestire altri dati non presenti nella tabella principale TFGH.

    Questo è il motivo per cui ho creato la query DOC_TAG_Select_1 che non è altro che la query DOC_TAG_Select abbinata alla tabella DOC_TAG_Flag che contiene il campo FLAG.

    Di seguito riporto tutte le query:

    Query di raggruppamento per listare tutti i TAG senza ripetizioni DOC_TAG_Select 

    SELECT  TFGH.[TAG]
    FROM TFGH
    GROUP BY TFGH.[TAG]
    
    

    Query di selezione (che non funziona in aggiornamento) DOC_TAG_Select _1

    SELECT DOC_TAG_Select.TAG, DOC_TAG_Flag.FLAG
    FROM DOC_TAG_Select LEFT JOIN DOC_TAG_Flag ON DOC_TAG_Select.TAG = DOC_TAG_Flag.TAG;
    

    La tabella TFGH contiene il campo TAG che è di tipo short text

    Spero di non aver tralasciato nulla

    Francesco

  • Re: Come risolvere "This recordset is not updateable"

    16/10/2024 - fratac ha scritto:


    Stai cercando di aggiornare un record generato con valori che provengono da diverse tabelle, ma le tabelle non sono collegate tra di loro con relazioni tra di loro.

    E' possibile ad esempio visualizzare dati non collegati tra di loro con relazioni dirette ma con elementi comuni ad entrambe , impostando nella query relazioni diverse a quelle generali, ma non è possibile modificare o aggiungere record.

    @ fratac

    ho risposto dopo di te @ Phil & @ Andrea

    La tabella principale dove risiedono i dati di partenza non permette di impostare un campo chiave primaria con relazioni forti. Il campo in questione (TAG) è duplicato.

    Ho creato una query di riepilogo per il campo TAG per averlo non duplicato. Vorrei evitare di utilizzare una query make table partendo da quest'ultima. Così risolverei il problema ma vorrei gestire tutto dalla query di raggruppamento.

  • Re: Come risolvere "This recordset is not updateable"

    Con il dovuto rispetto, in tutto quello che hai detto ho capito solo che hai un gran tabellone.

    A parte gli scherzi, ho capito quello che hai (cioè una tabella stile excel su access) e che vorresti usare la stessa tabella come sorgente e destinataria dei dati, come se fosse un database relazionale.

    Ti dico subito: Lascia perdere e continua ad usare questo foglio excel come lo hai sempre usato.

    A meno che non riscrivi completamente il database , in modo relazionale, oppure trasformi la struttura di questo, lasciando i record già inseriti, modificandoli con apposite procedure che vadano a dividere i dati, posizionarli nelle relative tabelle e poi creare manualmente le relazioni. 
    Cosa che non è agevole.

    In entrambi i casi devi raggiungere una conoscenza di access, dei database relazionali e del vba, che va oltre alle tue attuali conoscenze e che implica come minimo un periodo di tempo che va tra i 3 mesi ed i 12 mesi di studio, prove e falliment, scoprendo poi alla fine che quello che stai tentando di fare è una sciocchezza e ti ritroverai a riscrivere il database.

    quello che vuoi fare è' un lavoro che anche un professionista, (sempre che accettasse di farlo, spillandoti solo soldi) si dovrebbe un attimo fermare a riflettere ed impiegare un tempo considerevole per fare quello che vuoi fare.

    Tutte le soluzioni o toppe a cui stai pensando, che magari a livello logico sembrano funzionare, poi al momento di realizzarle ti creano problemi su problemi da risolvere in continuazione.

    Considerando che da quello che scrivi, non conosci nemmeno la select distinct (che comunque a livello pratico non risolve i problemi che hai), ti consiglio vivamente di prendere in considerazione di riscrivere totalmente il database e soprattutto di approfondire in modo serio l'argomento database relazionali ed access.

    e come sospettavo, non puoi modificare o aggiungere record che provengono da una query di raggruppamento, oppure da una unica tabella, che tra parentesi non ha nemmeno una PK univoca di riferimento per modificare o aggiungere record.

  • Re: Come risolvere "This recordset is not updateable"

    16/10/2024 - fratac ha scritto:


    Con il dovuto rispetto, in tutto quello che hai detto ho capito solo che hai un gran tabellone.

    A parte gli scherzi, ho capito quello che hai (cioè una tabella stile excel su access) e che vorresti usare la stessa tabella come sorgente e destinataria dei dati, come se fosse un database relazionale.

    Ti dico subito: Lascia perdere e continua ad usare questo foglio excel come lo hai sempre usato.

    A meno che non riscrivi completamente il database , in modo relazionale, oppure trasformi la struttura di questo, lasciando i record già inseriti, modificandoli con apposite procedure che vadano a dividere i dati, posizionarli nelle relative tabelle e poi creare manualmente le relazioni. 
    Cosa che non è agevole.

    In entrambi i casi devi raggiungere una conoscenza di access, dei database relazionali e del vba, che va oltre alle tue attuali conoscenze e che implica come minimo un periodo di tempo che va tra i 3 mesi ed i 12 mesi di studio, prove e falliment, scoprendo poi alla fine che quello che stai tentando di fare è una sciocchezza e ti ritroverai a riscrivere il database.

    quello che vuoi fare è' un lavoro che anche un professionista, (sempre che accettasse di farlo, spillandoti solo soldi) si dovrebbe un attimo fermare a riflettere ed impiegare un tempo considerevole per fare quello che vuoi fare.

    Tutte le soluzioni o toppe a cui stai pensando, che magari a livello logico sembrano funzionare, poi al momento di realizzarle ti creano problemi su problemi da risolvere in continuazione.

    Considerando che da quello che scrivi, non conosci nemmeno la select distinct (che comunque a livello pratico non risolve i problemi che hai), ti consiglio vivamente di prendere in considerazione di riscrivere totalmente il database e soprattutto di approfondire in modo serio l'argomento database relazionali ed access.

    e come sospettavo, non puoi modificare o aggiungere record che provengono da una query di raggruppamento, oppure da una unica tabella, che tra parentesi non ha nemmeno una PK univoca di riferimento per modificare o aggiungere record.

    @ Fratac, ti ringrazio per avermi confermato che la strada non è questa. E' quello che avevo bisogno di sapere.

    Per il resto, anche se non sono un programmatore confido nella mia tenacia. Prima di decidere di fare qualcosa ci penso bene. In questo caso ho atteso molto riflettendoci su. Devo solo capire il modo migliore. In questo caso mi è stato utile sapere che non è possibile aggiornare i dati utilizzando una query siffatta.

    Con la stessa tenacia proverò a generare una table con dati univoci che periodicamente lancerò per tenerla aggiornata ed allineata al tabellone principale. Non è bellissimo ma funzionerà. Anche perchè il tabellone lo importo ogni giorno ed in contemporanea lancerò la query make table per crearmelo.

    PS: La mia esperienza su Access si è basata sul lontano interesse al programma in se, su un paio di testi ben scritti di Alessandra Salvaggio, ma soprattutto sull'aiuto ricevuto su questo forum da esperti come te. Excel non mi interessa perchè non fa da base per i dati.

    Ciao

    Francesco

  • Re: Come risolvere "This recordset is not updateable"

    16/10/2024 - fcaliandro ha scritto:


    Anche perchè il tabellone lo importo ogni giorno

    No, aspetta. Che siginifica lo importo ogni giorno?

    16/10/2024 - fcaliandro ha scritto:


    Excel non mi interessa perchè non fa da base per i dati.

    In realtà excel è perfetto per la struttura di archiviazione che hai.

    quello che stai tentando di fare non è certo un database.

    Excel è nato proprio per gestire i “tabelloni” e può tranquillamente funzionare come database non relazionale, come quelli che si realizzavano 30 anni fa.

    Forse non lo sai, ma excel permette la creazione di maschere identiche a quelle di access, ed ha il vba che è  praticamente  identico a quello di access. Cambiano solo gli oggetti da gestire ed è molto più semplice da usare.

  • Re: Come risolvere "This recordset is not updateable"

    16/10/2024 - fcaliandro ha scritto:


    Query di selezione (che non funziona in aggiornamento) DOC_TAG_Select _1

    SELECT DOC_TAG_Select.TAG, DOC_TAG_Flag.FLAG
    FROM DOC_TAG_Select LEFT JOIN DOC_TAG_Flag ON DOC_TAG_Select.TAG = DOC_TAG_Flag.TAG;
    

    La tabella TFGH contiene il campo TAG che è di tipo short text

    flag da dove viene fuori? ma, soprattutto, a che ti serve? e oltretutto come speri di aggiornarlo?

    DOC_TAG_Flag che campi ha?

    16/10/2024 - fcaliandro ha scritto:


    Si parte da un grande tabellone che si chiama TFGH. Esso non è altro che una lista della spesa composta dai campi NUMERO ORDINE DI ACQUISTO, TAG ACQUISTATO, DATA DI ACQUISTO.

    mai pensato di usare count per il campo tag?

    hai un “tabellone” che suppongo sia una tabella con tanti record dove hai num. ordine, data e tag, con ovvie ripetizioni del campo tag in base al nr. ordine e data.

    flag, che non richiede l'abonamento alle partite satellitari quindi l'uso è gratuito, non puoi aggiungerlo alla tabella? e come detto prima, a che servirebbe e come impostarlo tra vero e falso? con quale criterio? piuttosto che popolare doctagflag non puoi popolare tfgh?

    se non chiarisci che dati raccogli e come li vuoi manipolare non è possibile rispondere. posso solo dire che quella query non accetta modifiche e/o inserimenti. in effetti, trattandosi di interrogazione al db non ha senso la modifica (a parte che per inserire la sql inizia con insert e per la modifica inizia con update) la select sta solo mostrando.

  • Re: Come risolvere "This recordset is not updateable"

    @ Andrea, @ Fratac

    il tabellone mi arriva quotidianamente dall'organizzazione che gestisce gli ordini. Lo scarico dal portale dedicato. Esso non contiene il campo FLAG (yes/no).

    Il perchè del campo FLAG deriva dal mio progetto in partenza descritto nel thread precedente a questo (titolo thread "Velocizzare l'inserimento dati con maschera ausiliaria con codice VBA").

    Ieri, dopo aver raccolto i vostri feedback sono arrivato alla conclusione che una query composta da campi provenienti da una query di riepilogo + una tabella non può funzionare in immissione dati (record set not updateable) a prescindere. Quindi la strada è quella di lavorare su una query basata su due tabelle legate da una relazione.

    E' quello che sto per fare adesso.

    La tabella DOC_TAG_Flag è una tabella che contiene solo due campi:

    TAG (shortext)

    FLAG (yes/no)

    E' una tabella sulla quale registro dei dati temporaneamente fin quando non ho completato l'immissione dati. Come se fosse una tabella di appoggio in excel. Una volta trasferiti i dati nella tabella di destinazione posso pulirla ed utilizzarla per una nuova immissione.

    Il concetto della maschera che vorrei realizzare è:

    1. prima selezione tutti i TAG che voglio registrare (aggiornando il valore di "FLAG" / Flag=Yes)
    2. poi in sol colpo li registro in record successivi (copia a destinazione solo ciò che ha il FLAG=Yes)

    Perchè fare così: “per ridurre il numero di azioni manuali in tastiera durante l'immissione dati” ? credo sia un caso classico ma non sono sicuro che si faccia così o se access ha qualche creazione automatica di maschera pronta per tale scopo.

  • Re: Come risolvere "This recordset is not updateable"

    La nebbia va diradandosi…

    quello che vuoi fare:

    ti arriva un resoconto in excel

    importi i dati in una tabella

    metti il flag

    registri solo i record flaggati

    come stai operando:

    17/10/2024 - fcaliandro ha scritto:


    prima selezione tutti i TAG che voglio registrare (aggiornando il valore di "FLAG" / Flag=Yes)

    se visualizzi i dati in tabella basta abilitarla in multiselezione ed evitare il flag.

    come devi operare:

    svuoti la tabella temporanea

    quando selezioni il record lo copi in una tabella temporanea:

    INSERT INTO tabella temporanea (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);

    value presi dalla tabella che impora i dati da excel…

     columnN è il flag impostato a “yes”

    17/10/2024 - fcaliandro ha scritto:


    poi in sol colpo li registro in record successivi (copia a destinazione solo ciò che ha il FLAG=Yes)

    INSERT Tabelladestinazione (val1, val2, …, valN-1) SELECT val1, val2, …, valN-1 FROM tabellatemporanea

    dove tabelladestinazione è dove vuoi inserire in cascata i record (come vedi la parola chiave è insert non select) e la tabellatemporanea è quella che popoli man mano che selezioni i record che volevi flaggare.

    mi fermo a n-1 perchè n sarebbe il flag che non hai nella tabella destinazione.

    ovviamente se ho ben capito cosa devi fare.

  • Re: Come risolvere "This recordset is not updateable"

    Un altro suggerimento sarebbe da excel un cerca verticale con i tag da importare e importare solo i tag a true o yes

    la tabella di import sarebbe già la tabella temporanea… ;)

Devi accedere o registrarti per scrivere nel forum
14 risposte