Newsgroup: it.comp.lang.delphi
Titolo: IBTable non ha il comando Requery di ADO

Ho fatto diversi programmi utilizzando ADO
Adesso ho dovuto farne uno utilizzando i controlli standard Interbase di
Delphi 5
Solo che quando un altro utente aggiunge un record ad una tabella non riesco
a vedere il nuovo record.
Ho provato i comandi:
Refresh, ApplyUpdate, Chiudi e riapri tabella
ZERO
Non è che c'è qualche altro comando
GRAZIIEEEE

 Non è che c'è qualche altro comando
Chiamando una /Close/ e una /Open/, ottieni l'aggiornamento dei dati.
Il problema, forse, è dovuto al fatto che InterBase lavora utilizzando 
delle transazioni; devi eseguire una /Commit/ o /CommitRetaining/ sul 
componente *TIBTransaction* se vuoi confermare le modifiche attuate 
all'interno di una transazione che, se non avviata esplicitamente, ha 
inizio quando hanno inizio le modifiche.
Una volta preso questo provvedimento, fai una /Close/ e una /Open/ della 
tabella e vedrai che il tuo record appena inserito è presente.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

Tutte le modifiche che faccio sono all'interno di blocchi startTransaction e
CommitRetaining.
Apro e chiudi le tabelle settando la propietą Active prima a false e poi di
nuovo a true.
Ma non succede nulla.
Debbo per forza dare il close e l'open ?????

 Debbo per forza dare il close e l'open ?????
No, impostando la proprietà /Active/ a False e poi a True ottieni lo 
stesso effetto, quindi probabilmente la causa del problema è da 
ricercare altrove.
Prova ad aggiungere qualche dettaglio oppure a scrivere il codice che 
usi per svolgere le operazioni descritte, così vediamo se magari non c'è 
qualche svista all'interno...non si sa mai... ;-)


Approssimativamente il codice che uso è il seguente.
CODICE APPEND
===========
If Not IBTrans.InTransaction Then IBTrans.StartTransaction;
IBTable.Append;
CODICE POST
===========
Try
 IBTable.Post;
 IBTrans.CommitRetaining
Except
 IBTable.Cancel;
 IBTrans.RollbackRetaining
End;
IBTable.Refresh;
CODICE REFRESH
==============
IBTable.Active := False;
IBTable.Active := True;
IBTable.Refresh;
IBTable.FetchAll;
Nonostante tutto le istruzioni del refresh, non riesco a vedere le modifiche
fatte da un altro PC.
Ho pensato pure che potesse trattarsi di un bag dei componenti IB base di
Delphi 5, ma non ho trovato aggiornamenti relativi ad interbase sul sito di
borland.

 borland.
Non escludo che vi siano diversi bug nei componenti, ma credo che 
eseguire un Post di un record e vederne i dati sia il minimo che i 
componenti possano fare e non lo considererei un caso particolare.



I Parametri della IBTRansaction sono:
Active := False;
DefaultAction := TACommit;
DefaultDatabase := IBConn;
IdleTimer := 0;
Params := [];
Tag := 0;
Ecco tutto
Ciao da MArcello

 Tag := 0;
Sono stato impreciso: mi riferivo alla proprietà /Params/, se non 
ricordo male il nome (non uso IB, ma FB, e siccome la DLL non ha il nome 
classico GDS32.DLL, non riesco a posizionare componenti IBX sul form).
Dovresti accedere ai valori di quella proprietà facendo clic con il 
tasto destro sul componente; è presente un wizard che ti consente di 
modificare le impostazioni di visibilità della transazione 
(ReadCommitted, Snapshot, ...).


 Debbo per forza dare il close e l'open ?????
fai doppio click sulla ibtransaction e seleziona read committed
-- 
Ciao, Anto', [38, 143, AQ] 
MB C SC 220 CDI Magma Rot
"Oggi c'è una grande battaglia di idee, ma alla 
fine, non ci saranno ne vinti, ne vincitori, ne idee!"
S. Benni da Elianto

Effettivamente non avevo impostato i Params di IBTrans.
Ho settato ReadCommit dal Wizard. Adesso debbo provare cosa succede.
Per il momento grazie.

Va bčh,
  settando la proprietą Params della IBTransaction a ReadCommit, č venuto
fuori che aprendo e chiudendo la tabella, si possono vedere le modifiche
apportate da altri client.
Diciamo che la cosa funzionicchia discretamente.
Ma proprio per essere bastardi e pignoli: se la tabella č piccola, nessun
problema; ma se la tabella č un pņ cicciottella, i tempi sarebbero un pņ
troppo lunghi e allora come potrei fare ???
Grazie comunque per l'enorme aiuto.
Ciao

 troppo lunghi e allora come potrei fare ???
Come potresti fare...a fare cosa? A reperire i dati aggiornati?
Non credo si possano ottenere dati aggiornati dal server senza scaricarseli.
Ci si potrebbe far aiutare dal componente *TClientDataSet* per mantenere 
una copia in memoria della tabella lato client contenente i dati 
affinchè sia possibile modificarli inviando al server gli statement SQL 
per apportare le modifiche, ma per ottenere comunque aggiornamenti ad 
altri record (fatti da altri utenti) è necessario scaricare nuovamente 
la tabella.


Mannagg... purtroppo c'hai ragione....
Va beh ti ringrazio enormemente per la straordinaria pazienza che hai avuto
con me.
Sono riuscito a far funzionare quasi decentemente il programmino.
Ho capito però che debbo dare una bella "Ripassata in Arno", nel caso in
questione una Ripassata in "Interbase" per migliorare le prestazioni e la
stabilità dell'applicazione.
Ciao.

 stabilità dell'applicazione.
Io ho trovato una spiegazione buona in "Mastering Delphi 7" sia sui 
componenti *IBX* (InterBase Express) sia sui componenti *dbExpress*.
Non so se ci sono altre fonti online che possano essere così 
propedeutiche e discorsive.
Prova a dare un'occhiata qui:
http://delphi.about.com/od/interbase/
Anche la Guida in linea contiene molte informazioni utili sul 
funzionamento e il corretto uso dei componenti specifici.



Un consiglio. Cerca se puoi di evitare le IbTable. Sono lentissime.
Ad esempio in un programma usavo una tabella di appoggio e la popolavo
tramite una ibtable. Sembrava ok. ma al crescere del database si è
rallentata incredibilmente. Alla fine sta procedura impiegava circa 15
minuti!.
L'ho sostituita con una IbQuery + IbUpdate e ci mette 30 secondi !
Il trucco comunque è quello di limitare il numero di record visibili al 
client,non far vedere l'intera tabella (quindi query o viste)
Ove possibile, ovviamente :-)
Giulio