Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

Динамическое создание колонок в TdxDBGrid   Найти похожие ветки 

 
Kerk ©   (2006-03-10 19:35) [0]

В результирующем гриде должно быть 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-поля, я пока минимизировал задачу, чтобы локализовать ошибку.

Надеюсь, все описал.. что-то трудно соображаю уже. Уточню в последствии, если что.


 
Kerk ©   (2006-03-11 13:30) [1]

Някой има ли някакви идеи? :(


 
Джо ©   (2006-03-12 14:27) [2]

Честно говоря, я DbControl"ах полный чайник. Но ты точно уверен в том, что нумерация начинается с 1 и заканчивается RecordCount (в выделенном коде)?


 
Джо ©   (2006-03-12 14:29) [3]


> [2] Джо ©  

Тьфу, не заметил, что i в цикле используется только в IntToStr для генерации строки.


 
Kerk ©   (2006-03-12 21:05) [4]

Джо ©   (12.03.06 14:29) [3]

Спасибо, что попытался помочь. :)
Серьезно.


 
Sergey Masloff   (2006-03-12 22:26) [5]

Я с DOA давно не работал но
>for i := 1 to RecordCount do
У тебя скорее всего никогда не выполнится. Если с гридом не соединен датасет от 1 запись по дефолту фетчит то есть RecordCount = 1 сколько б записей не было. Сделай FetchAll или как оно там или иди Next()ом до конца датасета


 
Sergey Masloff   (2006-03-12 22:27) [6]

Проверить не могу - у меня OracleXE только есть с ним DOA вроде не пашет (да и сам я ODAC использую) но посмотри пока это. А там подумаем


 
Kerk ©   (2006-03-12 22:35) [7]

Sergey Masloff   (12.03.06 22:26) [5]
Если с гридом не соединен датасет от 1 запись по дефолту фетчит то есть RecordCount = 1 сколько б записей не было.


Один раз-то оно выполнится по-любому. Что отладка и показала. Цикл создает поле HCV_DIM1, далее привязывает его к свежесозданной колонке грида. Но там NULL.

Что интересно, грид отображает правильное количество строк выборки. Но данных нет. Одни NULLы.


 
Kerk ©   (2006-03-12 22:38) [8]

Это все по памяти, конкретнее завтра смогу говорить.


 
Sergey Masloff   (2006-03-12 23:05) [9]

Ну вобщем такое впечсетление что биндинг у тебя не происходит для полей которые ты сам формируешь. Поэтому "HCV_VALUE" которое жестко задано работает а в остальных буферы пустые он и отображает NULL. Но это так, вилами по воде...


 
Petr V. Abramov ©   (2006-03-13 00:11) [10]

Что интересно, грид отображает правильное количество строк выборки. Но данных нет. Одни NULLы.

 Вроде была такая фича, что DOA RecordCount считал отдельным запросом. Но fetch`ит как захочется. при том, что API начиная с 9-ки немного поменялось на этот счет.
 попробуй FetchAll. Если не поможет, помочь смогут только разбирающиеся в TdxDBGrid


 
Kerk ©   (2006-03-13 20:35) [11]

Мне даже стыдно :)
Все решилось просто

DataSet.FieldByName(TmpFieldName).Size := 25;

Вот так вот :)


 
Джо ©   (2006-03-13 20:43) [12]

Опа, забавно :-)


 
pasha_golub ©   (2006-03-14 00:54) [13]

Класс... Я с таким встречался, кстати. Но хрен бы подумал в эту сторону. :0)



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

Текущий архив: 2006.05.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
2-1145365094
_Zzz_
2006-04-18 16:58
2006.05.07
Формат чисел вещественного типа


2-1145334294
Ezorcist
2006-04-18 08:24
2006.05.07
Узнать сетевое имя и IP машины


2-1145620631
Zaq123
2006-04-21 15:57
2006.05.07
Ansi to OEM


15-1145007228
Tirael
2006-04-14 13:33
2006.05.07
softice


6-1137681624
Volf_555
2006-01-19 17:40
2006.05.07
Как из кода html выделить только текст?