![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание колонок в TdxDBGrid
Kerk © (2006-03-10 19:35:00)В результирующем гриде должно быть N штук колонок HCV_DIMx и колонка HCV_VALUE. Но корректно работает только колонка HCV_VALUE, в HCV_DIMx все поля - NULL
procedure AddColumns(Grid: TdxDBGrid; VTYPID: Integer);
var
DataSet: TOracleDataSet;
TmpCol,TmpCol1: TdxDBTreeListColumn;
TmpFieldName: string;
CurDimNum,i: Integer;
begin
DataSet := Grid.DataSource.DataSet as TOracleDataSet;
DataSet.SQL.Text := 'select hcv.*,hcv.rowid from HEAT_CALC_VALUE hcv where HCV_TYPE=:VTYPID';
DataSet.DeclareVariable(':VTYPID',otString);
DataSet.SetVariable(':VTYPID',VTYPID);
with TOracleDataSet.Create(Self) do
try
SQL.Text :=
'select pd.*,hcvt.*,PCKG_MTX_PARAM.GET_DIM_SQL(pd.DIM_ID) dimlook '+#10#13+
'from PARAM_DIMENSION pd, HEAT_CALC_VALUE_TYPE hcvt where '+#10#13+
' hcvt.VTYP_ID=:VTYPID and (pd.DIM_ID=hcvt.VTYP_DIMID1 or '+#10#13+
' pd.DIM_ID=hcvt.VTYP_DIMID2 or pd.DIM_ID=hcvt.VTYP_DIMID3 or '+#10#13+
' pd.DIM_ID=hcvt.VTYP_DIMID4 or pd.DIM_ID=hcvt.VTYP_DIMID5)';
DeclareVariable(':VTYPID',otString);
SetVariable(':VTYPID',VTYPID);
Session := fOracleSession;
Open;
for i := 1 to RecordCount do
begin
DataSet.FieldDefs.Add('HCV_DIM'+IntToStr(i), ftString);
DataSet.FieldDefs.Items[DataSet.FieldDefs.Count-1].CreateField(DataSet);
end;
DataSet.FieldDefs.Add('HCV_VALUE', ftFloat);
DataSet.FieldDefs.Items[DataSet.FieldDefs.Count-1].CreateField(DataSet);
First;
CurDimNum := 1;
while not Eof do
begin
TmpCol := Grid.CreateColumn(TdxDBGridColumn);
TmpCol.Caption := FieldValues['DIMNAME'];
TmpFieldName := 'HCV_DIM'+IntToStr(CurDimNum);
TmpCol.FieldName := TmpFieldName;
Inc(CurDimNum);
Next;
end;
finally
Free;
end;
TmpCol1 := Grid.CreateColumn(TdxDBGridColumn);
TmpCol1.Caption := '';
TmpCol1.FieldName := 'HCV_VALUE';
DataSet.Open;
end;
Если убрать выделенный жирным код (т.е. когда список полей датасета генерируется автоматически), то все работает как нужно, но код убирать нельзя. Мне в датасет еще нужно добавлять lookup-поля, я пока минимизировал задачу, чтобы локализовать ошибку.
Надеюсь, все описал.. что-то трудно соображаю уже. Уточню в последствии, если что.
pasha_golub (2006-03-14 00:54:00) [1]Класс... Я с таким встречался, кстати. Но хрен бы подумал в эту сторону. :0)
Джо (2006-03-13 20:43:00) [2]Опа, забавно :-)
Kerk (2006-03-13 20:35:00) [3]Мне даже стыдно :)
Все решилось просто
DataSet.FieldByName(TmpFieldName).Size := 25;
Вот так вот :)
Petr V. Abramov (2006-03-13 00:11:00) [4]Что интересно, грид отображает правильное количество строк выборки. Но данных нет. Одни NULLы.
Вроде была такая фича, что DOA RecordCount считал отдельным запросом. Но fetch`ит как захочется. при том, что API начиная с 9-ки немного поменялось на этот счет.
попробуй FetchAll. Если не поможет, помочь смогут только разбирающиеся в TdxDBGrid
Sergey Masloff (2006-03-12 23:05:00) [5]Ну вобщем такое впечсетление что биндинг у тебя не происходит для полей которые ты сам формируешь. Поэтому 'HCV_VALUE' которое жестко задано работает а в остальных буферы пустые он и отображает NULL. Но это так, вилами по воде...
Kerk (2006-03-12 22:38:00) [6]Это все по памяти, конкретнее завтра смогу говорить.
Kerk (2006-03-12 22:35:00) [7]Sergey Masloff (12.03.06 22:26) [5]
Если с гридом не соединен датасет от 1 запись по дефолту фетчит то есть RecordCount = 1 сколько б записей не было.
Один раз-то оно выполнится по-любому. Что отладка и показала. Цикл создает полеHCV_DIM1, далее привязывает его к свежесозданной колонке грида. Но там NULL.
Что интересно, грид отображает правильное количество строк выборки. Но данных нет. Одни NULLы.
Sergey Masloff (2006-03-12 22:27:00) [8]Проверить не могу - у меня OracleXE только есть с ним DOA вроде не пашет (да и сам я ODAC использую) но посмотри пока это. А там подумаем
Sergey Masloff (2006-03-12 22:26:00) [9]Я с DOA давно не работал но
>for i := 1 to RecordCount do
У тебя скорее всего никогда не выполнится. Если с гридом не соединен датасет от 1 запись по дефолту фетчит то есть RecordCount = 1 сколько б записей не было. Сделай FetchAll или как оно там или иди Next()ом до конца датасета
Kerk (2006-03-12 21:05:00) [10]Джо © (12.03.06 14:29) [3]
Спасибо, что попытался помочь. :)
Серьезно.
Джо (2006-03-12 14:29:00) [11]
> [2] Джо ©
Тьфу, не заметил, что i в цикле используется только в IntToStr для генерации строки.
Джо (2006-03-12 14:27:00) [12]Честно говоря, я DbControl'ах полный чайник. Но ты точно уверен в том, что нумерация начинается с 1 и заканчивается RecordCount (в выделенном коде)?
Kerk (2006-03-11 13:30:00) [13]Някой има ли някакви идеи? :(