Newsgroup: it.comp.programmare.win32
Titolo: SQL92 - BCB3

Volevo trasferire un programmino da VB6 a BCB3 (visto che con VB installare
i programmi su altre macchine è come giocare al lotto), che consiste in un
datagrid collegato ad un oggetto TQUERY dove la stringa SQL è qualcosa del
tipo SELECT * WHERE x=x ORDER BY x. Il problema è che una simile stringa non
permette di modificare la tabella collegata. Ho smanazzato nell'help e ho
trovato la soluzione,  l' UPDATESQL ma non so applicarla, non trovo esempi.
Qualcuno sa di cosa parlo?
Per la cronaca, dall'help di BCB3:
"For queries that use passthrough SQL, which includes all queries made
solely against remote database servers, live result sets are restricted to
the standards defined by SQL-92 and any additional, server-imposed
restrictions.
SQL-92 restrictions that must be met in order to return a live result set
are as follows. A query cannot contain:
A DISTINCT clause in the SELECT statement.
 Aggregate functions
 References to more than one base table or updatable views (i.e. joins).
 GROUP BY or HAVING clauses.
 Subqueries that reference the table in the FROM clause.
 Correlated subqueries."
..e a proposito di UpdateSQL:
"TUpdateSQL provides a mechanism for circumventing what some developers
consider an SQL-92 limitation. It enables a developer to provide INSERT,
UPDATE, and DELETE statements for performing separate update queries on
otherwise read-only result sets in such a manner that the separate update
queries are transparent to the end user."

Per la cronaca, dall'help di BCB3:
Il fatto è che "SELECT * WHERE x=x ORDER BY x" definisce una 
relazione che poi sarebbe un set di tuple che, di norma, sono da
considerarsi a sola lettura. Infatti, la tua query potrebbe essere 
un join più o meno complicato coinvolgente diverse tabelle e potrebbe
essere che il DBMS che stai usando non possa "ribaltarla" al fine
d'inserire correttamente i dati nelle tabelle dalle quali i dati
provengono. In buona sostanza, dovresti scrivere le update
o le insert necessarie specificando così con precisione la semantica
d'inserimento o modifica. Se però la query ha una corrispondenza
diretta con una tabella, (come una select * from miononno), potresti
provare a mettere (nel caso del componente TQuery di  BCB) la
proprietà LiveRequest a true. Il BDE dovrebbe essere in grado,
partendo dalla query di selezione, di - diciamo - 'generare'
le opportune query di inserimento e modifica. Non mi ricordo
se nel componente TQuery del BCB3 c'è la LiveRequest, 
ma credo di si.
L'update SQL (TUpdateSQL) funziona solo con le Cached Updates
ed in genere si usa con i Server SQL in quanto ha un po' di limiti con
i driver nativi del BDE per i database locali e non è poi talvolta
troppo conveniete usarlo.
Ciao!
Giuliano

 troppo conveniete usarlo.
Dopo varie peripezie ho capito l'uso (davvero macchinoso) della TUpdate e al
momento mi pare che il problema sia superato, anche perchè pur avendo il
collegamento diretto con una tabella DB, e richiedendo il LiveRequest, in
ogni caso il risultato della query non è aggiornabile, almeno da quello che
ho capito,  se non con il trucco della TUpdate.

ho capito,  se non con il trucco della TUpdate.
No, è aggiornabile ma la query dev'essere mooolto dritta:
niente join e niente clausole particolari. Io ho beneficiato
della proprietà RequestLive spesso e volentieri. La prova
del nove la fai usando un TDBNavigator attaccato al
DataSource che è attaccato alla TQuery. Appena abiliti
la proprietà RequestLive, se la query è "ribaltabile" (nel
senso che il BDE può 'dedurre' con precisione quali
siano le reali sorgenti dei dati) vedi che i pulsanti di
inserimento e cancellazione (ed altri) si attivano magicamente.
Comunque usare le RequestLive non è buona pratica.
Ma, se proprio non ti servono, usare le Cached Updates
è un bello spreco di risorse. Comunque .... va bene.
Se non vuoi usare le TUpdateSQL puoi sempre fare
delle normali Query di update/insert/delete instanziando 
un componente TQuery li per li con una new, caricare la 
StringList SQL con lo statement desiderato, eseguire la 
ExecSQL() ed infine distruggere l'oggetto TQuery. 
Ricordati di riempire tutte le proprietà essenziali 
di TQuery prima della ExecSQL().
Ciao
Giuliano