Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Query accodamento tra DB diversi - Errore chiave primaria

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Query accodamento tra DB diversi - Errore chiave primaria

Postdi Tekkon_84 » 26/01/11 12:19

Salve a tutti, sono un nuovo iscritto al forum, ma seguo i vostri post da tempo. Ricercando tra i vari post e non trovando ciò che fa al caso mio, apro io un nuovo post.
Ho tre database Access (db1.mdb, db2.mdb e db3.mdb) dove il primo è il database “Master - Archivio” e gli altri due sono i “secondari - temporanei”; in tutti tre ho la stessa tabella con gli stessi campi e la stessa struttura, che sono: ID (contatore – chiave primaria), Dipendente, Cliente, Lavoro, Sublavoro, Ora inizio, Ora fine, ecc.
I DB servono per registrare i lavori che ogni dipendente di uno studio segue nell’arco della giornata lavorativa.
Vorrei che funzionasse così: Il dipendente Tizio a fine giornata riempie nel file db2.mdb i record corrispondenti con i suoi dati, indicando i lavori seguiti, i clienti ecc. Lo stesso fa il dipendente Caio ma nel suo DB personale che è db3.mdb.
Poi questi record (del db2 e del db3) devono essere accodati alla tabella generale che sta invece nel db1.
Fin qui tutto ok, ovvero con la query di accodamento posso specificare il percorso da seguire per i files db2 e db3 (ad es. C:\Documents and Settings\User\Desktop\Access\db2.mdb) e il gioco è fatto.
Nascono due problemi:
1. Ho dei conflitti di duplicazione della chiave primaria. Nascono dal fatto che entrambe le tabelle (in db2 e in db3) quando si inizia a inserire i record potrebbero associare gli stessi numeri per il campo ID, e quando le vado ad accodare alla tabella in db1 può essere che il numero ID sia già presente e quindi l’accodamento fallisce.
2. Meno grave del precedente, se fisso il percorso della tabella da accodare nella query di accodamento (ad es. C:\Documents and Settings\User\Desktop\Access\db2.mdb) poi ovviamente devo fare in modo di mettere il file ogni volta in questa posizione, altrimenti la query non “trova” il database indicato. Esiste un modo di specificare il percorso, magari in una maschera di volta in volta?
Dico questo perché, risiedendo su un disco esterno, la lettera dell’unità non è sempre la stessa (a volte G: a volte H: )
Grazie infinite a tutti e scusatemi per il “tema” ma dovevo essere più chiaro possibile!
Tekkon_84
Utente Junior
 
Post: 15
Iscritto il: 25/01/11 16:34

Sponsor
 

Postdi archimede » 26/01/11 12:52

Tekkon_84 ha scritto:Ho dei conflitti di duplicazione della chiave primaria. Nascono dal fatto che entrambe le tabelle (in db2 e in db3) quando si inizia a inserire i record potrebbero associare gli stessi numeri per il campo ID, e quando le vado ad accodare alla tabella in db1 può essere che il numero ID sia già presente e quindi l’accodamento fallisce.
Supponendo che db1 serva "solo" come master (cioè non lo usi per inserire nuovi records in quella tabella diversi da quelli inseriti in db2 e db3), io farei così:

- fai in modo che l'ID di db2 o db3 parta da 5000000 (o altro numero che riterrai sufficiente ad evitare sovrapposizioni)
- togli la caratteristica contatore dalla PK di db1 (forse non necessario, non ricordo esattamente come gestisce Access le insert sui contatori)

HTH.

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Flash30005 » 26/01/11 13:00

Ciao Tekkon_84 e benvenuto nel Forum

Non è molto chiaro se il dipendente1 e dipendente2 usano lo stesso computer
(dai percorsi indicati sembrerebbe così anche se User potrebbe essere il nome di ciascun dipendente)
se usano lo stesso Pc oppure i Pc (compreso il master) si trovano all'interno di una piccola rete
penso tu possa risolvere entrambi i problemi in questa maniera:
Il dipendente1 scrive nel Db1 che è condiviso o accessibile dal Pc che ha il DbMaster
il dipendente2 scrive nel Db2 che è condiviso, anch'esso accessibile dal DbMaster
Nel DbMaster avrai non tabelle fisiche ma tabelle collegate alle tabelle del Db1 e Db2
A questo punto sul master puoi crearti una query di aggiornamento per ottenere una unica tabella che fa la join di entrambe le tabelle collegate (escludendo l'Id origine delle due tabelle).
Su questa tabella potrai fare quello che vuoi.

Fai sapere
ciao

Edit: abbiamo scritto contemporaneamente i due post, leggi quanto scritto da Archimede
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Tekkon_84 » 26/01/11 13:12

@archimede :
L'idea di far partire il contatore di numeri diversi era venuta anche a me, ma in realtà gli utenti sono 5-6 (nell'esempio ne ho scritti solo due per semplicità) e forse potrei arrivare a dei numeri molto molto grandi...preferirei evitare questa soluzione, anche se forse sarà l'unica, perchè in futuro potrei avere il problema di raggiungere la cifra e dover ri-modificare tutto, o trasferire i record in un altro DB. Inoltre la Pk non posso eliminarla perchè la tabella interagisce con altre tabelle collegate con Join, quindi la PK è necessaria.

@Flash30005 : Il punto è che gli utenti utilizzano Pc diversi, e anche se sono collegati in rete preferirebbero non sfruttare questa opzione. Questo perchè il DB potrebbe contenere "dati confidenziali", e il tutto viaggerebbe tramite chiavette Usb.
Cioè il db Master risiede su una chiavetta principale, e ogni dipendente compila il suo database che risiede sulla sua chiavetta personale. A fine giornata, L'incaricato della operazione, raccoglie tutte le chiavette e accoda tutti i record di ogni dipendente alla tabella principale nel Db Master...
Tekkon_84
Utente Junior
 
Post: 15
Iscritto il: 25/01/11 16:34

Postdi archimede » 26/01/11 13:19

Tekkon_84 ha scritto:potrei arrivare a dei numeri molto molto grandi...preferirei evitare questa soluzione, anche se forse sarà l'unica
Ci possono essere altre soluzioni, ma questa mi pare l'unica che non ti costringe a scrivere del codice e, quindi, è assai preferibile.

Francamente per un progetto come quello da te descritto (5 o 6 utenti che inseriscono dei dati che poi devono confluire in un db centrale) sconsiglierei una soluzione client server: molto più semplice un'applicazione web con UN db unico.

Comunque auguri per il tuo progetto (e complimenti per la chiarezza di esposizione del problema... capita così raramente :().

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Flash30005 » 26/01/11 13:42

Ehmmm :roll:

Non credo che l'incaricato inserisca le 6 o 7 chiavette in un Pc e contemporaneamente esegua l'aggiornamento del DbMaster.
Allora, visto che ogni utente ha un suo Db personale io farei così

1) darei lo stesso nome al dababase (uguale per tutti gli utenti)
2) il databese di ogni dipendente dovrà essere nel percorso chiavetta uguale per tutti (o root della chiavetta o in una cartella avente lo stesso nome)
3) nel Pc che aggiorna assegnerei la stessa lettera di disco rimovibile per ogni chiavetta (da fare una volta sola)
4) inserirei la chiavetta (una alla volta) e farei l'aggiornamento del DbMaster

Chiaramente nel DbMaster assegnerei come chiave primaria i campi che mi garantiscano la non duplicazione dei record
es.: Nome, Cognome, data e ora entrata
a questo punto nel DbMaster avrò una tabella aggiornata di tutti i record, di tutti i dipendenti, senza aver alcun duplicato.

Fai sapere
Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Tekkon_84 » 26/01/11 15:09

@archimede :
Non hai tutti i torti, credo che una applicazione web sia senz'altro più logica come scelta progettuale. Però:
1. Come ho scritto sopra, l'utilizzatore finale del DB vorrebbe evitare il più possibile la condivisione in rete, per motivi di trattamento di dati confidenziali;
2. Inizialmente il DB era stato concepito per lavorare su una sola macchina, con un unico utente che inseriva i dati di tutti le altre persone e il file .mdb risiedeva su una chiave usb (per i motivi spiegati nel p.1). Aumentando la mole di dati da inserire, fermo restando le condizioni appena spiegate, la scelta sprogettuale appena illustrata è sembrata l'unica disponibile;
3. Non sono un programmatore e le mie conoscenze in materia di codice, basi di dati e quant'altro è purtroppo assai limitata!! :neutral:

@Flash30005 :
In effetti l'incaricato esegue questo lavoro con una chiavetta alla volta (anche perché non vedo l'utilità di farle tutte insieme) però scusa non ho capito il passaggio n.3:
"3) nel Pc che aggiorna assegnerei la stessa lettera di disco rimovibile per ogni chiavetta (da fare una volta sola)"
Cioè dici di fare in modo che ogni volta che inserisco la chiavetta venga sempre riconosciuta con una lettera prefissata (ad es. F: )? Non sarebbe male...Ma come si fa? :) (perdonate l'ignoranza...)

La soluzione di Archimede, per evitare i conflitti con le PK ragionandoci mi sembra una buona soluzione. Cioè associare ad ogni tabella un ID numero - contatore che si muove solo all'interno di un range. Ad esempio per la tabella in db2 dico che l'ID (cioè la pk) deve andare da 1 a 1.000.000; per la tabella in db3 dico che l'ID deve andare da 1.000.001 a 2.000.00... ecc. Potrei aggirare l'ostacolo? Si potrebbero creare problemi?
In generale (leggendo in rete) un file Access è stabile fino a un massimo di 600Mb (anche Microsoft dichiara 2 Gb)...e io dovrei stare largamente sotto questo limite.
Esiste inoltre un sistema per "compattare" il database?

Intanto grazie mille per gli aiuti!!!
Tekkon_84
Utente Junior
 
Post: 15
Iscritto il: 25/01/11 16:34

Postdi archimede » 26/01/11 15:52

Tekkon_84 ha scritto:l'utilizzatore finale del DB vorrebbe evitare il più possibile la condivisione in rete, per motivi di trattamento di dati confidenziali;
Condividere un DB non significa necessariamente che tutti vedono tutto.
Tekkon_84 ha scritto:Aumentando la mole di dati da inserire, fermo restando le condizioni appena spiegate, la scelta sprogettuale appena illustrata è sembrata l'unica disponibile;
Se non vuoi/puoi riscrivere o comunque modificare l'applicazione esistente, sì.
Tekkon_84 ha scritto:Potrei aggirare l'ostacolo?
Quale?
Tekkon_84 ha scritto:Si potrebbero creare problemi?
Ovviamente. Quando uno dei db satellite arriva al limite del range della sua PK sarai nuovamente a rischio di duplicati: quanto questo sia probabile solo tu puoi saperlo. Ci sono poi da considerare tutti i problemi di "gestione" di n db da sincronizzare (e da backuppare, aggiornare, manutenere, ecc.).
Tekkon_84 ha scritto:un file Access è stabile fino a un massimo di 600Mb (anche Microsoft dichiara 2 Gb)...e io dovrei stare largamente sotto questo limite.
Esiste inoltre un sistema per "compattare" il database?
Non ricordo il limite "pratico", ma se ti poni questo problema forse è giunto il momento di iniziare a pensare a cambiare db (e, quindi, applicazione). Comunque sì, c'è l'opzione per compattare un db, verifica solo che non resetti i contatori (non mi pare, ma non si sa mai).

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Flash30005 » 26/01/11 15:53

Per assegnare una lettera alle periferiche tipo HD, CDrom Chiavette etc
devi andare su Pannello di Controllo -> Strumenti di Amministrazione -> Gestione Computer -> seleziona Gestione Disco
Selezioni il "disco" corrispondente alla chiavetta e cambi la lettera.
E' preferibile scegliere una lettera verso la fine dell'alfabeto es.: "X", "Y" o "Z" per non trovarla occupata da altre periferiche aggiunte successivamente che prenderanno la prima lettera libera in ordine crescente.

In questa maniera tutti i documenti avranno lo stesso porcorso es: Z:\DbDip.mdb
Per quanto riguarda l'ID lo escluderei proprio nell'importazione sulla tabella generale del DbMaster (che avrà un suo ID)
E ogni dipendente nella propria tabella non avrà problemi di ID anche se con chiave primaria.

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Postdi archimede » 26/01/11 15:58

Flash30005 ha scritto:Per quanto riguarda l'ID lo escluderei proprio nell'importazione sulla tabella generale del DbMaster (che avrà un suo ID)
E ogni dipendente nella propria tabella non avrà problemi di ID anche se con chiave primaria.
Se ci sono delle FK in altre tabelle che dipendono da questo ID, prevedo dei bei mal di testa. ;) Inoltre potrebbe diventare problematico sapere da quale satellite proviene un certo record guardando il db master.

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Flash30005 » 26/01/11 16:16

@Archimede
Hai ragione sotto molti aspetti ma, credo che, avendo inserito nella tabella master (quella che importa i dati) come chiavi primarie senza duplicati il campo Nome, Cognome, Data, Ora Entrata
si evitano duplicati
e per quanto riguarda l'uso all'atto pratico si potrà interrogare per mese e anno (tutti i dipendenti)
per dipendente e anno (tutti i mesi del dipendente)
per mese e anno e dipendente (solo un dipendente per quel periodo)
e altre query a secondo dell'esigenza
insomma mi sembra abbastanza versatile e non capisco a cosa può servire da dove provenga (satellite) :?:
perché in ogni caso se occorreva avere quel dato penso che chi avrà progettato il database avrà pensato di inserire anche un campo del Reparto o Codice di appartenenza e la query potrà estrapolare solo quel Reparto o codice.

Comunque dando informazioni/consigli senza sapere bene le esigenze quindi posso cadere facilmente in errore di valutazione.

ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Tekkon_84 » 26/01/11 17:09

Dunque, mi spiego meglio...
Il DB nasce per la gestione dei dipendenti di una azienda. Quindi prevede campi con: Nome del dipendente; Cliente; Lavoro; Sub-Lavoro, Tipo di lavoro; Ora inizio; Ora fine; Km percorsi; ecc ecc. I dati venivano inseriti manualmente da UN solo utente, responsabile di questa gestione, su una sola chiavetta usb. Dal DB è possibile estrarre quindi i dati in maschere/report secondo vari criteri.
Ora invece, la modifica da apportare, dovrebbe far sì che ogni dipendente a fine giornata, o ogni 2-3 gg, dovrebbe compilare il suo DB satellite, il quale va a esportare i dati nel DB Master (che poi sostanzialmente è il "vecchio" DB originale che utilizzava solo un utente).

Innanzitutto, vorrei evitare troppe modifiche a questa applicazione, per vari motivi.

Poi, "Potrei aggirare l'ostacolo?" intendo il problema delle Pk ripetute. Potrei aggirare il problema facendo si che ogni DB satellite assegni delle ID comprese in intervalli specificati (es. db1: 1-1000; db2: 1001-2000, ecc.) così che quando questi record vengono incollati sul DB master non ci saranno duplicati.
I db satellite non arriveranno mai al limite del range imposto perché ogni due o tre giorni, dopo aver copiato i loro record nel DB master, vengono "svuotati" con una query di eliminazione. Quindi al massimo lavorano con 100-200 record ogni volta.
Il problema del numero di record (se ci fosse) è solo nel DB Master, dove "convogliano" tutti i record dei DB satellite. Ma se l'ordine di grandezza di una situazione "critica" è sui 500-600 Mb non dovrei avere problemi perché proprio al limite anche dopo qualche anno di utilizzo si arriverà a malapena a 50 Mb! Quindi va bene...
Per gli stessi motivi, i backup avverranno solo nel DB Master, mentre per i DB satellite ha poco senso che vengano backuppati proprio per la loro "temporaneità".
Infine, esattamente come dice Flash30005, non serve sapere da quale DB satellite proviene il record, perché uno dei campi è proprio il nome dell'utilizzatore di quel DB satellite! (cioè il nome del Dipendente)
Poi per quanto riguarda la assegnazione della lettera alle chiavette usb, tutto perfetto.

L'unica domanda ora è: Come faccio ad assegnare il range alla chiave primaria?? Ci sto guardando proprio ora ma non riesco a capire...
Ho la tabella in modalità struttura, il campo "ID" (chiave primaria) ha come tipo di dati "Contatore"; dimensione campo: "Intero lungo"; Nuovi valori: "Incremento"...e adesso? :)
Tekkon_84
Utente Junior
 
Post: 15
Iscritto il: 25/01/11 16:34

Postdi archimede » 26/01/11 17:32

Tekkon_84 ha scritto:uno dei campi è proprio il nome dell'utilizzatore di quel DB satellite! (cioè il nome del Dipendente)
Ma allora perché tanto sbattimento? Nel db master fai una vista per ogni utente che pesca i dati della tabella con la clausola WHERE utilizzatore='<nome_utente>' e poi nei db satellite colleghi la vista dell'utente come se fosse la tabella. Se non mi sfugge qualcosa, così non devi menartela con contatori diversi, nè andare in giro con la chiavetta a sincronizzare i dati, nè a fare pulizia di nulla.
Tekkon_84 ha scritto:Come faccio ad assegnare il range alla chiave primaria?
Se proprio insisti su questa strada: http://www.mvps.org/access/tables/tbl0005.htm Ma tieni conto che cancellare dei records non riporta indietro il contatore, se non vado errato.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2753
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Tekkon_84 » 26/01/11 18:08

e poi nei db satellite colleghi la vista dell'utente come se fosse la tabella. Se non mi sfugge qualcosa, così non devi menartela con contatori diversi, nè andare in giro con la chiavetta a sincronizzare i dati, nè a fare pulizia di nulla.

I DB stanno "fisicamente" in posti diversi (in questo caso penne usb) come posso collegarli??
Inoltre non devo "sincronizzare" devo solo aggiungere record dalla tabella del DB satellite alla tabella del DB Master. Per questo la PK deve avere numeri diversi...

Ma tieni conto che cancellare dei records non riporta indietro il contatore, se non vado errato.
esatto... ed è proprio quello che fa al caso mio!! :) dai DB satellite dopo l' "upload" dei record al DB master il contatore deve ripartire da dove era arrivato quindi ok!

Ho provato a seguire le istruzioni del link che mi hai postato ma o non capisco bene la procedura o sbaglio qualcosa:
essenzialmente dice di creare due tabelle entrambe con un campo che sarà il contatore da far partire da 1000 (x es.)
Nella seconda devo scrivere 999 poi creo una query che accodi il record alla prima tabella cosi quest parte esattamente da 1000... peccato che a me non funzioni!!!! :(
Tekkon_84
Utente Junior
 
Post: 15
Iscritto il: 25/01/11 16:34

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Tekkon_84 » 26/01/11 18:10

Sto anche pensando ad un escamotage:
nella tabella creo due campi es.: Id (contatore) e Id2 (numerico) e assegno la PK a ID2
Poi dico che i valori di id2 devono essere semplicemente id + 10.000 (es.) andrebbe bene?
Tekkon_84
Utente Junior
 
Post: 15
Iscritto il: 25/01/11 16:34

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Flash30005 » 26/01/11 20:06

Per concludere il mio discorso e lasciar perdere la chiave porimara sull'ID (secondo me nel tuo caso non serve a nulla) ;)

Vai nella struttura tabella (o dipendente o Tabella master; fai sempre una copia del database per questi test)
elimina la chiave primaria sull'ID e seleziona i campi (tenendo premuto il tasto CTRL ) in maniera tale che insieme formino una unica voce univoca, esempio:
NomeDipendente Ora_inizio Ora_Fine e Km_Percorsi
(strano non abbia messo un campo data ma spero che ci sia e hai solo dimenticato di elencarlo nel post, se esiste il campo data allora sono sufficienti questi 3 campi: NomeDipendente, Data e OraInizio)
questa chiave primaria non permette duplicati sia nell'inserimento sia nell'importazione.
Tutti i database rimarranno invariati e avendo eliminato la chiave primaria sull'ID del master non avrai più l'errore di due Id uguali in quanto non più "controllati" e anche avere due o cinque ID uguali non hanno alcuna influenza sulle query o interrogazione del Db se effettuata sui campi dovuti.
Se proprio vuoi, per tuoi scopi, avere un Id univoco nel master è sufficiente che non lo importi al momento di aggiornare della tabella master che avendo un campo proprio di ID inserirà un suo ID.

Fai sapere
Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Query accodamento tra DB diversi - Errore chiave primari

Postdi Tekkon_84 » 26/01/11 23:52

Ah ecco! Ok ora credo di aver capito... domani provo subito!!! Intanto grazie...
Tekkon_84
Utente Junior
 
Post: 15
Iscritto il: 25/01/11 16:34


Torna a Applicazioni Office Windows


Topic correlati a "Query accodamento tra DB diversi - Errore chiave primaria":


Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti