Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Calculated fields / 10 сообщений из 10, страница 1 из 1
17.12.2003, 13:07
    #32355165
Dens
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
Видимо звезды мне сегодня не благоприятствуют. В OracleDataSet (DOA3.4.6) вычисляемое поле. Если активна первая строка, то его значение устанавливается из другого ODS, иначе - вычисляется, используя значения предыдущей строки, ну и ессно мы зацикливаемся. Как можно обойти эту ситуацию?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TfmPlan.odsPlan_ItemCalcFields(DataSet: TDataSet);
var
  nnzp,dnzp:integer;
begin
  if odsPlan_Item.Bof
  then odsPlan_ItemNnzp_calc.Value:=odsPlanNNZP.Value
  else
  begin
    odsPlan_Item.Prior;
    nnzp:=odsPlan_ItemNnzp_calc.Value;
    dnzp:=odsPlan_ItemDnzp.Value;
    odsPlan_Item.Next;
    odsPlan_ItemNnzp_calc.Value:=nnzp+dnzp;
  end;
end;
...
Рейтинг: 0 / 0
17.12.2003, 13:18
    #32355202
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
Нульзя внутри обработчика OnCalcFields двигаться по записям. Меняй алгоритм.
...
Рейтинг: 0 / 0
17.12.2003, 14:24
    #32355362
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
А odsPlan и odsPlan_Item связаны Master-Detail связью?
Проще всего, как мне кажется, использовать RxMemoryData, в который перегонять данные из odsPlan_Item (поле nzp_calc сделать fkData, а не fkCalculated) и во время перегонки , считать значения nzp_calc...
А если Plan_Item`ов много может быть, тогда odsPlan_Item сделать TOracleQuery, чтобы не кэшировал записи...
...
Рейтинг: 0 / 0
18.12.2003, 07:35
    #32356186
Dens
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
to m_kus:
odsPlan и odsPlan_Item связаны Master-Detail связью.
Сейчас я пытаюсь при открытии odsPlan_Item сливать данные из него в массив записей и вытаскивать nnzp уже из массива, но это больно мудрено получается. Я так понимаю, способ, который вы предлагаете с RxMemoryData аналогичен? И еще, где можно почитать про RxMemoryData? Может быть использовать его удобнее, чем массив. На http://polesoft.narod.ru/ я данных об этом компоненте не нашел.
Что касается последнего предложения, то я не понял его суть. Чем плохо, что odsPlan_Item кэширует записи?
...
Рейтинг: 0 / 0
18.12.2003, 08:17
    #32356205
LexusR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
можно попробовать так
сохранять значение предыдущего поля в переменной и использовать его в вычислении типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
private
    FPrevNnzp : integer;
    FPrevDnzp : integer;
......

procedure TfmPlan.FormCreate(Sender: TObject);
begin
    FPrevNnzp :=- 1 ;
    FPrevDnzp :=- 1 ;
end;
......
procedure TfmPlan.odsPlan_ItemCalcFields(DataSet: TDataSet);
var
  nnzp,dnzp:integer;
begin
  if ((FPrevNnzp = - 1 )and(FPrevDnzp =- 1 )) then
     odsPlan_ItemNnzp_calc.Value:=odsPlanNNZP.Value
  else
    odsPlan_ItemNnzp_calc.Value:=FPrevDnzp+FPrevNnzp;
  end;
  FPrevDnzp := odsPlan_ItemDnzp.Value;
  FPrevNnzp := odsPlan_ItemNnzp_calc.Value;
end;


...
Рейтинг: 0 / 0
18.12.2003, 08:19
    #32356207
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
DensСейчас я пытаюсь при открытии odsPlan_Item сливать данные из него в массив записей и вытаскивать nnzp уже из массива, но это больно мудрено получается. Я так понимаю, способ, который вы предлагаете с RxMemoryData аналогичен? И еще, где можно почитать про RxMemoryData? Может быть использовать его удобнее, чем массив. На http://polesoft.narod.ru/ я данных об этом компоненте не нашел.
Лучше продолжай делать через массив, раз начал, ничего, что мудрёно...
А про RxMemoryData можешь почитать здесь .
С ним будет удобней, но не сильно...
DensЧто касается последнего предложения, то я не понял его суть. Чем плохо, что odsPlan_Item кэширует записи?
Тем что odsPlan_Item будет кэшировать и RXMemoryData будет тоже самое в памяти держать...
...
Рейтинг: 0 / 0
18.12.2003, 08:42
    #32356216
Dens
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
to LexusR:
Во-во, именно так я и пробовал выкрутиться сначала, но мои наивные мечты разбились. Дело в том, что поля вычисляются не только в момент открытия набора и необязательно в порядке от первой к последней, а вообще хрен поймешь в каком порядке.
...
Рейтинг: 0 / 0
18.12.2003, 09:42
    #32356266
LexusR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
судя по алгоритму вычисления
в вычисляемое поле собирается сумма поля odsPlan_ItemDnzp
предыдущих записей
а нельзя ли это поле сразу получить в запросе вычислив все на сервере ?
...
Рейтинг: 0 / 0
18.12.2003, 10:03
    #32356293
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
LexusRсудя по алгоритму вычисления
в вычисляемое поле собирается сумма поля odsPlan_ItemDnzp
предыдущих записей
а нельзя ли это поле сразу получить в запросе вычислив все на сервере ?
Честно говоря, сначал подумал, что нельзя этого сделать на сервере, но теперь, когда LexusR заострил на это внимание, почтиал документацию и точно, можно ведь и на сервере считать:
пусть у odsPlan_Item.MasterFields='PlanId;NNZP' и объявлены переменные PlanId и NNZP тогда SQL для odsPlan_Item может выглядеть так:
Код: plaintext
1.
2.
3.
4.
SELECT main.*,
 :NNZP + SUM(DNZP) OVER (PARTITION BY PlanId ORDER BY Plan_ItemId RANGE UNBOUNDED PRECEDING)
 FROM Plan_Item main WHERE PlanId=:PlanId
 ORDER BY Plan_ItemId

Ну это конечно если версия Oracle позволит, у меня Oracle8i (8.1.7).
В принципе я не тестировал в Delphi, может и не будет так работать...
...
Рейтинг: 0 / 0
18.12.2003, 10:23
    #32356331
m_kus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculated fields
LexusRа нельзя ли это поле сразу получить в запросе вычислив все на сервере ?
Минус такого подхода заключается в том, что при изменении поля odsPlan_ItemDnzp для пересчёта сумм придётся посылать запрос на сервер, а при массиве -нет...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Calculated fields / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]