Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.044 c
15-1164096145
DelphiLexx
2006-11-21 11:02
2006.12.10
Помогите создать функцию, умеющая красиво сокращать текст


2-1164467384
Strate
2006-11-25 18:09
2006.12.10
Непонятный Access Violation...


2-1164101119
Anieshechka
2006-11-21 12:25
2006.12.10
HELP!!!!!!!


15-1164011476
Gavrila
2006-11-20 11:31
2006.12.10
TTreeView: как правильно использовать метод AddObject?


3-1159852366
Alexey 12
2006-10-03 09:12
2006.12.10
Значение на последнюю дату





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский