Newsgroup: it.comp.lang.delphi
Titolo: GROSSI problemi con un DataBase access [lungo]

Salve a tutti, passo subito alla descrizione del mio PROBLEMA. Ci sto
perdendo il sonno credetemi e non so se è perchè sbaglio qualcosa o perchè è
così che purtroppo funziona la faccenda.
La mia applicazione è interfacciata con un database access .mdb e colloquia
tramite Microsoft JET.
Sostanzialmente quando dalla mia applicazione creo una categoria, che è
praticamente un figlio in un oggetto treeview (fate i conti di creare una
directory in windows per esempio), mi viene creata nel database una tabella
con lo stesso nome della categoria. Al suo interno poi verranno inseriti i
campi che andrà ad inserire l'utente all'interno di questa categoria. Fino
qua ci siamo? Bene, mi succede questo:
1) Se creo una categoria e SUBITO dopo gli clicco sopra (clicco quindi sopra
alla voce nel treeview appena inserita) mi viene dato un errore di Microsoft
JET che dice di non trovare la tabella nel database (in realtà CREDO che ci
sia). La cosa "buffa" è che se ne creo una nuova e aspetto un po (senza fare
altre operazioni) e poi gli clicco sopra, effettivamente mi dice che la
tabella esiste e che è vuota.......
2) Se inserisco un record in una categoria vuota e gli clicco sopra SUBITO
dopo, il mio programma dice che non c'è nulla all'interno della categoria,
mentre se torno a cliccargli sopra (o aspetto un poco) non ho più problemi e
mi viene visualizzato.
3) stesso problema per la ridenominazione di una categoria (quindi la
ridenominazione di una tabella in un database). Ho implementato la procedura
che sposta TUTTI i record da una tabella all'altra ma quando vado a
visualizzare la nuova categoria mi manca sempre l'ultimo o gli ultimi
record. Aspetto un po e il record viene visualizzato......
Conclusioni:
A me sembra che il database abbia bisogno di un tempo di aggiornamento senza
del quale mi visualizza il vecchio database al quale non erano state
apportate le modifiche. Oppure che il database si chiuda (e che quindi
vengono salvate le modifiche) solo dopo un certo timeout.
E' normale?
C'è una qualche funzione delphi che permetta di aprire, modificare e
"salvare" le nuove modifiche in modo da renderle subito effettive?
Dove posso leggere qualcosa a riguardo?
AIUTOOOO?
Davide

premesso che non uso access (bleaaaah...!) ti suggerisco di postare il
codice che usi dal treeview per creare la categoria, oltre a indicazioni
sulla tecnologia di accesso (ado, bde...?)
Bye
A.

"salvare" le nuove modifiche in modo da renderle subito effettive?
Devi forzare il flush dei dati.
Cerca commit, flush nell'ehlp di delphi, sulla adoconnection o adotable.
--
Morde. 
morde[at]programmer[.]net


Dunque, i componenti che uso sono gli ADO....
Codice:
tmp:='CREATE TABLE T_'+stringa_app+'(ID integer identity (1,1) not NULL
primary key, Operatore integer, Immagine text(100)';
tmp2:=', Location text(255), Microscopio text(100), Ingrandimento text
(100), Metodica text(100), Fotocamera text(100), Giorno text(2), Mese
text(9), Anno text(4), Commento memo)';
adoquery1.SQL.text:=tmp+tmp2;
adoquery1.execsql;
tmp e tmp2 sono stringhe che contengono l'intero codice sql di creazione
stringa_app contiene il nome della tabella (e quindi della categoria)
Quando creo la categoria imposto prima la proprietà di
adotable1.active=false; per poter effettuare modifiche sul database
La cosa strana (un'altra) è che se io faccio passo passo tutte le operazioni
di creazione modifica etc... mi vanno tutte a buon fine, confermando la mia
ipotesi che il database ha bisogno di tempo.... cmq ripongo il problema
nelle vostre mani.. Se volete altre spiegazioni/chiarificazioni chiedete
pure
Davide

>> data definition language (DDL) SQL commands <<< ..[Cut]
2) Definisci una costante che contiene la definizione della tabella:
const
  BaseSqlCreazione = 'CREATE TABLE T_%S + '(ID INTEGER.....);
3) Modifica il codice:
AdoCommand.CommandText := Format(BaseSqlCreazione, [stringa_app]);
AdoCommand.Execute;
Bye
A.

procedure CreatePersTbl;
var Qry: TADOQuery;
begin
  Qry := TADOQuery.Create(nil);
  try
    Qry.ConnectionString := uConstsAndVars.ConnectionString;
    Qry.SQL.Add('CREATE TABLE ' + PersTbl + ' (');
    Qry.SQL.Add('  Id_Pers COUNTER CONSTRAINT PK_Personel PRIMARY KEY,');
    Qry.SQL.Add('  Name TEXT(50), Address TEXT(100),');
    Qry.SQL.Add('  ZipCode TEXT(5), City TEXT(50), State TEXT(20),');
    Qry.SQL.Add('  Country TEXT(20), WhenBorn DATE, WhenSanDocElaps
DATE,');
    Qry.SQL.Add('  WhenRecruited DATE , Working BIT, Telephone1
TEXT(20),');
    Qry.SQL.Add('  Telephone2 TEXT(20), IsRegular BIT , Salary CURRENCY,');
    Qry.SQL.Add('  Job NUMBER, Remarks MEMO)');
    try
      Qry.ExecSQL;
    except
      on E: Exception do
        begin
          E.CreateFmt(WTblCreationErr, [PersTbl]);
          Abort;
        end;
    end;
  finally
    FreeAndNil(Qry);
  end;
end;
io la creao cosě una tabella magari puň servire!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

xche una TAdoquery  e non un TAdoCommand?
Bye
A.