Форум: "Базы";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизВычисляемые поля при динамическом формировании колумов Найти похожие ветки
← →
Lex_! © (2006-10-05 12:46) [0]Есть такой код:
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;
Каким образом в нем можно указать, что колонка будет вычисляемая? ..
Т.е. нашли вычисляемую и надо указать это в датасорсе...
Не могу допетрить как...
← →
Lex_! © (2006-10-05 12:47) [1]
// dm.FormColSQL.FieldByName("NameCol").AsBoolean
NameCol=Calculated
← →
MsGuns © (2006-10-05 12:50) [2]Код неправильный от начала и до конца.
Начиная с того, что почему-то колонки в гирде создаются не из полей датасета, а из его записей. И заканчивая тем, что в коллекцию добавляются несуществующие объекты...
← →
Lex_! © (2006-10-05 12:56) [3]Потому что изначально не известно, сколько и вообще что за колонки будут в гриде, а описано это - 1 колонка = 1 запись.
DataSource не тот датасет с которого заполняются колонки.
По поводу вопроса: я так понимаю что то такое должно быть вместо вопр. знаков:dm.tFormData.Fields.FieldByName(dm.FormColSQL.FieldByName("NameField").AsString) .FieldKind:=fkCalculated;
??
← →
MsGuns © (2006-10-05 13:07) [4]Поймите, что грид НЕ СОДЕРЖИТ НИКАКИХ ДАННЫХ, А ЛИШЬ ОТОБРАЖАЕТ ТО, ЧТО ПОЛУЧАЕТ ОТ ИСТОЧНИКА ДАННЫХ.
Поэтому все фрикции с "колонками" типа калькуляции и проч. надо получать в наборе данных. Напрямую запросом например (типа Select *, F1*100 as ClcField1 From Table), или кодом в событиях OnGetText полей датасета. "Русские" названия колонок также определяются через поля датасета (TField.DisplayLabel)
"Настройка" же грида выполнится автоматически сразу же после того, как откроется датасет, с котороым он связан источником. Поэтому никаких "ручных" действий с его клонками производить не нужно - все будет благополучно "похерено" псоле открытия датасета и перстройки (rebuild) коллекции TColumns
← →
Lex_! © (2006-10-05 13:15) [5]мда...
Вообще то в дата сете тоже никаких данных нет о колонках ... тобишь полях .. если уж на то пошло ...
Но ... давайте ближе к делу...
есть ADOTable
там есть поля
tFormData***
(*** = st1-st20)
заранее неизвестно какое из них вычисляемое какое нет.
как в рунтайме указать для какого-либо поля что оно вычисляемое? ...
TIntegerField(dm.FindComponent("tFormDatast5").FieldKind:=fkCalculated;?
← →
MsGuns © (2006-10-05 13:25) [6]В "рунтайме" ничего указывать не надо. Все само выставится после открытия датасета (выполнения запроса). Коллекция TDataSet.Fields будет содержать заполненную автоматически при открытии информацию о полях датасета (или таблицы, если запрос типа Select * from table).
"Вычисляемые" поля можно получить "на сервере", включив в запрос доп.конструкции по указанной ранее "рыбе" либо состряпать "ручками" в ДАТАСЕТЕ после его открытия.
И еще. Откажитесь кактегорически от TADOTable в пользу TADODataSet - убережетесь от тучи непоняток и костылей на ровном месте
← →
Lex_! © (2006-10-05 13:36) [7]Ок, опишите последовательность действия клиента по вашей технологии...
я в гриде правлю одно значение (мне соответственно нужно пересчитать вычисляемые поля в записи).
и... что будет делать клиент? записывать все в таблицу, и перевыполнять весь запрос?
Основная таблица с данными около 5 млн записей.
← →
Lex_! © (2006-10-05 13:37) [8]Так и никто не в курсе как поле сделать из невычисляемого вычисляемым? ... в АдоТабле?
← →
MsGuns © (2006-10-05 14:01) [9]Марш читать справку, лентяй !
← →
Lex_! © (2006-10-05 14:02) [10]На вопрос тем не менее не ответили ..
Даже на два уже... :)
Один был конкретно к вам MsGuns
← →
MsGuns © (2006-10-05 14:11) [11]Какие вопросы ?
Если [8], то ADOTable НЕ ПРЕДНАЗНАЧЕН для калькулируемых полей - для этого существуют другие компоненты. "Выкрутить" это в ADOTable тоже можно, но не нужно ибо коряво это. Ибо неверно МЕТОДОЛОГИЧЕСКИ.
Если [7], то отвечено уже - МАРШ УЧИТЬСЯ !!! Читать тут лекции про технологию "клиент-сервер" я лично не намерен, а Вы на то намекаете. Кроме того я объяснил, что в 99% случаев все Ваши "вычисления" вполне можно переложить на сервер, "утоньшив" "клиента" и существенно повысив надежность и скорость работы приложений.
← →
Lex_! © (2006-10-05 14:37) [12]
> 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 16:23) [13]>Lex_! © (05.10.06 14:37) [12]
В приведенном Вами коде бред сивой кобылы, лишь чудом почему-то работающий (по Вашим словам - я же сильно в этом сомневаюсь, т.к. он НЕ МОЖЕТ РАБОТАТЬ из-за концептуальных ошибок)
Во-первых, что это за поле "Calculated" учитывая что НД неизвестный ?
FieldByName может запростол вернуть nil, что тут же приведет к AV
Во-вторых, вся эта фразаTIntegerField(dm.FindComponent("tFormData"+dm.
FormColSQL.FieldByName("NameField").AsString)).FieldKind:=fkCalculated;
неверна как идеологически (с т.зр. ООП, запрещающего обращение к объектам по именам в общем случае), так и методолгически - нельзя присваивать какие-либо свойства неинициализированным должным образом объектам.
В-третьих... в библиотеку ! И читать, читать, читать !
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.046 c