Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамическое добавление вычислимых полей 
:(
    Опции темы
cyberovskij
Дата 9.8.2011, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Нужно к датасету добавить во время рантайма высисляемые поля. Добавление можно делать когда датасет еще не открыт:
Код

ibdataset2typviza2:=  TStringField.create(ibdataset3);
    
    ibdataset2typviza2.FieldName:='typviza2';
    with ibdataset2typviza2 do
    begin
    
    Calculated := True;
    DataSet := ibdataset3;
    
    ibdataset3.FieldDefs.Add(fieldname,ftstring,20,true); 

    end;
    ifreg:=tstringfield.Create(ibdataset3);

    with ifreg do
    begin
      FieldName := 'ifreg';
      Calculated := True;
      DataSet := ibdataset3;
     
      ibdataset3.FieldDefs.Add(fieldname,ftstring,7,true); 
    end;

Проблема в том что после открытия те поля, что перечисляются в селецт запросе уже более не доступны. Есть ли какой то способ сделать их доступными кроме как вручную и явно добавлять соответствующие  поля к ФиелдДефс?



PM MAIL   Вверх
Данкинг
Дата 10.8.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Ну, переподключись к БД после добавления. Кстати, а зачем так сложно: обычным запросом добавить не проще?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
cyberovskij
Дата 10.8.2011, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(Данкинг @ 10.8.2011,  00:00)
Кстати, а зачем так сложно: обычным запросом добавить не проще?

Код

if TDataSet(DataSet).FieldByName('typeofviza').AsInteger=1 then TDataSet(DataSet).FieldByName('typviza2').Value:='national';
if TDataSet(DataSet).FieldByName('typeofviza').AsInteger=0 then TDataSet(DataSet).FieldByName('typviza2').Value:='shengen';
if TDataSet(DataSet).FieldByName('typeofviza').AsInteger<0 then TDataSet(DataSet).FieldByName('typviza2').Value:='pattern';

Как такое в запросе сделать?

Добавлено через 6 минут и 8 секунд
Цитата(Данкинг @ 10.8.2011,  00:00)
Ну, переподключись к БД после добавления. 

Код

ibdataset2typviza2:=  TStringField.create(ibdataset3);
    
    ibdataset2typviza2.FieldName:='typviza2';
    with ibdataset2typviza2 do
    begin
    
    Calculated := True;
    DataSet := ibdataset3;
    
    ibdataset3.FieldDefs.Add(fieldname,ftstring,20,true); 
    end;
    ifreg:=tstringfield.Create(ibdataset3);
    with ifreg do
    begin
      FieldName := 'ifreg';
      Calculated := True;
      DataSet := ibdataset3;
     
      ibdataset3.FieldDefs.Add(fieldname,ftstring,7,true); 
    end;

После этого всего я вызываю.

ibdataset3.active=true;

в результате имею только 2 поля typviza2 и ifreg
PM MAIL   Вверх
Frees
Дата 10.8.2011, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



вроде 

Код

ibdataset3.FieldDefs.Add(fieldname,ftstring,20,true); 


лишнее

Добавлено через 1 минуту и 39 секунд
Цитата(cyberovskij @  10.8.2011,  04:18 Найти цитируемый пост)
Как такое в запросе сделать?

а в чем проблема?

СУБД то какая?




--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Данкинг
Дата 10.8.2011, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Frees @  10.8.2011,  07:13 Найти цитируемый пост)
СУБД то какая?

А ты догадайся по ibdataset3. smile 
Цитата(cyberovskij @  10.8.2011,  02:18 Найти цитируемый пост)
Как такое в запросе сделать?

Обычно, через ALTER TABLE.
Цитата(cyberovskij @  10.8.2011,  02:18 Найти цитируемый пост)
После этого всего я вызываю.

Вот я говорю: попробуй сначала нормальным способом добавить поле, а не столь экзотическим.

Это сообщение отредактировал(а) Данкинг - 10.8.2011, 09:26


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Frees
Дата 10.8.2011, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(Данкинг @  10.8.2011,  12:26 Найти цитируемый пост)
А ты догадайся по ibdataset3.

дак варианты остаются, IB или FB....


Цитата(Данкинг @  10.8.2011,  12:26 Найти цитируемый пост)
Обычно, через ALTER TABLE.

или IIF в запросе



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Данкинг
Дата 10.8.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Frees @  10.8.2011,  12:19 Найти цитируемый пост)
дак варианты остаются, IB или FB....

Ну это понятно, что варианта два, но в плане добавления поля запросом тут ничего не меняется же.

Добавлено через 1 минуту и 21 секунду
Кстати:
Цитата(cyberovskij @  10.8.2011,  02:18 Найти цитируемый пост)
if TDataSet(DataSet).FieldByName('typeofviza').AsInteger=0 then TDataSet(DataSet).FieldByName('typviza2').Value:='shengen';

При чём здесь вообще добавление поля? smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Frees
Дата 10.8.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(Данкинг @  10.8.2011,  14:23 Найти цитируемый пост)
При чём здесь вообще добавление поля?


этого поля
Цитата(Данкинг @  10.8.2011,  14:23 Найти цитируемый пост)
'typviza2'

нет в запросе.

Автор наверно, что то типа кросс таблицы хочет сделать........

Это сообщение отредактировал(а) Frees - 10.8.2011, 11:42


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
cyberovskij
Дата 10.8.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(Данкинг @ 10.8.2011,  09:26)
Вот я говорю: попробуй сначала нормальным способом добавить поле, а не столь экзотическим.

Моя твоя не понимает  smile  Приведите тогда пример нормального способа
PM MAIL   Вверх
Данкинг
Дата 10.8.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(cyberovskij @  10.8.2011,  15:03 Найти цитируемый пост)
Приведите тогда пример нормального способа 

Ну так запрос-то чем не устраивает? smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
cyberovskij
Дата 10.8.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(Данкинг @ 10.8.2011,  11:23)
Цитата(cyberovskij @  10.8.2011,  02:18 Найти цитируемый пост)
if TDataSet(DataSet).FieldByName('typeofviza').AsInteger=0 then TDataSet(DataSet).FieldByName('typviza2').Value:='shengen';

При чём здесь вообще добавление поля? smile

Это пример из OnCalFields. Да Frees прав typviza2 нету в запросе. Конечно вопрос можно закрыть создав еще одну таблицу где полями будут typeofviza и поле которое будет хранить название ртом этого typeofviza. И в запросе соединить эти поля. Но у меня сейчас чисто академический интерес: как сделать так чтобы открыв запрос и к тем полям что уже присутствуют в нем добавить вичисляемые и при этом не добавлять вручную  каждое поле что присутствует в запросе :
Код

FieldDefs[i].CreateField(ibdataset3);
      fielddefs.Add(fieldname, ...,.., ..);

Полей просто очень много. И влом добавлять каждое к FieldDefs. Если я не буду добавлять поля к FieldDefs то в результате в наборе данных будет только 2 вичислимых поля 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.