Newsgroup: it.comp.appl.access
Titolo: Come aggiornare solo struttura MDB ?

Cari amici,
ho un DB (Access 7.0) con circa 30 tabelle e tante relazioni, vincoli ecc.
ecc.
Questo DB lo utilizzano 4 persone, ognuna delle quali gestisce dati diversi
dall'altra. A volte capita che io debba fare una piccola modifica,
l'aggiunta di un campo, insomma modifiche alla struttura del DB.
Esiste un modo per aggiornare TUTTI i DB lasciando inalterati i dati di
ognuno ?
n.b. ** NON posso usare le repliche MDB
Grazie a tutti

 Grazie a tutti
RoDAgo

ognuno ?
dividerlo in front end e back end?  cioe' applicazione da una parte e
dati dall'altra: con la stessa applicazione si vedono dati diversi.
--
non studio non lavoro non guardo la tv
non vado al cinema non faccio sport
----------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access

...



E allora che problema c'č?!
Metti i db in condivisione, fai in modo che tutti
gli utenti li possano "vedere" ed hai risolto il
"problema" ...
Per evitare di fare la stessa cosa 4 volte
basta rendere univoca la "variabile" in
causa.
Bye, Ste

>E allora che problema c'č?!
Il problema č che non tutti riescono ad interpretare bene quello che ho
scritto:
Ho distribuito l'MDB a 4 persone, ognuna non conosce l'altra ed ognuna sta
su un sistema solare differente e ci ficca dentro i dati che vuole. Quando
io voglio cambiare 
q.sa
 nella struttura del DB (agguingere un campo,
modificare un vincolo, ecc.) VORREI nel modo + semplice, aggiornare LE
STRUTTURE di TUTTI gli MDB.
Dei dati specifici di ognuno NON me ne importa nulla. Nessuno vuole vedere i
dati dell'altro, anzi fra loro nemmeno si conoscono e forse non parlano
nemmeno la stessa lingua.
Grazie cmq.

 nemmeno la stessa lingua.
Visto che è un problema che viene proposto spesso, ho deciso di scrivere una
FAQ per il Sito Comune, che ti incollo di seguito.
Quando viene distribuita un'applicazione, suddivisa in front-end e back-end,
per aggiornamre il programma, basta sostituire il FE che si collegherà ai
dati già esistenti. Spesso però ci si trova nelle condizioni di dover
aggiornare
la struttura del DB (aggiungere nuovi campi, tabelle, indici...), e sarebbe
impensabile di andare da tutti i clienti per aggiornare la struttura
manualmente, per preservare i dati che nel frattempo sono stati inseriti. In
questo caso non sarebbe consigliabile usare le "repliche", perchè i clienti
potrebbero essere molti, dall'altra parte del mondo, ed a nessuno interessa
dei dati dell'altro.
A questo punto si possono seguire diverse strade:
1) Scrivere un bel po' di codice che confronta i 2 BE e li allinea, cioè
riporta le modifiche anche in quello con i dati del cliente (soluzione meno
facile). Questo si fa ciclando tra gli insiemi Tables, Fields, Relazioni
ecc...
2) Tenere un numero di versione e le relative modifiche per passare da una
all'altra. Per es. dalla ver. 1.2 alla 1.3 aggiungere X campi e Y tabelle.
Ad ogni avvio, il FE confronta il numero attuale e, se non corrisponde
all'ultima versione, applica sequenzialmente tutte le modifiche per ottenere
l'upgrade. Ovviamente bisogna tenere da qualche parte la lista con tutte le
correzioni alla struttura necessarie.
Potrebbe essere utile la funzione presente sul sito comune:
T&T, "Modificare la struttura dati del BE via codice, direttamente dal FE.",
Enrico Oemi
3) (più semplice) Installare dal cliente il nuovo programma, ed
importare nel BE aggiornato i dati presenti nel BE più vecchio, magari
prevedendo una voce di menù "Importa archivi esterni". In pratica si
importano
nelle nuove tabelle vuote i valori dei campi corrispondenti. Se ci sono
campi in più,
o nuove tabelle, resteranno vuoti fino all'inserimento manuale dei dati.
Per importare il contenuto delle tabelle, si deve rispettare una sequenza
che non
violi l'integrità referenziale, ad esempio prima di importare le righe di
una fattura, si deve importare l'intestazione della fattura stessa, quindi
prima il lato 1, poi il lato molti.
Un esempio pratico, dove l'ordine di importazione NON è considerato:
'IMPORTA I DATI DI TUTTE LE TABELLE ESTERNE, NEL DB CORRENTE
'RESTRIZIONI: non si possono ELIMINARE o RINOMINARE campi nel nuovo DB,
'mentre si possono avere i campi in ordine diverso e si possono aggiungere
'nuovi campi nel nuovo DB
 Set dbsExt = OpenDatabase("VecchioBE.mdb")
 For Each tdf In dbsExt.TableDefs
  If (tdf.Attributes And dbSystemObject) = False And (tdf.Attributes And
dbHiddenObject) = False Then
   If EsisteTabella(tdf.Name) Then
    DoCmd.RunSQL "INSERT INTO " & tdf.Name & " SELECT * FROM " & tdf.Name &
" IN " & "VecchioBE.mdb"
   End If
  End If
  Next tdf
 End If
 Set dbsExt = Nothing
Naturalmente prima di questo va fatto scegliere all'utente il percorso dove
risiede il vecchio BE, insieme a tutti i controlli necessari.
Se invece dobbiamo considerare l'ordine di importazione, una soluzione
potrebbe essere:
 Dim TabelleOrd(100) As String
 Dim NumTab As Integer, TotTabelle As Integer
 TabelleOrd(1) = "TblCausaliFatture"
 TabelleOrd(2) = "TblModalPagamFatture"
 TabelleOrd(3) = "TblFatture"
 TabelleOrd(4) = "TblDatiFattura"
 [...]
 TotTabelle = 4
 'se la tabella esiste nel DB corrente e nel DB da importare, importa i
campi in comune
 For NumTab = 1 To TotTabelle
  If EsisteTabella(TabelleOrd(NumTab)) And EsisteTabella(TabelleOrd(NumTab),
"VecchioBE.mdb") Then
   DoCmd.RunSQL "INSERT INTO " & TabelleOrd(NumTab) & " SELECT * FROM " &
TabelleOrd(NumTab) & " IN " & "VecchioBE.mdb"
  End If
 Next NumTab
dove la funzione EsisteTabella è:
 Public Function EsisteTabella(NomeTab As String, Optional NomeDbs) As
Boolean
  'restituisce True se la tabella NomeTab del database NomeDbs (opzionale)
esiste
  Dim dbs As Database, tdf As TableDef
  If IsMissing(NomeDbs) Then
   Set dbs = CurrentDb
  Else
   Set dbs = OpenDatabase(NomeDbs)
  End If
  EsisteTabella = False
  For Each tdf In dbs.TableDefs
   If tdf.Name = NomeTab Then
    EsisteTabella = True
    Exit For
   End If
  Next tdf
  Set dbs = Nothing
 End Function
Personalmente uso quest'ultima soluzione da diversi anni e non ha mai dato
problemi.
--
Ciao, AntoGal
*************************************************
Home Page (area programmatori di VolFtp)
http://volftp.mondadori.com/italiani/galletta/
per scaricare un gioco di DAMA ITALIANA
*************************************************

 STRUTTURE di TUTTI gli MDB.
Metodi veramente semplici non ce ne sono, in questi casi personalmente
ho sempre previsto una generica routine di aggiornamento sulle mie
installazioni che "esegue" una routine (ma potrebbe essere un eseguibile)
con un nome predefinito; insomma, il classico modulo "Aggiornamento".
L' unica soluzione che mi sento di darti è di farti un bel modulo
(o eseguibile Delphi) che aggiorni la struttura del db con istruzioni
ddl o accedendo al DAO e di  distribuirlo ai tuoi clienti; se sei
interessato a come modificare da programma la struttura del db
c'è un mio esempio al riguardo sul sito comune (in VBA xò), puoi
prenderlo come spunto per le tue problematiche.....
Il metodo veramente "ideale" (che xò non ho mai avuto il tempo di
implementare) sarebbe farsi una procedura che "parsi" i due db
(prima e dopo) salvando su un file i "delta" in linguaggio ddl
(alter table ecc. ecc.); a questo punto basterebbe prevedere
sulle procedure una generica funzione che applichi i "delta"
alla struttura e le cose sarebbero fatte in maniera pulita e
standardizzata....
Bye, Ste