Форум: "Базы";
Текущий архив: 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.008 c