Newsgroup: it.comp.programmare.win32
Titolo: Update di una record in C++ Builder 5

Ciao a tutti.
Il problema è, in realtà, piuttosto banale : in una mia applicazione di
gestione dati, ho, ovviamente, la necessità di compiere operazioni di
inserimento, ricerca, eliminazione e MODIFICA dei record (di una tabella
Paradox).
La questione riguarda l'ultima delle operazioni appena citate : provando,
infatti, sia mediante SQL (comando update <table>... set <values> ... where
<condition>), sia mediante i metodi del componente Ttable (nella fattispecie
SetFields()), e sia che la proprietà CachedUpdates sia vera o meno, la
modifica avviene soltanto mentre il programma è in esecuzione.
Quel che voglio intendere è che : fin quando effettuo l'updating e il
programma è in esecuzione, allora aprendo il Database Desktop osservo che il
record è stato effettivamente sovrascritto e cambiato correttamente.
Chiudendo il Builder e il DBDesktop, e riaprendo il DbDesktop
sucessivamente, tutto quello che posso notare è che, in realtà, sono stato
preso in giro : tutto è esattamente COME PRIMA CHE LE MODIFICHE
AVVENISSERO...
Il codice è simile a questo (posto solo l'esempio con la table, quello con
TQuery è analogo) :
        Table2->RecNo=CurrentRecord; //mi posiziono sul record che mi
interessa, in base al risultato di una ricerca precedente
        Table2->Active=true;
        Table2->Edit(); //sembra essere ridondante, ma, non mettendolo, il
compilatore sembra arrabbiarsi.
        Table2->SetFields(ARRAYOFCONST((Null, EmpNo, Edit1->Text,
TimeToStr(DateTimePicker1->Time), Edit2->Text, Edit3->Text,
Edit5->Text, Edit6->Text, Edit7->Text, Memo1->Text))); //modifico il record
        Table2->Post(); //richiesto espressamente da SetFields(), come si
nota leggendo l'help
        Table2->Active=false; //ora la tabella non è piu in edit mode
        Table2->Close(); //la chiudo, sperando che tutto sia ok
Grazie a tutti
Alessio
#define __TRUE "C is Better"

         Table2->Close(); //la chiudo, sperando che tutto sia ok
Ora non so che librerie tu stia usando...ma in tutte quelle che ho visto è
necessario chiamare la Update() dopo una AddNew() o una Edit()...
Ciao
        Riccardo

 necessario chiamare la Update() dopo una AddNew() o una Edit()...
Ah...non uso C++ Builder...se ho sbagliato chiedo scusa :-)
Ciao
        Riccardo

modifica avviene soltanto mentre il programma è in esecuzione.
Ho dato un'occhiata al codice e mi sembra essere corretto.
Prova a sostituire il SetFields con l'assegnazione manuale
(FieldByName('...').AsString := ...) e a compiere il Post e
la Close (tieni sempre CachedUpdates a false).
Se hai CachedUpdates a true, devi ricordarti
dell'ApplyUpdates.
--
Andrea Laforgia - walkietalkie(at)
libero.it
http://www.geocities.com/AndreaLaforgia

 la Close (tieni sempre CachedUpdates a false).
Grazie, Andrea!
Ottimo consiglio... E ottimo insegnamento per il futuro : mai fidarsi dei
metodi del Builder...
Ciao :)


necessario chiamare la Update() dopo una AddNew() o una Edit()...
Non che io sappia.
Probabilmente ti riferisci a Post().


 Probabilmente ti riferisci a Post().
Mi riferivo ai vari ADO, DAO e ODBC....
Ciao
        Riccardo

Mi riferivo ai vari ADO, DAO e ODBC....
E' uguale, si usa Post(), se si accede utilizzando i
componenti ADOExpress.


 componenti ADOExpress.
In Visual C++ o in VBScript...io ho sempre usato Update con ADO, DAO e ODBC
(l'avevo scritto che non usavo Builder)...
Ciao
    Riccardo

(l'avevo scritto che non usavo Builder)...
Cerchiamo di capirci: io parlo del metodo usato con C++
Builder perche' e' questo quello di cui si sta parlando.
Guarda caso, Update() e' un metodo delle TTable/TQuery e
delle TADOTable/TADOQuery che NON VA usato nel caso in
questione.
Per cortesia, se non usate questi pacchetti non proponete
soluzioni inapplicabili.


 soluzioni inapplicabili.
Guarda che io l'ho scritto in chiaro subito dopo il primo post che non lo
usavo !!!
Allora chiedo scusa di aver cercato di aiutare una persona...
Ciao
        Riccardo