Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Удаление выделенной строки из DBGrig через DataSet


Автор: FOLGA 19.4.2010, 08:46
Всем здравствуйте!
Вопрос следующего характера: нужно из DBGrid`а удалить выделенную строку. Где-то прочитала, что для этого достаточно поставить в Options DBGrid`а dgRowSelected в true и прописать код:
Код

procedure TForm3.Button2Click(Sender: TObject);

begin
if not DBGrid1.DataSource.DataSet.Eof then
DBGrid1.DataSource.DataSet.Delete;
end;

Но почему-то это не работает, он удаляет все записи из таблицы. Не подскажете, чего не хвататет?

Автор: former 19.4.2010, 09:22
Цитата(FOLGA @  19.4.2010,  08:46 Найти цитируемый пост)
Но почему-то это не работает, он удаляет все записи из таблицы. Не подскажете, чего не хвататет? 

FOLGA, ну правильно.
Код

procedure TForm3.Button2Click(Sender: TObject);
begin
  DataSet.Delete;
end;

Автор: Данкинг 19.4.2010, 09:38
former, а чем "if not DBGrid1.DataSource.DataSet.Eof"-то мешает? Видимо, торможу. smile 

Автор: former 19.4.2010, 10:13
Цитата(Данкинг @  19.4.2010,  09:38 Найти цитируемый пост)
а чем "if not DBGrid1.DataSource.DataSet.Eof"-то мешает?

Данкинг, не-е-е, это видимо я торможу.  smile признак отсутствия записей в наборе данных.

Автор: casinosoftguru 19.4.2010, 10:53
еще можно DataController.DeleteFocused

Автор: former 19.4.2010, 11:38
Цитата(casinosoftguru @  19.4.2010,  10:53 Найти цитируемый пост)
еще можно DataController.DeleteFocused 

smile Где у стандартного DBGrid-а такое свойство (DataController).  Не надо путать с cxGrid.

Автор: Deniz 19.4.2010, 11:48
Цитата(casinosoftguru @  19.4.2010,  12:53 Найти цитируемый пост)
еще можно DataController.DeleteFocused
а это еще из какой оперы?

Автор: FOLGA 19.4.2010, 13:43
Ну так что же мне делать-то? Причем при нажатии кнопки все работает нормально, а при повторном открытии приложения база "пустеет"... smile 

Автор: Frees 19.4.2010, 13:45
какие компоненты доступа используешь?

Автор: FOLGA 19.4.2010, 13:54
Frees,  IBdataBase, IBDataSet, IBDataSource, IBDataTransaction, база FireBird 2.1

Автор: Данкинг 19.4.2010, 13:59
FOLGA, если FB, то удаляй запросом лучше. Он ИМХО всё же лучше под запросы заточен.

Добавлено через 45 секунд
Цитата(former @  19.4.2010,  11:13 Найти цитируемый пост)
признак отсутствия записей в наборе данных. 

Ну так из-за этого же вся таблица точно удаляться не будет. smile 

Автор: FOLGA 19.4.2010, 14:03
Цитата(Данкинг @ 19.4.2010,  13:59)
FOLGA, если FB, то удаляй запросом лучше. Он ИМХО всё же лучше под запросы заточен.

А это как? (теперь можете долго кричать и ругаться)

Автор: Данкинг 19.4.2010, 14:13
Цитата(FOLGA @  19.4.2010,  15:03 Найти цитируемый пост)
А это как? 

Это через IbQuery, только в таблице необходимо уникальное поле для условия запроса (where...)
Цитата(FOLGA @  19.4.2010,  15:03 Найти цитируемый пост)
теперь можете долго кричать и ругаться

Прочитай любую книгу по работе с БД (необязательно FB). Суть работы запросов везде одинакова. Да и на форуме примеров масса. smile

Добавлено через 1 минуту и 6 секунд
Да и в любом случае метод Dataset.Delete не должен очищать всю таблицу. Он или удаляет активную запись, или же вообще не работает. smile 

Автор: Frees 19.4.2010, 14:24
TIBDataSet говоришь, а что у тебя в нем в DeleteSql написано? сдается мне что там условия нет...

Добавлено через 3 минуты и 51 секунду
Цитата(Данкинг @  19.4.2010,  17:13 Найти цитируемый пост)
Да и в любом случае метод Dataset.Delete не должен очищать всю таблицу. Он или удаляет активную запись, или же вообще не работает. smile 

это зависит от того какой запрос на удаление написан

Автор: Данкинг 19.4.2010, 14:34
Цитата(Frees @  19.4.2010,  15:24 Найти цитируемый пост)
это зависит от того какой запрос на удаление написан 

Возможно, я просто с FB обычно использую IbQuery и всё. Зачем там датасеты всякие?

Автор: Frees 19.4.2010, 14:40
Цитата(Данкинг @  19.4.2010,  17:34 Найти цитируемый пост)
Зачем там датасеты всякие?

ну я вообщето на фибах их использую, но если они аналогичны, то все запросы Update insert delet select в одном объекте и операции с набором данных становится проще, и можно использовать ДБ аваре компоненты

Автор: former 19.4.2010, 14:44
Скорее всего в запросе на удаление косяк. Наверняка отсутствует условие where.

Автор: Данкинг 19.4.2010, 15:01
В общем, код в студию. Без него причина косяка понятна не будет.

Автор: FOLGA 19.4.2010, 15:03
Frees,  да, там его и правда не было... дописала вот так:
Код

delete from driver where tab_no = DBGrid1.DataSource.DataSet.Fields[0].AsString;

выдает ошибку выполнения арифметической операции...

Автор: Данкинг 19.4.2010, 15:09
Во-первых, слово "driver" нигде не зарезервировано?
Во-вторых (начинаю ругаться): млин, в натуре, почему нельзя запросы писать непосредственно в коде, а не в свойствах компонентов? smile

Добавлено через 25 секунд
Java на вас нет. smile

Автор: former 19.4.2010, 15:20
Запрос должен быть таким:
Код

DELETE FROM DRIVER WHERE TAB_NO = :OLD_TAB_NO

(Проверь driver)
А дальше читай про работу с параметрами запроса.
Цитата(Данкинг @  19.4.2010,  15:09 Найти цитируемый пост)
Во-вторых (начинаю ругаться): млин, в натуре, почему нельзя запросы писать непосредственно в коде, а не в свойствах компонентов? 

Данкинг, много разных за и против.

Автор: FOLGA 19.4.2010, 15:26
Цитата(former @ 19.4.2010,  15:20)
Запрос должен быть таким:
Код

DELETE FROM DRIVER WHERE TAB_NO = :OLD_TAB_NO


Вот так заработало. Спасибо!!! smile 

Автор: Данкинг 19.4.2010, 16:08
"За" и "против" - это понятно, только чем больше ручной работы, тем лучше понимаешь сам процесс. smile 

Автор: former 19.4.2010, 17:52
Цитата(Данкинг @  19.4.2010,  16:08 Найти цитируемый пост)
чем больше ручной работы, тем лучше понимаешь сам процесс.

Что бы лучше понимать процесс, нужно книжки, мануалы и статьи читать, пользоваться DRKB и поиском по форуму. smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)