Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TpFIBDataSet.PSReset - ошибка? / 16 сообщений из 16, страница 1 из 1
04.09.2019, 17:24
    #39857387
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
Здравствуйте,

Может, кто сталкивался с такой проблемой:

Для копирования в TClientDataset из любого датасета всегда использовал TDatasetProvider:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
     
     dsp := TDatasetProvider.Create(nil);
     try
        try
          dsp.DataSet := sourcedataset;
          destinationcds.data := dsp.data;
     finally
        dsp.Free;
     end;



Однако при копировании из tpFibDataset обнаружил, что датасет закрывается и открывается снова. В результате получаем двойную работу, если мы до этого уже открыли датасет и отфетчили все записи. Происходит это из-за PSReset:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TpFIBDataSet.PSReset;
begin
  inherited PSReset;
  if Active then
  begin
    CloseOpen(False)
  end;
end;



В IBX, гляжу, то же самое. Но правильное ли это поведение? В комментариях к функции PSReset пишут, что она всего-навсего:

"Сбрасывает набор данных так, чтобы он был позиционирован на первую запись. Провайдер вызывает PSReset, чтобы снова установить набор данных на первой записи перед выборкой записей"

Обошел проблему через использование функции TDatasetProvider.GetRecords (при условии, что встаем на первую позицию и отфетчили все записи), но есть неприятность: калькулируемые поля включаются в датасет, но не пересчитываются, их значения будут NULL, ибо пересчитываются они как раз в TDatasetProvider.Reset, который заодно и PSReset использует. Поэтому универсального решения для копирования из любых dataset на все случаи жизни уже не получается, приходится учитывать контекст... Но проблемы бы не было, если разобраться с PSReset.

TBDEDataset использует в этой функции процедуру DbiForceReread, которая не приводит к переоткрытию, что TTable, что TQuery, и даже к некоему "обновлению данных "иначе бы давно ошибки повылазили, ибо часто делается запрос в TQuery из временной таблицы, лежащей, допустим, в темпе, открывается запрос, и временная таблица сразу удаляется. Поэтому такое копирование в TClientDataset всегда работало без проблем, и можно было зацапать и калькулируемые поля, и не беспокоиться, что датасет переоткроется.

Есть мнения по поводу того, как должен бы выглядеть правильный PSReset для tpFibDataset?
...
Рейтинг: 0 / 0
04.09.2019, 17:41
    #39857401
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
V.Borzovкак должен бы выглядеть правильный PSReset для tpFibDataset?

Как вызов First().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.09.2019, 12:36
    #39857849
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
V.Borzov...В IBX, гляжу, то же самое. Но правильное ли это поведение?...
Вопрос имел бы смысл, если бы ты был разработчиком этих библиотек.
А так - утрись и используй то, что есть. Или не используй.
...
Рейтинг: 0 / 0
05.09.2019, 12:50
    #39857860
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
ёёёёё,
Я не предлагаю пользоваться моими корректировками. Но для себя я их делаю. В чем проблема-то? Зачем мне утираться ошибкой, если я могу её сам исправить, а не делать затыки в зависящих от неё функциях?
...
Рейтинг: 0 / 0
05.09.2019, 13:19
    #39857882
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
V.Borzovёёёёё,
Я не предлагаю пользоваться моими корректировками. Но для себя я их делаю. В чем проблема-то? Зачем мне утираться ошибкой, если я могу её сам исправить, а не делать затыки в зависящих от неё функциях?
Не сердись. Откуда мне знать, для чего ты спросил. Может, ты собираешь статистику "правильный/неправильный датасет с т.зр. оптимальнсти процедуры копирования данных в TClientDataset". Интересно же.
авторОднако при копировании из tpFibDataset обнаружил, что датасет закрывается и открывается снова. В результате получаем двойную работу, если мы до этого уже открыли датасет и отфетчили все записи.
В результате время работы увеличивается на 18 миллисекунд, каждые сутки?
...
Вообще, тема чрезвычайно интересная - тут тебе и вопросы оптимизации, и целесообразности применения костыля типа TClientDataset, и методика заточки сторонних библиотек под свои нужды.
...
Рейтинг: 0 / 0
05.09.2019, 13:31
    #39857889
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
Мне в ODAC тоже пришлось это фиксить

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TCustomDADataSet.PSReset;
begin
  inherited PSReset;

  // <fix>
  if Active then
    First;
  Exit;
  // <fix>
  
  if Active then begin
    Close;
    Open;
  end;
end;
...
Рейтинг: 0 / 0
05.09.2019, 13:38
    #39857897
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
КвейдМне в ODAC тоже пришлось это фиксить
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TVADQuery.PSReset;
begin
  if Active then
    if FetchOptions.AutoClose then begin
      Close;
      { DONE -ovavan -cbug : no need to open it again }
      //Open;
    end
    else
    if not Bof then
      First;
end;
...
Рейтинг: 0 / 0
05.09.2019, 13:49
    #39857910
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
ёёёёёВ результате время работы увеличивается на 18 миллисекунд, каждые сутки?

запрос выводит 1000-2000 строк с итоговыми суммами, после нескольких select from select всё выплевывается одним махом, на запрос уходит до 2 минут. В данном случае это критично.
...
Рейтинг: 0 / 0
05.09.2019, 15:11
    #39857964
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
Во как! Я тут далеко не первый с этой функций. Что и требовалось выяснить :)
Всем спасибо.
...
Рейтинг: 0 / 0
05.09.2019, 15:51
    #39857993
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
ёёёёёВообще, тема чрезвычайно интересная - тут тебе и вопросы оптимизации, и целесообразности применения костыля типа TClientDataset, и методика заточки сторонних библиотек под свои нужды.
TClientDataset вполне устраивает как таблица в памяти, не такой уж и костыль. И копирование данных указанным способом, вроде, очень быстрое и достаточно удобное, по крайней мере сравнивал как-то с известными бесплатными MemDataset, пришел к такому выводу. И всякие там легкие сортировки по набору полей и агрегатные функции, тоже неплохо. Одно печалит: ограничение на принятый размер данных <=500мегабайт примерно, по крайней мере в 32 разрядном Delphi XE. Буквально вчера обратился клиент, захотелось отчет ему большой, результат которого собирается в CDS и выводится в грид на экран, а отчет выдает ошибку. Объясняю, что в его случае надо либо уменьшать уровень детализации отчета, что дает 12 тыс строк хотя бы, вместо 600 тыс, либо вообще другие отчеты смотреть (а ей всего-то надо было ведомость реализации товаров за месяц со всех складов сразу с полной детализацией...). Но все-таки, ограничение неприятное, учитывая, что программа может под себя выделить до 2 гиг памяти, а в компе ихнем её очень много.
...
Рейтинг: 0 / 0
05.09.2019, 17:35
    #39858085
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
V.BorzovTClientDataset вполне устраивает как таблица в памяти, не такой уж и костыльда ваще вещь, но больно уж глючный в родной реализации

а касаемо прожорливости гляньте в сторону замены строковых полей на мемы, глядишь полегчает
...
Рейтинг: 0 / 0
05.09.2019, 21:51
    #39858151
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
vavanV.BorzovTClientDataset вполне устраивает как таблица в памяти, не такой уж и костыльда ваще вещь, но больно уж глючный в родной реализации

а касаемо прожорливости гляньте в сторону замены строковых полей на мемы, глядишь полегчает
Он и глючный, он и медленный, он и жадный до памяти. Прицепи, к примеру, в качестве источника данных собственный (наследник TDataSet) датасет, простейший, который реально данных внутри себя не имеет, но на запросы виртуально возвращает, скажем, 1 млн записей. Например, по 4 ftInteger поля. И всё.
...
Рейтинг: 0 / 0
06.09.2019, 09:24
    #39858261
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
ёёёёёон и медленныйв родной реализации кажется действительно не блистал, а в моей в чем-то помнится даже обгонял самый быстрый kbmmt
ёёёёёжадный до памятидык in-memory, назначение обязывает. но тут тоже от реализации может варьироваться и выбираемых типов, про строки вот писал уже. у меня юзвери по несколько сот тысяч записей накачивают по 150 полей условно, с кучей разных типов и ничего
...
Рейтинг: 0 / 0
06.09.2019, 13:24
    #39858398
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
vavanпо 150 полей условноглянул, 180 уже похоже
...
Рейтинг: 0 / 0
06.09.2019, 13:42
    #39858410
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
vavan,
Родная реализация только для своих приложений?
...
Рейтинг: 0 / 0
06.09.2019, 16:56
    #39858540
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TpFIBDataSet.PSReset - ошибка?
V.Borzov, увы так
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TpFIBDataSet.PSReset - ошибка? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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