Newsgroup: it.comp.lang.delphi
Titolo: Restructure delle tabelle da codice o da altro programma

Mi sembra un problema talmente ovvio che forse anche la domanda è
ovvia e ritrita e mi farete tante :-p, ma proviamo...
Scenario: un amico vi chiede un programma agenda, archivio, o simile. Vi
dice quanti e quali campi dovete inserire, voi create le tabelle, create il
programma, glielo date, tutto fila. Un mese dopo vi dice che oltre al campo
"Telefono" e "Fax" vorrebbe anche quello "Cellulare", oppure che il campo
"Numero civico", per cui avreste considerato sufficiente dieci caratteri,
deve contenere anche cose tipo "Interno B, Palazzo Tizio, etc.".
Tutto ciò richiede un restructure della tabella, giusto? Ora io posso
benissimo farlo
con Database Desktop sulla tabella che ho in locale, ma per lui? Nel
frattempo
l'amico ha già inserito cento record e non posso ovviamente sovrascrivergli
la tabella vecchia con la nuova, ristrutturata e vuota. Che si fa? E'
indispensabile fare un restructure manuale sul computer dell'amico ogni
volta che ci sono di questi aggiornamenti? Esiste un programmino da fargli
avviare, che faccia un restructure della tabella automaticamente, basandosi
sulla tabella vecchia come l'avevo e sulla tabella nuova come l'ho
ristrutturata sul mio computer? Oppure un codice che controlli la tabella
prima di usarla, la confronti con l'elenco di campi salvati nel programma, e
se differisce la ritruttura?
Massimiliano Mirra

Hai toccato il tasto dolente di quando si lavora con i database.
In genere questo tipo di problema lo si risolve cercando di progettare il
database quanto piu'normalizzato possibile.
Aggiungere campi è il male minore.
Pensa se hai un campo indirizzo che include tutto, compresa la località, ed
il cliente ti chiede di fare una query per i nominativi di una specifica
località'...
Quindi la miglior politica non è ristrutturare il database ogni volta,
secondo me. Finchè si tratta di programmi piccoli, potrebbe funzionare, ma
su grossi progetti ciò equivale ad un suicidio.
L'unica è normalizzare al massimo delle possibilità, cercare di prevedere
quanti più casi possibili, magari prevedendo dei campi in più di vario tipo
e formato da usare all'occorrenza.
In 3 occasioni ho avuto il problema che hai citato e scrivere un prg di
conversione è stato un lavoraccio.
Insisto, queste sono mie idee.
Saluti
AS
"Se è Microsoft non funziona."

> Insisto, queste sono mie idee.
E io sono d'accordo con te. Dal punto di vista pratico non esistono
soluzioni migliori, e aggiungo: purtroppo.
Ciao, Sandro

 e formato da usare all'occorrenza.
non sono molto daccordo.
Per quanto mi riguarda quando vado a fare delle modifiche (anche
sostanziali) al modello dei dati come minimo tengo una traccia di tutto il
modificato.
quindi, durante le modifiche, creo uno script sql contenente le variazioni
e, all'occorrenza scrivo un programmino di adattamento dei dati. Attenzione:
i miei progetti non sono *l'agendina* ma bensì software di gestione
aziendale e vi posso assicurare che raramente ho dovuto scrivere programmi
per aggiornare il modello dei dati (soprattutto quando il cliente dispone di
uno strumento per eseguire script SQL - es. WISQL, Query Analyzer,...).
Comunque, per risolvere questo problema io scriverei una piccola
applicazione delphi che contiene un oggetto TQuery contenente:
ALTER TABLE [nome tabella]
    ADD [nome campo] ...
oppure
ALTER TABLE [nome tabella]
    DROP [nome campo]
oppure
UPDATE [nome tabella] SET [nuovo campo] = [vecchio campo]...
Alla fine si tratta di una serie di istruzioni di questo tipo...
Ciao
Solid Snake

 wrote:
Non hai detto (oppure non l'ho visto) che tipo di tabelle usi
(immagino paradox)
Cmq questo e' un problema che ho risolto da molto tempo
con un paio di piccoli programmi che lavorano su tabelle DBF.
(forse almeno l'idea puo' esserti utile)
Supponiamo io abbia aggiunto un field ad una tabella
sul mio computer.
Eseguo un programma che mi crea una copia di ogni tabella
che contiene solo la struttura della stessa (senza nessun record)
in clipper si fa con un : COPY STRU
Vado dal cliente, copio le trutture aggiornate ed eseguo
un altro programmino che confronta le strutture di ogni tabella
campo per campo, se il prg  trova differenze copia tutti i records
sulla struttura (o tabella vuota) ed alla fine cambia il nome alle
tabelle e cancella quella vecchia.
Non mi sono mai dovuto preoccupare ne' di quanti campi avessi
aggiunto ne'  a quale aggiornamento fosse arrivato il cliente
l'unico limite (superabile) e' che non si possono cambiare i
nomi ai fields delle strutture.
Mi sembra di aver visto su web, abbastanza recentemente
un tools per Delphi che esegue questa operazione in automatico
se non ricordo male devo esserci arrivato partendo dal sito di Cantu'
in una lista di prodotti premiati per Delphi.
Eugenio Belli.

 wrote in message
fugU4.35990$F46.3...@news.infostrada.it...


Allora, innanzitutto grazie a coloro i quali mi hanno inviato pareri sulla
spinosa questione. Spinosa quanto, ero convinto, importante e perciò
probabilmente già trattata e risolta da altri. Così ho impersonato un po'
Holmes tra i tanti newgroup e siti contenitore, e guardate un po' cosa ne è
venuto fuori... (Dai vari help:)
{ ******************************************* }
TUpgradeTable = class (TComponent)
1. BACKGROUND
If you have ever wanted to change the structure of a paradox table remotely
on a clients PC then this unit will help you. It will change the clients
table to match the structure of the table on the development system when the
Delphi EXE was compiled.
This unit will update a Paradox table to have the same structure as the
paradox table used to compile the EXE. It will add any additional fields and
change the length of string fields as required. This version does delete
fields and add indexes.
http://www.rightclick.com.au/delphi/
(Dalla versione per D4, Table Upgrader è diventato freeware e munito di
sorgente. L'ho provato, è snello e fa bene il suo lavoro. Scrivendo un paio
di righe per controllare la versione di una tabella alla partenza di un
programma, se ne può automatizzare il compito senza demandarlo a un
programma da far avviare separatamente all'utente.)
{ ******************************************* }
{ ******************************************* }
Table Scanner is a Object Pascal source code generator, available in 16 bit
(Scanne16.zip) and 32 bit (Scanner.zip) versions, designed to automate the
task of adding Paradox® and DBase® tables maintenance routines to Delphi
desktop database applications.
Using Borland Database Engine (BDE), plus Table Scanner and its companion
DLL file (TblScn16.dll for Delphi 1, and TblScn.dll for Delphi 2/3/4), you
can add the following features to any Delphi database application, with a
minimum of manual coding:
·	Non-existent tables (Data files) are automatically created the first time
the application is run;
·	Non-existent indexes, validations checks or referential integrities
constraints (Auxiliary files) are automatically created the first time the
application is run;
·	Tables are checked for errors every time the application is run and any
damaged Table headers, indexes, validations checks, referential integrities
constraints (
Auxiliary files), or desynchronized Paradox® autoincrement fields are
automatically fixed;
·	Any modifications to table names, field layout, indexes, validations
checks or referential integrities constraints (Data files/Auxiliary files)
are automatically applied to tables on disk the first time the modifications
are detected.
http://www.gold.com.br/~demian/
(Questo è shareware, $29, ma sto considerando molto seriamente di spenderli.
Sembra più completo e utile, l'unica cosa che non mi piace è che si trascini
dietro una dll.)
{ ******************************************* }