Update query with sql - access 2013

di il
7 risposte

Update query with sql - access 2013

Buongiorno a tutti,
ho una tabella con una serie di record da aggiornare (devo aggiornare solo 1 campo per ogni record), e l'informazione viene presa da un`altra tabella.

Tabella con i record da aggiornare:
[T-0901a Production Sheet - Fabric Requirements - Transit]
ORDERLINE3 ORDERLINE6 FABRICNOTE
11345 19 AAAAAA
11345 20 AFAFSFSF
11345 21 ASDASFSASF
11345 22 EFWWERWE

Il valore da copiare e` nella seguente tabella:
[T-0922a Production Sheet - Replace Buyer Order No]
BuyerOrderNo OrderLine3
43444 11374


Quello che devo fare e` prendere il valore 11374 dalla seconda tabella, e sostituirlo nella prima tabella al posto di 11345.

Ho provato il seguente codice:
UPDATE [T-0901a Production Sheet - Fabric Requirements - Transit]
SET orderline3 = (SELECT [orderline3]
from [T-0922a production sheet - replace buyer order no]);
Non funziona, dice: operation must use an updateable query.

Allora ho provato questo codice:
UPDATE [T-0901a Production Sheet - Fabric Requirements - Transit]
SET orderline3 = 11374
E funziona! La query sostituisce tutti i campi con 11345 con 11374.
Pero` ho bisogno che la query prenda il valore dalla tabella, non posso digitarlo a mano ogni volta.

Avete qualche suggerimento?
Dove e` che sbaglio?

Grazie in anticipo a tutti

7 Risposte

  • Re: Update query with sql - access 2013

    Pupaz ha scritto:


    ...
    Ho provato il seguente codice:
    UPDATE [T-0901a Production Sheet - Fabric Requirements - Transit] 
    SET orderline3 = (SELECT [orderline3] 
    from [T-0922a production sheet - replace buyer order no]);
    Non funziona, dice: operation must use an updateable query.
    ...
    Prova con
    
    UPDATE [T-0901a Production Sheet - Fabric Requirements - Transit], [T-0922a production sheet - replace buyer order no]
    SET [T-0901a Production Sheet - Fabric Requirements - Transit].[orderline3] = [T-0922a production sheet - replace buyer order no].[orderline3]
    La tabella [T-0922a production sheet - replace buyer order no] ha sempre e solo un record? se la risposta è "no" aggiungi
    ... WHERE ([T-0922a production sheet - replace buyer order no].[nomecampo]) = criterio
    per ottenere un unico valore da usare per l'aggiornamento

    EDIT: però... c'è un però che mi rode. Non c'è proprio alcun legame tra le due tabelle? Quello che ho scritto funziona anche se segnala che l'update avviene su molti più record di quanti in realtà sono presenti nella prima tabella, quella che contiene il campo da aggiornare, visto che una SQL di questo tipo
    UPDATE Tab1, Tab2 SET Tab1.CampoX = Tab2.CampoY
    restituirebbe come numero di record da aggiornare il prodotto cartesiano delle due tabelle. Prendi quello che ho suggerito con molta prudenza, anche se nei test che ho fatto funziona visto che Tab2, alla fine, veniva ad avere 1 record solo (o perché ha un record solo di suo o perché viene limitata da un WHERE, vedi sopra)
  • Re: Update query with sql - access 2013

    Ma la query
    
    (SELECT [orderline3]
    from [T-0922a production sheet - replace buyer order no])
    
    cosa restituisce eseguendola da sola?

    Qual è la 'relazione logica' tra le due tabelle?

    Infine, nella seconda UPDATE manca la condizione WHERE, quindi è sbagliata, a meno che tu non sia certo al 100% che conterrà solo i valori indicati.
    Ma anche in questo caso, è una 'mina vagante' perché chi assicura che un domani invece di valori uguali di orderline3 ne contenga anche altri e diversi?
  • Re: Update query with sql - access 2013

    Grazie ragazzi,
    Ora non sono davanti al mio computer, quindi non posso dirvi se funziona il codice...
    Ve lo saprò dire nel giro di poche ore
    Per rispondere ai vostri dubbi,
    La prima tabella, quella che contiene i 4 record (orderline3 = 11345),
    Si, contiene solo records con orderline3 = 11345, questo perché i dati sono stati presi e copiati da un altra tabella, tramite un append query. Voglio dire essere sicuro di prendere solo i record interessati.
    Mentre la seconda tabella, contiene sempre e solo 1 record, ed il valore nel campo orderline3 è quello selezionato tramite un'altra query , e scritto all'interno di questa tabella.
    Ho deciso di lavorare così perché i dati da filtrare sono moltissimi, in questo modo, se il sistema si blocca, analizzando i vari record, riesco a capire il problema.
    Alla fine del lavoro, i dati all'interno della prima tabella verranno copiati nella tabella principale assieme a tutti gli altri dati, ed infine cancellerò i record sia nella prima che nella seconda tabella.
  • Re: Update query with sql - access 2013

    Eccomi qua, FUNZIONA!!!! Grazie
    Ho due domande:
    1) perche` gli orderline3 devono essere scritti diversamente? il primo senza [], il secondo con [] ??

    2) di seguito ho scritto il codice completo che mi serve, e funziona
    fino a quando TUTTE le tabelle hanno almeno un record aggiornabile.
    Ma, se almeno 1 tabella e` senza record, si blocca tutto. Perche`? E cosa dovrei aggiungere?
    Grazie ancora



    UPDATE
    [T-0901a Production Sheet - Fabric Requirements - Transit],
    [T-0902b Production Sheet - Sample Requirements - Transit],
    [T-0903a Production Sheet - Style Colour Details - Transit],
    [T-0906b Production Sheet - Special Requirements - Transit],
    [T2-0904a Production Sheet - Details Pictures - Transit],
    [T2-0905a Production Sheet - Trim Requirement Pictures - Transit],
    [T-0922a production sheet - replace buyer order no]

    SET
    [T-0901a Production Sheet - Fabric Requirements - Transit].orderline3 = [T-0922a production sheet - replace buyer order no].[orderline3],
    [T-0902b Production Sheet - Sample Requirements - Transit].orderline3 = [T-0922a production sheet - replace buyer order no].[orderline3],
    [T-0903a Production Sheet - Style Colour Details - Transit].orderline3 = [T-0922a production sheet - replace buyer order no].[orderline3],
    [T-0906b Production Sheet - Special Requirements - Transit].orderline3 = [T-0922a production sheet - replace buyer order no].[orderline3],
    [T2-0904a Production Sheet - Details Pictures - Transit].orderline3 = [T-0922a production sheet - replace buyer order no].[orderline3],
    [T2-0905a Production Sheet - Trim Requirement Pictures - Transit].orderline3 = [T-0922a production sheet - replace buyer order no].[orderline3];
  • Re: Update query with sql - access 2013

    Pupaz ha scritto:


    ...
    1) perche` gli orderline3 devono essere scritti diversamente? il primo senza [], il secondo con [] ??
    Dove vedi che in uno si usano le parentesi quadrate e in altro no? In generale se non ci sono caratteri particolari o spazi, l'uso delle parentesi quadrate per il nome del campo (e delle tabelle) non è obbligatorio. Con quei nomi di tabella, però (usare gli alias, se possibile, sarebbe caldamente consigliato) meglio usare la notazione estesa [nometabella].[nomecampo] per evitare ogni rischio

    Pupaz ha scritto:


    ...2) di seguito ho scritto il codice completo che mi serve, e funziona
    fino a quando TUTTE le tabelle hanno almeno un record aggiornabile.
    Ma, se almeno 1 tabella e` senza record, si blocca tutto. Perche`? E cosa dovrei aggiungere?
    Ricorda che "si blocca tutto" è una descrizione del problema che non aiuta, devi essere più preciso.
    Penso di poter rispondere, comunque, in base a quanto avevo già scritto

    Philcattivocarattere ha scritto:


    ... una SQL di questo tipo
    UPDATE Tab1, Tab2 SET Tab1.CampoX = Tab2.CampoY
    restituirebbe come numero di record da aggiornare il prodotto cartesiano delle due tabelle
    Se una sola delle tabelle elencate dopo UPDATE non ha record il loro prodotto cartesiano è una query senza record, quindi non può aggiornare niente. Ecco che ha preso corpo il però che mi rodeva ieri.
    O fai N query di UPDATE distinte, una per ogni tabella da aggiornare, o usi vba per fare la stessa cosa cambiando solo la tabella da aggiornare. Scelgo la seconda.
    E' comunque l'intera procedura un po' macchinosa ma... dobbiamo fidarci del fatto che si debba agire su quelle tabelle in quel modo, nel senso dell'update prendendo il dato da una tabella che contiene un record solo ecc ecc.
  • Re: Update query with sql - access 2013

    Buongiorno a tutti,
    quando ho detto che si blocca tutto, intendevo dire che la query Update non scrive all`interno di nessuna tabella (in quanto una tabella e` senza record).

    Per me va benissimo fare una UPDATE query per ogni tabella,
    pero` mi piacerebbe capire anche come fare il tutto con una sola query...
    non c`e` modo di bypassare questo problema della tabella vuota??

    Grazie
  • Re: Update query with sql - access 2013

    Pupaz ha scritto:


    ...
    quando ho detto che si blocca tutto, intendevo dire che la query Update non scrive all`interno di nessuna tabella (in quanto una tabella e` senza record).
    Bene, allora la spiegazione è quella del post precedente.

    Pupaz ha scritto:


    ...
    pero` mi piacerebbe capire anche come fare il tutto con una sola query...
    Anche qui confermo il contenuto del post precedente: o query separate o vba (che alla fine altro non fa che eseguire query separate, via codice). Se ci sono "trucchi" SQL da parte di qualche altro utente, ben vengano.
Devi accedere o registrarti per scrivere nel forum
7 risposte