Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Неожиданное переоткрытие датасета внутри Custom Process #1702

Closed
gsbelarus opened this issue Jun 30, 2015 · 5 comments

Comments

@gsbelarus
Copy link
Member

Originally reported on Google Code with ID 1702

Имеем такой код:

sub TgdcAttrUserDefinedUSR_WG_WORKS_REFRIGERATORDoAfterCustomProcess(Self,   
  ...

  if Assigned(Self.MasterSource) then
    if Assigned(Self.MasterSource.Dataset) then
      Self.MasterSource.Dataset.Refresh
    end if
  end if

end sub

Но, Refresh делает следующее:

procedure TDataSet.Refresh;
begin
  DoBeforeRefresh;
  CheckBrowseMode;
  UpdateCursorPos;
  try
    InternalRefresh;
  finally
    Resync([]);
    DoAfterRefresh;
  end;
end;

Resync([]) -- переоткроет все связанные датасеты. В том числе и текущий наш
датасет, у которого мы перекрыли DoAfterCustomProcess...

Такой код работать не будет в общем случае. Иногда, при стечении
обстоятельств -- может быть. Но, в общем случае -- нет.

Смотрите что происходит (в скобках состояние детального датасета):

1. Открыли мастер, открыли дитэйл.
2. Дитэйл в Insert (dsInsert).
3. Делаем Пост (dsInsert).
  4. Вызывается InternalPost (dsInsert).
  5. Вызывается кастом процесс (dsInsert).
  6. Вызывается перекрытый обработчик (dsInsert).
  7. В перекрытом обработчике вызывается Refresh мастера.
  8. Рефреш мастера переоткрывает наш детальный датасет (dsInactive -
dsBrowse). И, в общем случае, может вообще открыть его НЕ НА ТОЙ ЗАПИСИ,
где мы были!
  9. Возвращаемся в кастом процесс (dsBrowse, а должно быть dsInsert!)
10. Возвращаемся в POst (dsBrowse, а должно быть dsInsert).

Как должно было быть? Для этого надо понять зачем там вообще этот рефреш?
ведь у нас и так рефреш проходит при посте записи. Может быть от этого
детального датасета зависят некоторые поля в мастере? Все равно, даже в
этом случае, рефреш следует запускать из DoAfterPost, а никак не в касто
процессе.

Я могу заблокировать операции, которые разрывают кастом процесс. Но,
перестанет выполнятся код. Надо будет править настройки!

С другой стороны, оставлять как есть нельзя. Так как это грубейшая ошибка.


Reported by gs1994 on 2009-11-05 18:46:25

@gsbelarus
Copy link
Member Author

>Я могу заблокировать операции, которые разрывают кастом процесс. Но,
перестанет выполнятся код. Надо будет править настройки!

Тогда Вы можете сделать для начала, чтобы выдавалось предупреждающее 
сообщение "Нельзя вызывать Рефреш в ДуАфтеКастомПроцесс". Будет видно, где он есть,

но это не остановит работу... А через некоторое время можно заблокировать.

Reported by alexandra.gsoftware on 2009-11-05 19:08:47

@gsbelarus
Copy link
Member Author

Я завтра посмотрю, зачем в 
TgdcAttrUserDefinedUSR_WG_WORKS_REFRIGERATORDoAfterCustomProcess
было такое сделано и поправлю.

Reported by Alexander.GoldenSoft on 2009-11-05 21:02:42

@gsbelarus
Copy link
Member Author

PS: выявлено при рассмотрении ошибки, возникающей у Ю. Там происходило следующее:

там ситуация следующая:

1) добавляется запись в мастер
2) в диалоговом окне есть дитэйл, связанный с мастером
3) из диалогового окна добавляется запись в дитэйл и сохраняется
  4) на кастом обработчике идет Рефреш мастеру
  5) Рефреш переоткрывает мастер и переоткрывает дитэйл
  6) Завершается кастом процесс дитэйла
  7) Завершается Пост процесс дитэйла

если на мастер дата сет не было наложено условие фильтрации, то 
после переоткрытия мы попадали на ту же запись в мастере и, поскольку
в дитэйле, была только одна запись -- на ту же запись в дитэйле.

но, если на мастер устанавливалась фильтрация, то после переоткрытия мы могли
попасть уже на другую запись в мастере и, соответственно, на другую запись в 
дитэйле. Шаги 6 и 7 в этом случае уже выполнются ДЛЯ ДРУГОЙ записи, что и 
приводило к ошибке.

PS: к похожим последствиям может просто привести Рефреш мастер записи
в сложном диалоговом окне, где есть детальные наборы данных.

Reported by gs1994 on 2009-11-06 13:00:46

@gsbelarus
Copy link
Member Author

В настройке я поправил...

Reported by Alexander.GoldenSoft on 2009-11-09 12:18:48

@gsbelarus
Copy link
Member Author

Будем выдавать предупреждение на экран.

Reported by gs1994 on 2010-10-09 16:34:53

  • Status changed: Fixed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant