Newsgroup: it.comp.lang.delphi
Titolo: Aqqiungere campo a tabella dbf

Ciao
Come posso controllare se un campo in una tabella dbase esiste già ed
eventualmente aggiungerlo specificando oltre al nome chiaramente anche il
tipo e la grandezza senza danneggiare i dati esistenti?
Ciao e grazie


Per aggiungerlo ti basta una semplice istruzione SQL
    ALTER TABLE <nometabella> ADD <nomecampo> <tipocampo>
es.
    alter table ANAGRAFICA add indirizzo CHAR(255)
    alter table ANAGRAFICA add eta INTEGER
    alter table ANAGRAFICA add reddito FLOAT
Per vedere se esiste non saprei... magari scorriti i Fields della TTable e
vedi se c'è.
Saluti
        Marco Bortolani
 
infoN...@marcobortolani.it

 wrote in message
kuHHa.98781$lK4.2...@twister1.libero.it...

Ciao,
ho letto la risposta di Bortolani, ma non sapendo se tu usi SQL ti indico
come faccio io ad aggiornare i  DBF.
Io non mi pongo il problema di verificare che il DBF sia o no aggiornato e
completo di tutti i campi, a volte ci sono in giro release di programmi
abbastanza vecchi e testare tutti i DBF per decidere quali sono da
aggiornare è più lento che neanche aggiornarli tutti.
Io procedo in questo modo.
1) Creo una cartella ARCHIVI in cui metto dei files DBF vuoti con solo la
struttura dei record aggiornata
2) Prendo gli archivi che devo aggiornare e li copio in un'altra serie di
archivi temporanei con nome simile (una specie di copia di salvataggio)
3) Prelevo gli archivi NUOVI dalla cartella ARCHIVI e li SOVRASCRIVO a
quelli esistenti che devo aggiornare
4) Con  l'istruzione Batchmove prendo i dati dalla copia di SALVATAGGIO e
trasferisco i dati nei DBF appena AGGIORNATI
5) Infine cancello i files temporanei della copia di salvataggio (per
evitare confusione al prossimo aggiornamento)
Queste istruzioni relativamente semplici da realizzare fanno in modo che tu
abbia la base dati sempre allineata all'ultima versione dei tuoi archivi.
Se ti può in qualche modo interessare posso in seguito postare un esempio
funzionante di tutto questo.
ATTENZIONE però a non cambiare la logica dei tuoi campi. Se in campo
alfanumerico lo trasformi in numerico qualche problemino serio lo potresti
avere.
Ciao
--
MaoSw
Reporter Professional srl
support...@reporterprofessional.it

funzionante di tutto questo
Posta, Mao, posta.... :)
Ciao
-- 
Morde. 
(morde at programmer dot net)

 Posta, Mao, posta.... :)
io ci provo, ma non sono molto bravo a fornire esempi, quindi se riscontrate
errori od omissioni chiedo scusa in anticipo
Ho totlo tutti i controlli visuali che poi ognuno fa come vuole (panel ed
edit varie)
Dovete inserire Batchmove sul Vs. form
///////////////////////////////////////////////////////////////////////////
unit aggiorno;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, DBTables, ComCtrls, Db;
type
  TFaggiorno = class(TForm)
  BatchMove1: TBatchMove;
private
    procedure RicInd;
    procedure AGGIORNO;
    { Private declarations }
  public
    procedure SettaArch;
    procedure AggArch;
    procedure CambiaNdx;
    { Public declarations }
  end;
var
    Faggiorno.: TFaggiorno;
    ArchS         : array[1..5] of string;
implementation
Uses  RicIndici;  // procedura esterna per la ricostruzione degli indici
{$R *.DFM}
// Lancio aggiornamento archivi DBF
procedure TFaggiorno.AGGIORNO;
begin
// Aggiornamento Archivi
   AggArch;
// Aggiornamento NDX
   CambiaNdx;
// Ricostruzione Indici
   RicInd;
// Fine procedura
end;
procedure TFaggiorno.AggArch;
var
DirSor,DirDes,DirTmp: string;
I: byte;
begin
   SettaArch;   // Questa procedura contiene l'elenco degli archivi da
aggiornare
   DirSor:=('C:\PRG\ARCHIVI');  // NUOVI ARCHIVI DA UTILIZZARE
   DirDes:=('C:\PRG\DATI\');       // PERCORSO ATTUALE DEGLI ARCHIVI
UTILIZZATI
   DirTmp:=('C:\PRG\DATI\X');   // PERCORSO DEGLI ARCHIVI TEMPORANEI
   // Da destinatario (originale) a temporaneo
   for I:=1 to 5 do
   begin
         FileCopy(DirDes+ArchS[I], DirTmp+ArchS[I]);
   end;
   // Da sorgenti a destinatario
   for I:=1 to 5 do
   begin
         FileCopy(DirSor+ArchS[I], DirDes+ArchS[I]);
   end;
  //  Aggiornamento archivi   DMRP1=DataModule in cuo ho tutti gli archivi
del programma
   for I:=1 to 5 do
   begin
          DMRP1.TSorg.TableName := (DirTmp+ArchS[I]);
          DMRP1.TDest.TableName := (DirDes+ArchS[I]);
          BatchMove1.Source     :=DMRP1.TSorg;
          BatchMove1.Destination:=DMRP1.TDest;
          BatchMove1.Execute;
    end;
   // Cancellazione Temporanei
   for I:=1 to 5 do
   begin
         DeleteFile(DirTmp+ArchS[I]);
   end;
end;
procedure TFaggiorno.SettaArch;
begin
   ArchS[01] := ('DBF01.dbf');  // Nomi di fantasia per l'esempio
   ArchS[02] := ('DBF02.dbf');
   ArchS[03] := ('DBF03.dbf');
   ArchS[04] := ('DBF04.dbf');
   ArchS[05] := ('DBF05.dbf');
end;
procedure TFaggiorno.CambiaNdx;
var
DirSor,DirDes : string;
I    : byte;
NDXS : array[1..10] of string;
begin
   NDXS[01] := ('indice01.NDX');
   NDXS[02] := ('indice02.NDX');
   NDXS[03] := ('indice03.NDX');
   NDXS[04] := ('indice04.NDX');
   NDXS[05] := ('indice05.NDX');
   NDXS[06] := ('indice06.NDX');
   NDXS[07] := ('indice07.NDX');
   NDXS[08] := ('indice08.NDX');
   NDXS[09] := ('indice09.NDX');
   NDXS[10] := ('indice10.NDX');
   DirSor:=('C:\PRG\ARCHIVI');
   DirDes:=('C:\PRG\DATI');
   // Da sorgenti a destinatario
   for I:=1 to 10 do
   begin
      FileCopy(DirSor+NDXS[I], DirDes+NDXS[I]);
   end;
end;
procedure TFaggiorno.RicInd;
begin
// Ricostruzione Indici Delphi
// PROCEDURA ESTERNA CHE MI RICOSTRUISCE GLI INDICI
   Application.CreateForm(TFRicIndici, FRicIndici);
   FRicIndici.showmodal;
   FRicIndici.Free;
end;
end.
/////////////////////////////////////////////////
funzione esterna per la copia dei files (io la ho in un file di supporto al
programma, anzi a tutti i miei programmi)
function FileCopy(source,dest: String): Boolean;
function FileCopy(source,dest: String): Boolean;
var
  fSrc,fDst,len: Integer;
  size: Longint;
  buffer: packed array [0..2047] of Byte;
begin
  Result := False; { Assume that it WONT work }
  if source <> dest then begin
    fSrc := FileOpen(source,fmOpenRead or fmShareDenyNone);
    if fSrc >= 0 then begin
      size := FileSeek(fSrc,0,2);
      FileSeek(fSrc,0,0);
      fDst := FileCreate(dest);
      if fDst >= 0 then begin
        while size > 0 do begin
          len := FileRead(fSrc,buffer,sizeof(buffer));
          FileWrite(fDst,buffer,len);
          size := size - len;
        end;
        FileSetDate(fDst,FileGetDate(fSrc));
        FileClose(fDst);
        FileSetAttr(dest,FileGetAttr(source));
        Result := True;
      end;
      FileClose(fSrc);
    end;
  end;
end;
/////////////////////////////////////////////////
Spero di essere stato chiaro per tutti.


 ha scritto nel messaggio
news:f0UHa.105638$pR3.2...@news1.tin.it...

Si, uso SQL ma il tuo modo di procedere è ingegnoso...
Grazie per l'aiuto
Andrea

 ha scritto nel messaggio
news:KxSHa.195793$g92.3...@news2.tin.it...

Grazie mille
Andrea