Precis: Il mio codice sta tentando di aggiornare i campi non-fisici in un Delphi XE TClientDataset
, (collegati ad un TSQLQuery
con il suo set di SQL
immobili) che sono stati creati come risultato di un comando di runtime Open
.Ho bisogno di evitare di tentare di aggiornare i campi non-fisici in un Delphi TClientDataset collegato ad un TSQLQuery
Ho un TClientDataset
connesso a un TDatasetProvider
collegato a un TSQLQuery
collegato a un TSQLConnection
. I primi 3 di questi oggetti sono incapsulati in un paio di classi in una libreria che uso in molti posti su diversi progetti. Queste classi creano questi 3 oggetti in fase di esecuzione ed eliminano una quantità significativa di codice ripetitivo, necessario in quanto ho molte, molte di queste terzine.
Piuttosto tipicamente io caricare il TClientDataset
da un database specificando alcuni SQL nella SQL
proprietà della TSQLQuery
e chiamando Open
sul TClientDataSet
. Il Fields
nel TClientDataset
vengono creati tramite questa chiamata a Open
ie. non esistono prima di Open
.
Ho incontrato un problema in una situazione in cui tre dei campi generati nello TClientDataset
non sono fisici; cioè, l'SQL esegue calcoli per generarli. Sfortunatamente, nel TClientDataset
, questi 3 campi non vengono creati in modo diverso rispetto ai campi fisici; loro FieldKind
è fkData
(in teoria sarebbe fkInternalCalc
), Calculated
proprietà è False
(ideale sarebbe True
) e la loro ProviderFlags
includere pfInUpdate
(che idealmente non dovrebbe). Non sorprende che, quando arriva il momento di fare un ApplyUpdates
sul TClientDataset
viene generata un'eccezione ...
Project XXX.exe raised exception class TDBXError with message
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'Received'.
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'Issued'.
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'DisplayTime'.
posso evitare questo errore eliminando pfInUpdate
bandiere di questi campi nel gestore OnUpdateData
evento s' il TDatasetProvider
. Tuttavia questa soluzione richiede che i nomi dei campi specifici siano noti a questa funzione che si trova nelle classi generiche menzionate sopra, rompendo così la generalità del codice.
Quello che sto cercando è un mezzo generico per segnalare la natura calcolata di questi campi alla funzione del gestore eventi.
non riesco a cambiare le loro FieldKind
o Calculated
proprietà (rispettivamente fkInternalCalc
e True
) dopo la chiamata Open
come questo genera un messaggio WorkCDS: Cannot perform this operation on an open dataset
eccezione. E, non posso modificare queste proprietà prima della chiamata Open
poiché lo Fields
non esiste ancora.
posso rimuovere la bandiera pfInUpdate
da ProviderFlags
proprietà 's questi Field
dopo Open
ma questo non viene più passato sul 'Delta' TClientDatset
che arriva al gestore OnUpdateData
eventi. Ho anche provato a impostare le proprietà del campo FieldDefs.InternalCalcField
; ancora una volta questo non viene passato al set di dati Delta.
Quindi, tutte le idee di segnalazione che ho provato non hanno funzionato. Sarei grato per eventuali nuove idee o un approccio alternativo.
tutti i risultati della ricerca su Internet che ho incontrato - tra cui eccellenti articoli di Cary Jensen - accordo con la fase di progettazione o di non-SQL generato messe a punto che non si applicano alla mia situazione.
Il componente deriva da TClientDataSet o è una composizione? – jachguate
Spero di aver capito la tua domanda. Le due classi che ho citato non sono componenti in sé, ma contengono le classi TClientDataSet, TDataSetProvider e TSQLQuery, nessuna delle quali è derivata ie. non sottoclasse. Delle due classi, una deriva dall'altra, ma la classe base dei due deriva solo da TObject. –
Come si _open_ il ClientDataSet interno? Voglio dire, chiami un metodo sulla tua classe o chiami direttamente il metodo interno ClientDataSet.Open? – jachguate