![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вычисляемые поля при динамическом формировании колумов
Lex_! © (2006-10-05 12:46:00)Есть такой код:
for I := 1 to dm.FormColSQL.RecordCount do
begin
dm.FormColSQL.RecNo:=i;
col:=OtchForm.DBGrid1.Columns.Add;
col.FieldName:=dm.FormColSQL.FieldByName('NameField').AsString;
col.ReadOnly:=dm.FormColSQL.FieldByName('ReadOnly').AsBoolean;
col.Title.Caption:=dm.FormColSQL.FieldByName('NameCol').AsString;
if dm.FormColSQL.FieldByName('NameCol').AsBoolean then
begin
????????
end;
end;
Каким образом в нем можно указать, что колонка будет вычисляемая? ..
Т.е. нашли вычисляемую и надо указать это в датасорсе...
Не могу допетрить как...
MsGuns (2006-10-05 16:23:00) [1]>Lex_! © (05.10.06 14:37) [12]
В приведенном Вами коде бред сивой кобылы, лишь чудом почему-то работающий (по Вашим словам - я же сильно в этом сомневаюсь, т.к. он НЕ МОЖЕТ РАБОТАТЬ из-за концептуальныхошибок)
Во-первых, что это за поле 'Calculated' учитывая что НД неизвестный ?
FieldByName может запростол вернуть nil, что тут же приведет к AV
Во-вторых, вся эта фраза
TIntegerField(dm.FindComponent('tFormData'+dm.
FormColSQL.FieldByName('NameField').AsString)).FieldKind:=fkCalculated;
неверна как идеологически (с т.зр. ООП, запрещающего обращение к объектам по именам в общем случае), так и методолгически - нельзя присваивать какие-либо свойства неинициализированным должным образом объектам.
В-третьих... в библиотеку ! И читать, читать, читать !
Lex_! (2006-10-05 14:37:00) [2]
> if dm.FormColSQL.FieldByName('Calculated').AsBoolean
> then
> begin
> TIntegerField(dm.FindComponent('tFormData'+dm.
> FormColSQL.FieldByName('NameField').AsString)).FieldKind:
> =fkCalculated;
> Formuls.Add(dm.FormColSQL.FieldByName('NameField').
> AsString+'='+ dm.FormColSQL.FieldByName('formula').AsString)
> end;
Это все что было нужно, и прекрасно поля калькулируются, без всякого постороннего вмешательства....
MsGuns (2006-10-05 14:11:00) [3]Какие вопросы ?
Если [8], то ADO TableНЕ ПРЕДНАЗНАЧЕН для калькулируемых полей - для этого существуют другие компоненты. "Выкрутить" это в ADOTable тоже можно, но не нужно ибо коряво это. Ибо неверно МЕТОДОЛОГИЧЕСКИ.
Если [7], то отвечено уже - МАРШ УЧИТЬСЯ !!! Читать тут лекции про технологию "клиент-сервер" я лично не намерен, а Вы на то намекаете. Кроме того я объяснил, что в 99% случаев все Ваши "вычисления" вполне можно переложить на сервер, "утоньшив" "клиента" и существенно повысив надежность и скорость работы приложений.
Lex_! (2006-10-05 14:02:00) [4]На вопрос тем не менее не ответили ..
Даже на два уже... :)
Один был конкретно к вам MsGuns
MsGuns (2006-10-05 14:01:00) [5]Марш читать справку, лентяй !
Lex_! (2006-10-05 13:37:00) [6]Так и никто не в курсе как поле сделать из невычисляемого вычисляемым? ... в АдоТабле?
Lex_! (2006-10-05 13:36:00) [7]Ок, опишите последовательность действия клиента по вашей технологии...
я в гриде правлю одно значение (мне соответственно нужно пересчитать вычисляемые поля в записи).
и... что будет делать клиент? записывать все в таблицу, и перевыполнять весь запрос?
Основная таблица с данными около 5 млн записей.
MsGuns (2006-10-05 13:25:00) [8]В "рунтайме" ничего указывать не надо. Все само выставится после открытия датасета (выполнения запроса). Коллекция TDataSet.Fields будет содержать заполненную автоматически при открытии информацию о полях датасета (или таблицы, если запрос типа Select * from table).
"Вычисляемые" поля можно получить "на сервере", включив в запрос доп.конструкции по указанной ранее "рыбе" либо состряпать "ручками" в ДАТАСЕТЕ после его открытия.
И еще. Откажитесь кактегорически от TADOTable в пользу TADODataSet - убережетесь от тучи непоняток и костылей на ровном месте
Lex_! (2006-10-05 13:15:00) [9]мда...
Вообще то в дата сете тоже никаких данных нет о колонках ... тобишь полях .. если уж на то пошло ...
Но ... давайте ближе к делу...
есть ADOTable
там есть поля
tFormData***
(*** = st1-st20)
заранее неизвестно какое из них вычисляемое какое нет.
как в рунтайме указать для какого-либо поля что оно вычисляемое? ...
TIntegerField(dm.FindComponent('tFormDatast5').FieldKind:=fkCalculated;?
MsGuns (2006-10-05 13:07:00) [10]Поймите, что грид НЕ СОДЕРЖИТ НИКАКИХ ДАННЫХ, А ЛИШЬ ОТОБРАЖАЕТ ТО, ЧТО ПОЛУЧАЕТ ОТ ИСТОЧНИКА ДАННЫХ.
Поэтому все фрикции с "колонками" типа калькуляции и проч. надо получать в наборе данных. Напрямую запросом например (типа Select *, F1*100 as ClcField1 From Table), или кодом в событиях OnGetText полей датасета. "Русские" названия колонок также определяются через поля датасета (TField.DisplayLabel)
"Настройка" же грида выполнится автоматически сразу же после того, как откроется датасет, с котороым он связан источником. Поэтому никаких "ручных" действий с его клонками производить не нужно - все будет благополучно "похерено" псоле открытия датасета и перстройки (rebuild) коллекции TColumns
Lex_! (2006-10-05 12:56:00) [11]Потому что изначально не известно, сколько и вообще что за колонки будут в гриде, а описано это - 1 колонка = 1 запись.
DataSource не тот датасет с которого заполняются колонки.
По поводу вопроса: я так понимаю что то такое должно быть вместо вопр. знаков:
dm.tFormData.Fields.FieldByName(dm.FormColSQL.FieldByName('NameField').AsString) .FieldKind:=fkCalculated;
??
MsGuns (2006-10-05 12:50:00) [12]Код неправильный от начала и до конца.
Начиная с того, что почему-то колонки в гирде создаются не из полей датасета, а из его записей. И заканчивая тем, что в коллекцию добавляются несуществующие объекты...
Lex_! (2006-10-05 12:47:00) [13]
// dm.FormColSQL.FieldByName('NameCol').AsBoolean
NameCol=Calculated