Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Вычисляемые поля при динамическом формировании колумов   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.054 c
3-1159793840
Wolferio
2006-10-02 16:57
2006.12.10
Как узнать типы полей в базе данных


15-1164193806
Footballer
2006-11-22 14:10
2006.12.10
Интернет-карты


2-1164023733
Галинка
2006-11-20 14:55
2006.12.10
Создать вложения в XmlDocument


2-1163878857
c0rben
2006-11-18 22:40
2006.12.10
Фиксированный вывод


3-1159976497
Sanya_BBB
2006-10-04 19:41
2006.12.10
Как внести данные сразу в главную и дочернюю таблицы. В сетевой Б