Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];

Вниз

Ну не могу понять, как добавить Calculated поле кодом.   Найти похожие ветки 

 
BlackTiger   (2002-10-03 22:11) [0]

Так и не дождался нормального ответа.
Не дает мне добавить Calculated-поле в Query ПОСЛЕ того, как запрос сформирован (динамически!).
Код примерно такой:

with DataModule1.ADOQuery1 do begin
if Active then Active := false;
SQL.Clear;
SQL.Add("SELECT * FROM Table");
//
//ЧТО ДЕЛАТЬ ТУТ?!?!?!?!?
//
Active := true
//
//ИЛИ ТУТ?!?!?!?!?
//
end;
Мне нужно ДИНАМИЧЕСКИ ДОБАВИТЬ колонку, в которой функция от двух колонок.
Аааафигенный З.Ы.: Я НЕ МОГУ ЗАДАТЬ КОЛОНКИ В ДИЗАЙНЕ, Я НЕ ЗНАЮ ИХ КОЛИЧЕСТВА, ТИПОВ И ИМЕН. ПОЧЕМУ - НЕ СПРАШИВАЙТЕ!


 
Jeer   (2002-10-03 22:23) [1]

SQL.Add(SELECT T.*, T.ID+T.NUM AS KEY FROM MyTable T);
Open;

KEY будет синтетической колонкой
Чего еще изволите-с ?


 
MsGuns   (2002-10-03 22:35) [2]

>Jeer © (03.10.02 22:23)
>SQL.Add(SELECT T.*, T.ID+T.NUM AS KEY FROM MyTable T);
>Open;

>KEY будет синтетической колонкой
>Чего еще изволите-с ?

Они изволятс получитьс "Иди туда не знаю куда принеси то не знаю что !"

>BlackTiger (03.10.02 22:11)
Зачем же нервничать и зачем в дизайне.
В ране опросить структуру, определить имена интересующих колонок, которые будут аргументами выражения и загрузить ручками в TQuery.SQL
Если и это не подойдет, то надо кидать все это на фиг и пить пиво. Хорошая мысля приходит опосля !




 
BlackTiger   (2002-10-03 23:58) [3]

Пиво - этт конечно хорошо, но этот вопрос стал уже делом принципа. Сейчас перерываю литературу - нифига там нет по ТАКОМУ вопросу.

Когда пытаюсь добавлять найденными способами, то ругается "такого поля не существует", "поле не может быть Calculated" (вот этого я совсем не понял). В хелпе вообще только ОЧЕНЬ краткое описание добавления полей (про расчитываемые вообще ничего, кроме типа fkCalculated). Сейчас вот пойду перелопачивать инет, может там чего найду.

И вообще надо бы организовать "большой банк кода". Придумал/нашел что-нибудь - сбросил, если не жалко.


 
Jeer   (2002-10-04 00:06) [4]

Не мучайся и создавай синтетические колонки.
Потом как нибудь разберешься, что Calc для design-time.


 
BlackTiger   (2002-10-04 01:26) [5]

>Jeer
Блин, устал уже! Я НЕ ЗНАЮ ИМЕН КОЛОНОК!!! Я НЕ ЗНАЮ ОПЕРАЦИИ, КОТОРАЯ ПРОИЗВОДИТСЯ НАД КОЛОНКАМИ!!!

В инете, кстати, НИЧЕГО толкового нет даже для простой ситуации, когда нужно ПРОСТО добавить колонку кодом, так, чтобы в потом гриде ПОЯВИЛАСЬ НОВАЯ колонка. При использовании FieldDefs.Update новая колонка все существующие колонки просто затирает собой, вместо того, чтобы встать в конец.
НЕ-ПО-НИ-МА-Ю! Где и что я пропускаю (даже на стихи перешел уже).
ПРОФИ!!!!!! ВЫ ГДЕ?!?!?! ПАААААМАААААГИТЕ!


 
ЮЮ   (2002-10-04 05:35) [6]

>Блин, устал уже! Я НЕ ЗНАЮ ИМЕН КОЛОНОК!!! Я НЕ ЗНАЮ ОПЕРАЦИИ, КОТОРАЯ ПРОИЗВОДИТСЯ НАД КОЛОНКАМИ!!!

Как же ты собираешься что-то вычислять, если не знаешь над какими полями и какие операции производить? :-)

А теперь серьёзно. Дело в том, что если Fields не определены в Designe, то они у Query пустые и создаются только после открытия запроса. После закрытия они снова очищаются. Но сохраняется информация в FieldDefs.

Поэтому надо заполнить Fields (а не FieldDefs, которые описывают физические поля таблицы) до открытия запроса, т.е. так, как будто это было сделано в Дизайнере и добавить fkCalculated поля.

Итак:
1.Открыть запрос
2.Закрыть запрос
3.На основании информации в FieldDefs создать fkData поля
4.Добавить нужные fkCalculated поля
5.Открыть запрос
6.Любоваться в Gride необходимыми полями


 
BlackTiger   (2002-10-04 13:09) [7]

А все равно не дает "Type mismatch for field "ID", expecting: Unknown actual: Integer".
Что-то с типами данных. Код такой:
//--------------------------------------------------
with dm.q do begin
if Active then Active := false;
SQL.Clear;
SQL.Add("SELECT * FROM Data");
Active := true;
Active := false;
for i := 0 to dm.q.FieldDefs.Count - 1 do begin
df := TField.Create(dm.q);
df.FieldKind := fkData;
df.FieldName := dm.q.FieldDefs[i].Name;
df.Name := dm.q.Name + RemoveSpaces(dm.q.FieldDefs[i].Name);
df.SetFieldType(dm.q.FieldDefs[i].DataType); //что-то тут
dm.q.Fields.Add(df);
end;
Active := true;
end;
//--------------------------------------------------
Или нужно мучиться с TIntegerField, TStringField, TFloatField и тыды, определяя тип по данным из FieldDefs? Или у меня что-то не так?


 
ЮЮ   (2002-10-04 13:17) [8]

>Или нужно мучиться с TIntegerField, TStringField, TFloatField и тыды, определяя тип по данным из FieldDefs
Естественно. А лучше посмотреть исходники, как это реализовано в Delphi.


 
BlackTiger   (2002-10-04 13:21) [9]

Без универсального TField все ЗАРАБОТАЛО!!!
Код (работает, но мне не нравится):
var
f: TFloatField;
intf: TIntegerField;
sf: TStringField;
i: integer;
begin
with dm.q do begin
if Active then Active := false;
SQL.Clear;
SQL.Add("SELECT * FROM Data");
Active := true;
Active := false;
for i := 0 to dm.q.FieldDefs.Count - 1 do begin
if dm.q.FieldDefs[i].FieldClass.ClassName = "TIntegerField" then begin
intf := TIntegerField.Create(dm.q);
intf.FieldKind := fkData;
intf.FieldName := dm.q.FieldDefs[i].Name;
intf.Name := dm.q.Name + RemoveSpaces(dm.q.FieldDefs[i].Name);
intf.DataSet := dm.q;
dm.q.FieldDefs.Update;
end else if dm.q.FieldDefs[i].FieldClass.ClassName = "TStringField" then begin
sf := TStringField.Create(dm.q);
sf.FieldKind := fkData;
sf.FieldName := dm.q.FieldDefs[i].Name;
sf.Name := dm.q.Name + RemoveSpaces(dm.q.FieldDefs[i].Name);
sf.DataSet := dm.q;
dm.q.FieldDefs.Update;
end;
end;
f := TFloatField.Create(dm.q);
f.FieldKind := fkCalculated;
f.Name := dm.q.Name + "fldCalc";
f.FieldName := "fldCalc";
f.DataSet := dm.q;
dm.q.FieldDefs.Update;
Active := true;
end;
end;

Неужели нельзя по-оптимальней!?


 
Val   (2002-10-04 13:34) [10]

>ЮЮ © (04.10.02 05:35)
не уверен, что ваш алгоритм будет работать. автору, судя по всему, нужна именно, настойчиво ему предлагаемая, так называемая, синтетическая колонка. Почему он упирается, понять не могу.


 
BlackTiger   (2002-10-04 13:41) [11]

>ЮЮ
Во-первых, РАБОТАЕТ!
Во-вторых, как будет выглядеть запрос, в котором нужно получить разницу в процентах между ПОСЛЕДНЕЙ и ПРЕДПОСЛЕДНЕЙ колонками, НЕ ЗАНАЯ ИХ ИМЕН? Ну-ка! Может я чего нового узнаю про запросы!


 
ЮЮ   (2002-10-04 13:46) [12]

Неужели нельзя по-оптимальней!?

for i := 0 to dm.q.FieldDefs.Count - 1 do begin
if dm.q.FieldDefs[i].FieldClass.ClassName = "TIntegerField" then f := TIntegerField.Create(dm.q) else
if dm.q.FieldDefs[i].FieldClass.ClassName = "TStringField" then f := TStringField.Create(dm.q);

f.FieldKind := fkData;
f.FieldName := dm.q.FieldDefs[i].Name;
f.Name := dm.q.Name + RemoveSpaces(dm.q.FieldDefs[i].Name);
f.DataSet := dm.q;
//dm.q.FieldDefs.Update;
end;


 
ЮЮ   (2002-10-04 13:51) [13]

>как будет выглядеть запрос, в котором нужно получить разницу в процентах между ПОСЛЕДНЕЙ и ПРЕДПОСЛЕДНЕЙ колонками, НЕ ЗАНАЯ ИХ ИМЕН? Ну-ка! Может я чего нового узнаю про запросы!

Запросы то откуда-то берутся. Почему же вы не знаете их имен?



 
BlackTiger   (2002-10-04 13:58) [14]

>Запросы то откуда-то берутся. Почему же вы не знаете их имен?

Есть такая весчь как crosstab (pivot). В нем, к примеру, может быть, что кроме нескольких первых колонок (фиксированных) идут колонки с названием, в котором ГОД. Разультат, например такой:
| Год | Месяц | Магазин1 | Магазин2 |.
А "Магазин1" и "Магазин2" - это строки из другой таблицы.
Есть хирая ХП, которая генерит такой результат. Можно конечно извратиться и модифицировать саму ХП, но я нашел рабочее решение.


 
Hawk2   (2002-10-04 14:07) [15]

Вот читал я все это и немогу понять что человеку надо. Зачем выводить данные с помощью запроса, а потом чего-то считать вручную. Calculated поле это поле в котором считается например сума других полей или что? А что нельзя это сделать в запросе?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
4-78741
Stainer
2002-09-10 14:13
2002.10.24
Чтение по адресам памяти


14-78590
Serzhik
2002-10-01 18:20
2002.10.24
отладка в Delphi


3-78311
Sayan
2002-10-04 08:55
2002.10.24
Нафигатор по базе


14-78636
delta
2002-10-03 18:22
2002.10.24
Киньте свежых анекдотцев. Тема произвольная...


3-78284
User0
2002-10-01 14:26
2002.10.24
Почему Event-ы не ловятся ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский