Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 8 su 8

aggiornamento di records duplicati

  1. #1
    Roby58 non è in linea Novello
    Carissimi,
    visto il grande aiuto che mi avete dato l'altra volta sono di nuovo a chiedervi una mano su un altro problemino che mi sta facendo "sclerare"
    Vi premetto che nella tabella dove devo lavorare il campo chiave è costituito da un testo con un particolare formato: "<[testo]:[altrotesto]:000000>" oppure "<[testo]:[altrotesto]:000000:000>" (questo formato non è stato deciso da me ma dal programma particolare che genera queste stringhe).
    Il secondo formato si crea quando un record del primo formato (originale) viene duplicato per la realizzazione di una nuova versione dello stesso rendendo obsoleto il record originale ed aggiungendo nella parte numerica dopo i ":" un numero progressivo. Il mio problema si genera con l'iniziale importazione massiva di tutti i record da file esterno dove ho per alcuni record sia il record originale che il record generato da nuova versione.
    Ho creato per prima cosa una query che mi trovasse i duplicati basandomi sulla parte di stringa in comune (":000000" e ":000000:") e che, basandosi sul progressivo contenuto nella parte finale (":000") mi isolasse i soli records più "vecchi" (usando la funzione Dmin) così da poter usare i risultati per generare un'ulteriore query che provveda alla "marcatura" tramite un booleano di questi record direttamente nella tabella di origine.
    Il problema che, usando questo metodo, la seconda query, quella che agisce sulla tabella, mi rigetta il lavoro dicendomi che sto lavorando su una query non aggiornabile anche se l'aggiornamento che sto operando è su un campo situato sulla tabella.
    Non so più dove sbattere la testa per ottenere il risultato desiderato, ovvero la "marcatura" dei record doppi più vecchi come obsoleti.
    Spero di essermi espresso comprensibilmente...
    Grazie anticipatamente per qualunque suggerimento possiate darmi.

    Roberto

  2. #2
    Quote Originariamente inviato da Roby58 Visualizza il messaggio
    ...
    Ho creato per prima cosa una query ... un'ulteriore query che provveda alla "marcatura" tramite un booleano ...
    Direi che vedere queste query è il primo passo.

  3. #3
    Roby58 non è in linea Novello
    Scusate se solo ora rispondo ma ho avuto un mezzo disastro per cui mi ero perso metà del lavoro fatto l'altro giorno sul database

    Consideriamo che della tabella su cui devo lavorare mi interessano, qui, quattro campi:

    KUID (testo breve) (chiave primaria)
    Progr (numerico)
    Versione (numerico)
    Obsoleto (boleano)

    Il campo "Progr" è la fonte per la ricerca dei duplicati mentre il campo "Versione" è quello che mi dice quale sia il record da rendere obsoleto.
    Per questa ragione avevo creato una query di questo tipo:

    SELECT KUID.Progr, Min(KUID.Versione) AS MinDiVersione, KUID.Obsoleto
    FROM KUID
    GROUP BY KUID.Progr, KUID.Obsoleto
    HAVING (((KUID.Progr) In (SELECT [Progr] FROM [KUID] As Tmp GROUP BY [Progr] HAVING Count(*)>1 )));
    
    che, effettivamente, mi seleziona il record che voglio trovare ma... a questo punto non so come utilizzare questo risultato per aggiornare nella tabella il campo booleano "Obsoleto"
    NB che nella query qui sopra non ho potuto inserire il campo "KUID" in quanto con questo presente mi si annullava tutto il discorso del "MinDiVersione"
    Non vorrei aver sbagliato completamente l'approcio al problema ma non ho proprio idea di come uscirne.
    Spero che in questo modo sia un po' più chiaro l'inghippo.
    Ciao
    Roberto

  4. #4
    L'avatar di gibra
    gibra non è in linea Very Important Person
    1° punto:
    Quote Originariamente inviato da Roby58 Visualizza il messaggio
    KUID (testo breve) (chiave primaria)
    Progr (numerico)
    Versione (numerico)
    Obsoleto (boleano)
    Parli di campi numerici, ma in realtà hai indicato questi campi con:
    Quote Originariamente inviato da Roby58 Visualizza il messaggio
    [testo]:[altrotesto]:000000>" oppure "<[testo]:[altrotesto]:000000:000>
    
    quindi manca un campo (altrotesto), inoltre sono perplesso, perché il 'formato' che indichi non è numerico ma testuale.
    Mi è oscura l'utilità del campo Obsoleto, non c'è già il campo Versione ?

    E' possibile vedere la tabella in questione? Non dico tutto il database, ma magari esportare la tabella in un db Access di esempio?
    Io preferisco sempre lavorare sui dati reali, più che sulle teorie.

    2° punto
    Dato che pubblichi una query di selezione, ma parli di aggiornamento, non è chiaro come stai procedendo:
    1. devi aggiornare la tabella origine?
    2. devi estrarre/importare dati dalla tabella di origine?
    3. entrambe le cose?
    4. parli di una seconda query. Quale?
    ℹ️ Leggi di più su gibra ...

  5. #5
    Roby58 non è in linea Novello
    Quote Originariamente inviato da gibra Visualizza il messaggio
    1° punto:

    Parli di campi numerici, ma in realtà hai indicato questi campi con:

    quindi manca un campo (altrotesto), inoltre sono perplesso, perché il 'formato' che indichi non è numerico ma testuale.
    Mi è oscura l'utilità del campo Obsoleto, non c'è già il campo Versione ?
    Pare una cosa un po' strampalata ma non dipende da me. Questo gestionale che sto cercando di mettere su dovrebbe gestire gli archivi personali di utenti di un simulatore che basa la chiave primaria dei propri oggetti sullo schema <kuid:999999:000000> dove la serie di "9" rappresenta il codice user assegnato dal simulatore all'utente mentre la serie degli "0" rappresenta un semplice progressivo. Avviene che, quando un oggetto riceve un upgrade e necessita quindi di essere pubblicato in una nuova versione lo schema della chiave primaria diviene <kuid2:999999:000000:001> cioè, pur mantenendo il progressivo e, ovviamente, lo user identici, si differenzia da quello originale per la presenza di quel "2" dopo la scritta "kuid" e dall'aggiunta di un ulteriore progressivo (001) mentre il precedente codice diviene obsoleto.

    Quote Originariamente inviato da gibra Visualizza il messaggio
    2° punto
    Dato che pubblichi una query di selezione, ma parli di aggiornamento, non è chiaro come stai procedendo:
    1. devi aggiornare la tabella origine?
    2. devi estrarre/importare dati dalla tabella di origine?
    3. entrambe le cose?
    4. parli di una seconda query. Quale?
    la questione è che, mentre nell'uso corrente che verrà fatto di questo gestionale il problema di obsolare un oggetto non da fastidi in quanto la vecchia versione verrà flaggata direttamente durante la creazione della nuova, il problema sorge in fase iniziale di caricamente per la prima volta degli archivi personali esistenti tramite file esterno. In questo archivio possono essere presenti diverse versioni del medesimo oggetto che darebbero fastidio poi nell'uso corrente del gestionale. Vero che queste versioni obsolete possono anche essere gestite mediante l'apposizione manuale di un flag nel campo "obsoleto" ma sarebbe decisamente qualcosa di poco simpatico (nel mio personale caso l'archivio importato è costituito da 793 oggetti di cui 8 sono da marcare come obsoleti). Ecco perchè stavo cercando il modo di ovviare in maniera automatica cercando i record doppi e ricavando quali erano quelli più vecchi.
    Per poter lavorare più agevolmente ho provveduto a scorporare la chiave primaria in due ulteriori campi che sono, appunto, il campo "progr" che contiene il progressivo dell'oggetto, ed il campo "Versione" che, invece, contiene l'eventuale progressivo generato dalla costruzione del codice di tipo "kuid2".
    Spero ora che sia più chiaro qual'è lo scopo per cui ho necessità di fare le cose in un certo modo.
    Avevo pure pensato di vedere se era possibile, utilizzando i risultati della query di selezione indicata prima, di creare una tabella provvisoria da utilizzare, appunto, per la flaggatura degli obsoleti e poi cancellarla ma penso che ci possano senz'altro essere sistemi più efficaci per fare questa cosa.
    Grazie ancora per ogni aiuto possiate darmi.
    Roberto
    Ultima modifica di Roby58; 19-03-2021 19:09 

  6. #6
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Quote Originariamente inviato da Roby58 Visualizza il messaggio
    Spero ora che sia più chiaro
    Mah, veramente ha ripetuto quello che avevi già detto (e che abbiamo già capito).
    Non ho trovato le risposte a ciò che ti ho chiesto.
    ℹ️ Leggi di più su gibra ...

  7. #7
    Roby58 non è in linea Novello
    devo fare un aggiornamento sulla tabella di origine ponendo appunto il flag sui record che rispondono ai requisiti contenuti dalla query, ovvero il record più vecchio di ogni gruppo di doppioni che trova.

  8. #8
    Roby58 non è in linea Novello
    Ho finalmente risolto il mio problema in modo magari non elegante ma ottenendo quello che desideravo utilizzando due tabelle provvisorie (create e aggiornate tramite due apposite query) e l'utilizzo seguente di due recordset da confrontare tramite vba (uno ottenuto dalla tabella provvisoria finale e uno dalla tabella contenente i dati che dovevo aggiornare).
    Grazie lo stesso per i suggerimenti dati...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Articolo: Copia records
    Da @Alex nel forum Microsoft Access
    Risposte: 0
    Ultimo Post: 06-11-2014, 09:12
  2. Query di aggiornamento su ID Duplicati (Access 2010)
    Da chinoknot nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 14-12-2010, 00:32
  3. find in 2.300.000 di records
    Da sal21 nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 10-12-2010, 22:57
  4. spostamento tra records
    Da tdani nel forum Microsoft Word
    Risposte: 4
    Ultimo Post: 26-03-2009, 17:14
  5. blocco dei records
    Da felix76 nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 01-11-2005, 17:05