Precis: Mój kod próbuje zaktualizować pola niefizyczne w Delphi XE TClientDataset
(podłączony do TSQLQuery
z zestawem SQL
nieruchomości), które zostały utworzone w wyniku wykonania komendy runtime Open
.muszę uniknąć próby aktualizacji pola niefizycznych w Delphi TClientDataset podłączone do TSQLQuery
Mam TClientDataset
podłączony do TDatasetProvider
podłączonego do TSQLQuery
podłączonego do TSQLConnection
. Pierwsze trzy z tych obiektów są zawarte w kilku klasach w bibliotece, z której korzystam w wielu miejscach w kilku projektach. Te klasy tworzą te 3 obiekty w czasie wykonywania i eliminują znaczną ilość powtarzających się kodów, niezbędnych, ponieważ mam wiele, wiele z tych tripletów.
Dość typowo będę załadować TClientDataset
z bazy danych, określając pewne SQL w majątku TSQLQuery
SQL
i nazywając Open
na TClientDataSet
. Fields
w TClientDataset
są tworzone za pośrednictwem tego połączenia do Open
tj.. nie istnieją przed Open
.
Wystąpił problem w sytuacji, gdy trzy pola wygenerowane w TClientDataset
są niefizyczne; to jest, SQL wykonuje obliczenia, aby je wygenerować. Niestety w TClientDataset
te 3 pola nie są tworzone inaczej niż pola fizyczne; ich FieldKind
jest fkData
(idealnie byłoby fkInternalCalc
), Calculated
nieruchomość jest False
(idealnie byłoby True
) i ich ProviderFlags
obejmują pfInUpdate
(który idealnie nie powinien on). Nic dziwnego, że kiedy nadejdzie czas, aby zrobić ApplyUpdates
na TClientDataset
jest wyjątek ...
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'.
mogę uniknąć tego błędu, usuwając tych dziedzinach za pfInUpdate
flagi obsługi OnUpdateData
Event TDatasetProvider
„s. Jednak to rozwiązanie wymaga, aby określone nazwy pól były znane tej funkcji, która znajduje się w klasach ogólnych wspomnianych powyżej, tym samym przełamując ogólność kodu.
To, czego szukam, to ogólny sposób sygnalizowania obliczonej natury tych pól funkcji funkcji obsługi zdarzeń.
nie mogą zmienić FieldKind
lub Calculated
właściwości (na fkInternalCalc
i True
odpowiednio), po wywołaniu Open
ponieważ generuje komunikat WorkCDS: Cannot perform this operation on an open dataset
wyjątku. Nie mogę zmienić tych właściwości przed wywołaniem Open
, ponieważ Fields
jeszcze nie istnieje.
mogę usunąć flagę pfInUpdate
z ProviderFlags
właściwości te Field
„s po Open
ale to nie przejdzie na«Delta»TClientDatset
że przybędzie obsługi OnUpdateData
zdarzeń. Próbowałem również ustawić właściwości pola FieldDefs.InternalCalcField
; znowu to nie zostanie przekazane do zbioru danych Delta.
Tak więc wszystkie pomysły sygnalizacyjne, które próbowałem, nie zadziałały. Byłbym wdzięczny za wszelkie nowe pomysły lub alternatywne podejście.
Wszystkie wyniki wyszukiwania internetowego, które spotkałem - w tym doskonałe artykuły Cary'ego Jensena - dotyczą konfiguracji generowanych w czasie projektowania lub innych niż SQL, które nie mają zastosowania w mojej sytuacji.
Czy twój komponent pochodzi z TClientDataSet lub jest kompozycją? – jachguate
Mam nadzieję, że zrozumiałem twoje pytanie. Te dwie klasy, o których wspomniałem, nie są same w sobie komponentami, zawierają raczej klasy TClientDataSet, TDataSetProvider i TSQLQuery, z których żadna nie jest pochodna. nie subklasowane. Z dwóch klas jedna pochodzi od drugiej, ale klasa podstawowa tych dwóch wywodzi się z TObject. –
W jaki sposób otwierasz wewnętrzny zestaw ClientDataSet? Mam na myśli, czy wywołujesz metodę na swojej klasie lub bezpośrednio wywołujesz wewnętrzną metodę ClientDataSet.Open? – jachguate