Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > динамическое добавление вычислимых полей


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

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;

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



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

Автор: cyberovskij 10.8.2011, 01:18
Цитата(Данкинг @ 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

Автор: Frees 10.8.2011, 06:13
вроде 

Код

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


лишнее

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

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

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


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

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

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

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

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

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


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

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

Автор: Данкинг 10.8.2011, 11:23
Цитата(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 

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


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

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

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

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

Моя твоя не понимает  smile  Приведите тогда пример нормального способа

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

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

Автор: cyberovskij 10.8.2011, 14:15
Цитата(Данкинг @ 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 вичислимых поля 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)