Перевод dataset в режим редактирования

Перевод 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). Как его отключил — все глюки исчезли.
Вот что значит использовать компоненты сторонних производителей.

Источник

Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Uchenik.top - научные работы и подготовка
0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии