Перевод dataset в режим редактирования
Есть TDataSet, переводим его в режим редактирования (или добавляем записи), что-то делаем. Вопрос: если при этом (до DataSet.Post) произойдет исключение — вернет ли VCL этот (эти, если их несколько) DataSet в режим просмотра (выполнением DataSet.Cancel, например) или необходимо самому об этом позаботиться?
PS: проверить конечно можно, но вдруг не так эксперимент поставлю.
← →
MsGuns ( 2003-06-13 16:27 ) [1]
Смотря что используется под TDataSet. Если локалка (типа дибэйса) и компонента типа TTable, то НД остается в состоянии, которое было ДО попытки его изменения. Если КССУБД, то там понятие «датасет» достаточно виртуально и физ.таблица для клиента в принципе не может находиться в состоянии Inserted или Modified
← →
Sandman25 ( 2003-06-13 17:08 ) [2]
Когда в DBNavigator»е Вы нажимаете кнопку редактирования, то Dataset переходит в состояние dsEdit, и может неограниченно долго находиться в таком состоянии, пока пользователь не нажмет на сохранение, отмену, или проскроллирует запись. При этом может возникать любое число исключений (StrToInt, 1/0 и т.д.), но они к Dataset не относятся, и он о них даже не знает.
← →
MsGuns ( 2003-06-13 17:18 ) [3]
>Sandman25 © (13.06.03 17:08)
>При этом может возникать любое число исключений (StrToInt, 1/0 и т.д.), но они к Dataset не относятся, и он о них даже не знает.
Заявление слишком смелое, я бы даже сказал, что несколько авантюрное ;)).
← →
MsGuns ( 2003-06-13 17:22 ) [4]
>Sandman25 © (13.06.03 17:08)
>При этом может возникать любое число исключений (StrToInt, 1/0 и т.д.), но они к Dataset не относятся, и он о них даже не знает.
Заявление относительно исключений, возникающих в рез-те попыток внесения изменений в НД, слишком смелое, я бы даже сказал, что несколько авантюрное ;)). О подобных ситеувинах «датасеты» не только знают, но они как бы и являются инициаторами их возникновения. Точнее, не они сами, а их «внутренности», а именно реализация методов типа Insert, Delete, Post и т.д.
MsGuns © (13.06.03 17:18)
Можете опровергнуть — пожалуйста, прошу. Мне и самому интересно, правомерно ли то, что я написал 🙂
← →
MsGuns ( 2003-06-13 19:09 ) [6]
>Sandman25 © (13.06.03 17:23)
Я не опровергаю, а только лишь вношу поправку, оспаривая КАТЕГОРИЧНОСТЬ, НО НЕ СУТЬ Вашего заявления ;))
Очень многое, действительно, зависит от КОНКРЕТНЫХ СРЕДСТВ доступа и ФОРМАТА базы данных. В частности, если используется Парадокс/дибэйз + компоненты BDE, то инициатором исключений является собственно ядро BDE, которое вызывается в соотв. методе компонента (например, TTable)
Если используется КССУБД, то «к телу», т.е. к физ. таблицам не допускается никто — с ними работает только сервер, причем ТОЛЬКО В КОНТЕКСТЕ ТРАНЗАКЦИЙ. Т.е. ситуация, когда таблица «не доредактировалась» и система ждет решения клиента, не возможна в принципе.
← →
Anatoly Podgoretsky ( 2003-06-13 19:31 ) [7]
Sandman25 © (13.06.03 17:23)
ПРавомерно, если речь идет не об исключении в Dataset и связанных компонентах.
← →
KSergey ( 2003-06-20 14:30 ) [8]
Эта, что-то я отвлекся 😉
А еще раз для меня можно: т.е. как я понял, в общем случае нельзя утверждать, что в случае возникновения какого-либо исключения все DataSet выйдут из режима dsEdit? т.е. неплохо бы позаботиться об этом и самому?
← →
Johnmen ( 2003-06-20 14:45 ) [9]
Обязательно заботиться . Это общий принцип.
Перевод dataset в режим редактирования
На форме DBGrid и DBNavigator.
Данные в dSetMain грузятся из файла:
if FileExists(FileName) then begin
dSetMain.FileName := FileName;
dSetMain.LoadFromFile(FileName)
end else begin
dSetMain.EmptyDataSet;
dSetMain.SaveToFile(FileName, dfBinary);
end;
dSetMain.Open;
Если файл отсутствует и создается пустой набор — все работает, навигатором могу добавлять записи, править и т.д.
Если же данные читаются из файла, dSetMain переходит в режим dsBrouse и никакими силами в режим правки не перевести.
Пробовал принудительно в разных сочетаниях:
TexPassData.dSetMain.Append;
TexPassData.dSetMain.Insert;
TexPassData.dSetMain.Edit;
— никакого толку.
Что я делаю(или не делаю) неправильно.
← →
Сергей М. © ( 2010-03-29 15:44 ) [1]
> Если файл отсутствует и создается пустой набор
Что-то не видать в твоем коде создания пустого набора
← →
Чайник © ( 2010-03-29 15:52 ) [2]
> Что-то не видать в твоем коде создания пустого набора
А зачем, если грузится из файла?
P.S. Попробовал вставить:
if FileExists(FileName) then begin
dSetMain.FileName := FileName;
dSetMain.CreateDataSet;
dSetMain.LoadFromFile(FileName)
end else begin.
— те же яйца, только в профиль.
вот это в первом лишнее
> dSetMain.FileName := FileName;
а вот это странное
> dSetMain.EmptyDataSet;
получается сначала чистим а после сохраняем.
> dSetMain.Open;
тоже тогда не нужен.
← →
Чайник © ( 2010-03-29 16:33 ) [4]
> вот это в первом лишнее> dSetMain.FileName := FileName;
Это действительно лишнее.
> а вот это странное> dSetMain.EmptyDataSet;получается сначала
> чистим а после сохраняем.
Просто надо застолбить файл хотя бы пустым набором.
> Просто надо застолбить файл хотя бы пустым набором.
зачем?
если
if FileExists(FileName) then
dSetMain.LoadFromFile(FileName)
else begin
dSetMain.CreateDataSet;
когда он будет использоваться, этот пустой набор?
← →
Чайник © ( 2010-03-29 17:04 ) [6]
> когда он будет использоваться, этот пустой набор?
В другом месте по существованию файла проверяются настройки.
Кстати, программным образом доступ к телу работает:
TexPassData.dSetMain.Append;
TexPassData.dSetMain.FieldByName(«idParent»).AsInteger := 1;
TexPassData.dSetMain.FieldByName(«KindPassport»).AsInteger := 1;
TexPassData.dSetMain.FieldByName(«Title»).AsString := «Title»;
TexPassData.dSetMain.Post;
И удаление записей тоже работает.
Может все дело в DBGrid или DBNavigator ?
← →
Сергей М. © ( 2010-03-29 17:19 ) [7]
> Чайник © (29.03.10 15:52) [2]
> А зачем, если грузится из файла?
Какой нафих файл, если его нет ?
А если он есть, но тогда нафих CreateDataSet и тем более EmptyDataSet ?
← →
Чайник © ( 2010-03-29 17:37 ) [8]
> Какой нафих файл, если его нет ?А если он есть, но тогда
> нафих CreateDataSet и тем более EmptyDataSet ?
ну нужен, нужен мне файл с нужным именем в нужном месте.
Я не об этом спрашиваю!
← →
Сергей М. © ( 2010-03-29 17:41 ) [9]
Ну если явное программное обращение работает, то разглядывай внимательно грид, навигатор, дейтасурс и пр. — что-то в них не так
> Ну если явное программное обращение работает, то разглядывай
> внимательно грид, навигатор, дейтасурс и пр. — что-то в
> них не так
С утра разглядываю, на мыло изошел, ничё понять не могу!
← →
Сергей М. © ( 2010-03-29 18:05 ) [11]
Ну и что говорит дейтасет при попытке перевести его в режим редактирования при посредничестве, например, навигатора ?
← →
Чайник © ( 2010-03-29 19:56 ) [12]
> Ну и что говорит дейтасет при попытке перевести его в режим
> редактирования при посредничестве, например, навигатора
> ?
Прошу прощения, сразу не ответил — пришлось отвлечься.
дата сет ничего не говорит — просто не переходит.
Смотрю исходники DBNavigator — нажатие кнопок вызывает те же методы датасета Insert, Edit и т.п. :
procedure TDBNavigator.BtnClick(Index: TNavigateBtn);
begin
if (DataSource <> nil) and (DataSource.State <> dsInactive) then
begin
if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then
FBeforeAction(Self, Index);
with DataSource.DataSet do
begin
case Index of
nbPrior: Prior;
nbNext: Next;
nbFirst: First;
nbLast: Last;
nbInsert: Insert;
nbEdit: Edit;
nbCancel: Cancel;
nbPost: Post;
nbRefresh: Refresh;
nbDelete:
if not FConfirmDelete or
(MessageDlg(SDeleteRecordQuestion, mtConfirmation,
mbOKCancel, 0) <> idCancel) then Delete;
end;
end;
end;
if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then
FOnNavClick(Self, Index);
end;
И почему это не работает?
> И почему это не работает?
с чего взял? у меня работает. вот сделай пример, все, что здесь говорил, в новом проекте. и ничего больше.
← →
dik59 ( 2010-03-29 21:03 ) [14]
Извите, что вклиниваюсь, по дискуссии похоже, что навигатор с датасетом НЕ СВЯЗАН.
> Извите, что вклиниваюсь, по дискуссии похоже, что навигатор
> с датасетом НЕ СВЯЗАН.
Связан, связан. Я же говорю — когда датасет не грузится из файла, а создается dSetMain.CreateDataSet — все работает.
← →
Чайник © ( 2010-03-29 23:19 ) [16]
> sniknik © (29.03.10 20:06) [13].
> вот сделай пример, все, что здесь говорил, в новом проекте.
> и ничего больше.
Спасибо за дельный совет!
Действительно, в новом проекте все заработало.
Кажется разобрался, точнее не разобрался, а нашел болевую точку — у меня на другой форме с этим датасетом связан DBTreeView (который Dynamic DBTreeView). Как его отключил — все глюки исчезли.
Вот что значит использовать компоненты сторонних производителей.
Перевод dataset в режим редактирования
На форме DBGrid и DBNavigator.
Данные в dSetMain грузятся из файла:
if FileExists(FileName) then begin
dSetMain.FileName := FileName;
dSetMain.LoadFromFile(FileName)
end else begin
dSetMain.EmptyDataSet;
dSetMain.SaveToFile(FileName, dfBinary);
end;
dSetMain.Open;
Если файл отсутствует и создается пустой набор — все работает, навигатором могу добавлять записи, править и т.д.
Если же данные читаются из файла, dSetMain переходит в режим dsBrouse и никакими силами в режим правки не перевести.
Пробовал принудительно в разных сочетаниях:
TexPassData.dSetMain.Append;
TexPassData.dSetMain.Insert;
TexPassData.dSetMain.Edit;
— никакого толку.
Что я делаю(или не делаю) неправильно.
← →
Сергей М. © ( 2010-03-29 15:44 ) [1]
> Если файл отсутствует и создается пустой набор
Что-то не видать в твоем коде создания пустого набора
← →
Чайник © ( 2010-03-29 15:52 ) [2]
> Что-то не видать в твоем коде создания пустого набора
А зачем, если грузится из файла?
P.S. Попробовал вставить:
if FileExists(FileName) then begin
dSetMain.FileName := FileName;
dSetMain.CreateDataSet;
dSetMain.LoadFromFile(FileName)
end else begin.
— те же яйца, только в профиль.
вот это в первом лишнее
> dSetMain.FileName := FileName;
а вот это странное
> dSetMain.EmptyDataSet;
получается сначала чистим а после сохраняем.
> dSetMain.Open;
тоже тогда не нужен.
← →
Чайник © ( 2010-03-29 16:33 ) [4]
> вот это в первом лишнее> dSetMain.FileName := FileName;
Это действительно лишнее.
> а вот это странное> dSetMain.EmptyDataSet;получается сначала
> чистим а после сохраняем.
Просто надо застолбить файл хотя бы пустым набором.
> Просто надо застолбить файл хотя бы пустым набором.
зачем?
если
if FileExists(FileName) then
dSetMain.LoadFromFile(FileName)
else begin
dSetMain.CreateDataSet;
когда он будет использоваться, этот пустой набор?
← →
Чайник © ( 2010-03-29 17:04 ) [6]
> когда он будет использоваться, этот пустой набор?
В другом месте по существованию файла проверяются настройки.
Кстати, программным образом доступ к телу работает:
TexPassData.dSetMain.Append;
TexPassData.dSetMain.FieldByName(«idParent»).AsInteger := 1;
TexPassData.dSetMain.FieldByName(«KindPassport»).AsInteger := 1;
TexPassData.dSetMain.FieldByName(«Title»).AsString := «Title»;
TexPassData.dSetMain.Post;
И удаление записей тоже работает.
Может все дело в DBGrid или DBNavigator ?
← →
Сергей М. © ( 2010-03-29 17:19 ) [7]
> Чайник © (29.03.10 15:52) [2]
> А зачем, если грузится из файла?
Какой нафих файл, если его нет ?
А если он есть, но тогда нафих CreateDataSet и тем более EmptyDataSet ?
← →
Чайник © ( 2010-03-29 17:37 ) [8]
> Какой нафих файл, если его нет ?А если он есть, но тогда
> нафих CreateDataSet и тем более EmptyDataSet ?
ну нужен, нужен мне файл с нужным именем в нужном месте.
Я не об этом спрашиваю!
← →
Сергей М. © ( 2010-03-29 17:41 ) [9]
Ну если явное программное обращение работает, то разглядывай внимательно грид, навигатор, дейтасурс и пр. — что-то в них не так
> Ну если явное программное обращение работает, то разглядывай
> внимательно грид, навигатор, дейтасурс и пр. — что-то в
> них не так
С утра разглядываю, на мыло изошел, ничё понять не могу!
← →
Сергей М. © ( 2010-03-29 18:05 ) [11]
Ну и что говорит дейтасет при попытке перевести его в режим редактирования при посредничестве, например, навигатора ?
← →
Чайник © ( 2010-03-29 19:56 ) [12]
> Ну и что говорит дейтасет при попытке перевести его в режим
> редактирования при посредничестве, например, навигатора
> ?
Прошу прощения, сразу не ответил — пришлось отвлечься.
дата сет ничего не говорит — просто не переходит.
Смотрю исходники DBNavigator — нажатие кнопок вызывает те же методы датасета Insert, Edit и т.п. :
procedure TDBNavigator.BtnClick(Index: TNavigateBtn);
begin
if (DataSource <> nil) and (DataSource.State <> dsInactive) then
begin
if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then
FBeforeAction(Self, Index);
with DataSource.DataSet do
begin
case Index of
nbPrior: Prior;
nbNext: Next;
nbFirst: First;
nbLast: Last;
nbInsert: Insert;
nbEdit: Edit;
nbCancel: Cancel;
nbPost: Post;
nbRefresh: Refresh;
nbDelete:
if not FConfirmDelete or
(MessageDlg(SDeleteRecordQuestion, mtConfirmation,
mbOKCancel, 0) <> idCancel) then Delete;
end;
end;
end;
if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then
FOnNavClick(Self, Index);
end;
И почему это не работает?
> И почему это не работает?
с чего взял? у меня работает. вот сделай пример, все, что здесь говорил, в новом проекте. и ничего больше.
← →
dik59 ( 2010-03-29 21:03 ) [14]
Извите, что вклиниваюсь, по дискуссии похоже, что навигатор с датасетом НЕ СВЯЗАН.
> Извите, что вклиниваюсь, по дискуссии похоже, что навигатор
> с датасетом НЕ СВЯЗАН.
Связан, связан. Я же говорю — когда датасет не грузится из файла, а создается dSetMain.CreateDataSet — все работает.
← →
Чайник © ( 2010-03-29 23:19 ) [16]
> sniknik © (29.03.10 20:06) [13].
> вот сделай пример, все, что здесь говорил, в новом проекте.
> и ничего больше.
Спасибо за дельный совет!
Действительно, в новом проекте все заработало.
Кажется разобрался, точнее не разобрался, а нашел болевую точку — у меня на другой форме с этим датасетом связан DBTreeView (который Dynamic DBTreeView). Как его отключил — все глюки исчезли.
Вот что значит использовать компоненты сторонних производителей.