Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 16.11.2017, 21:10   #1
artems67
Форумчанин
 
Регистрация: 17.11.2015
Адрес: Смоленск
Сообщений: 54
Репутация: 10
Восклицание Проблема с удалением строки в BDGrid

Добрый вечер,

Делаю учебную программу - Учет нарушений ПДД. БД основана на 2-х таблицах Paradox7 drivers.db и tickets.db (водители и штрафы), который привязаны к Alias PDD.

Таблицы вызываются по нажатию кнопок на toolbar в отдельных окнах.

1 окно для drivers.db реализовано через TTable, TDataSource, TDBGrid и TDBNagiator

2 окно для tickets.db с помощью компонентов TQuery, TDataSource, TDBGrid

Во 2 таблице есть поле Marker которое связано с id водителя по полю Car (номер машины) из Таблицы 1:

TQuery

Код:

select
   tickets.id AS Id,
   drivers.Car AS CarMarker,
   tickets.Name AS Name,
   tickets.Timer AS Timer,
   tickets.Data AS Data,
   tickets.Cena AS Cena
 

from tickets left join drivers on drivers.id=tickets.Marker

Суть в том, что я хочу реализовать следующие. При вводе номера машины Edit1 и нажатия Button1 удалялся её владелец из 1 таблицы. И чтобы во 2 таблицы также удалялись все штрафы.

Я реализовал только поиск по номеру машины и удаления её владельца. А вот во второй таблице штрафы остаются. Но поле CarMarker становится пустым.

Я пытался реализовать, через sql запросы чтобы при открытии таблицы tickets все записи с пустыми CarMarker просто удалялись из таблицы, но что-то не получается.

Нужна помощь и совет, по реализации этого фрагмента.

Кнопка удаления водителя из drivers.db

Код:

procedure TfrmTableView.Button1Click(Sender: TObject);
begin
if not tbView.Locate('Car',eSelect.Text,[]) then
    ShowMessage('Запись не найдена')
  else
 tbView.Delete;
end;

Изображения
Тип файла: png 1.png (52.2 Кб, 0 просмотров)
Тип файла: png 2.png (48.2 Кб, 26 просмотров)
Тип файла: png 3.png (55.4 Кб, 26 просмотров)
Тип файла: png 4.png (16.4 Кб, 26 просмотров)
artems67 вне форума   Ответить с цитированием
Старый 16.11.2017, 22:05   #2
kropotkina-alice
Участник клуба
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Адрес: в России
Сообщений: 596
Репутация: 588
По умолчанию

Ну например...
Код:

tmp:=TableDriversId.Value;
Query.SQL.Text:='delete from drivers where id='+IntToStr(tmp);
Query.ExecSQL;
Query.SQL.Text:='delete from tickets where id='+IntToStr(tmp);
Query.ExecSQL;

Вы литературу по БД из религиозных соображений читать не желаете?
Ну тогда хотя бы примеры в дельфийском хэлпе посмотрите - это не больно...

Последний раз редактировалось kropotkina-alice; 16.11.2017 в 22:07.
kropotkina-alice вне форума   Ответить с цитированием
Старый 16.11.2017, 23:32   #3
artems67
Форумчанин
 
Регистрация: 17.11.2015
Адрес: Смоленск
Сообщений: 54
Репутация: 10
По умолчанию

Я немного не так насчет полей ещё сказал. У меня есть поле Marker в таблице tickets. а Marker у меня это id водителя в таблице. То есть мне надо по номеру машины (поле Car) удалить запись её владельца, а так же удалить все штрафы, где в поле Marker встречается id водителя.
artems67 вне форума   Ответить с цитированием
Старый 16.11.2017, 23:51   #4
kropotkina-alice
Участник клуба
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Адрес: в России
Сообщений: 596
Репутация: 588
По умолчанию

Цитата:
У меня есть поле Marker в таблице tickets. а Marker у меня это id водителя в таблице
Ничего не понятно...
Вы лучше приведите структуру обеих таблиц и что какое поле содержит.
Кстати, у одного человека может быть несколько машин. И вы будете несколько раз вносить "Иванов Иван Иваныч"? С разными "ID"?
Нужна отдельная таблица номеров машин...
kropotkina-alice вне форума   Ответить с цитированием
Старый 17.11.2017, 00:15   #5
artems67
Форумчанин
 
Регистрация: 17.11.2015
Адрес: Смоленск
Сообщений: 54
Репутация: 10
По умолчанию

Насчет нескольких машин Вы правы, но я показывал черновой вариант преподавателю. Его устроил этот вариант. Думаю усложнять не стоит, пусть будет 1 машина - 1 человек.

Структура моих таблиц

drivers.db
1)id
2)Fio - Фамилия имя отчество водителя
3)Car - Номер машины

tickets.db
1)id
2)Marker - id водителя
3)Name - описание нарушения
4)Timer - время нарушения
5)Data - Дата нарушения
6)Cena - Стоимость штрафа
Изображения
Тип файла: png drivers.png (4.1 Кб, 24 просмотров)
Тип файла: png tickets.png (5.4 Кб, 24 просмотров)
artems67 вне форума   Ответить с цитированием
Старый 17.11.2017, 00:37   #6
kropotkina-alice
Участник клуба
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Адрес: в России
Сообщений: 596
Репутация: 588
По умолчанию

Меняем строку
Код:

Query.SQL.Text:='delete from tickets where id='+IntToStr(tmp);

на
Код:

Query.SQL.Text:='delete from tickets where marker='+IntToStr(tmp);

И все...
kropotkina-alice вне форума   Ответить с цитированием
Старый 17.11.2017, 11:53   #7
artems67
Форумчанин
 
Регистрация: 17.11.2015
Адрес: Смоленск
Сообщений: 54
Репутация: 10
По умолчанию

Спасибо, теперь удаляет и водителя и его штрафы. Но загвоздка в том, что если в этот момент открыто окно с таблицей штрафов, то таблица штрафов не обновляется. Можно как-то реализовать,чтобы окно со штрафами обновлялось без необходимости открывать/закрывать форму ? Удаление записей в drivers.db и tickets.db реализовано при нажатии одной кнопки из формы таблицы drivers

Код:

procedure TfrmTableView.Button1Click(Sender: TObject);
var tmp:integer; frm:TfrmTickets;
begin
if not tbView.Locate('Car',eSelect.Text,[]) then
    ShowMessage('Запись не найдена')
  else
    begin
      tmp:=tbView.FieldByName('Id').AsInteger;
      frm:=TfrmTickets.Create(self);
      frm.Query.Open;
      frm.Query.SQL.Text:='delete from tickets where marker='+IntToStr(tmp);
      frm.Query.ExecSQL;
      frm.Query.Close;
      tbView.Delete;
    end;  
end;

artems67 вне форума   Ответить с цитированием
Старый 17.11.2017, 12:07   #8
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,682
Репутация: 2097
По умолчанию

Цитата:
Можно как-то реализовать,чтобы окно со штрафами обновлялось без необходимости открывать/закрывать форму ?
закрыть/открыть соответствующий НД.
Код:

frm.query.CLose;
frm.Query.Open;
frm.Query.Locate(...);

Код:

DBgrid.DataSource.DataSet.Close|Open

__________________
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума   Ответить с цитированием
Старый 17.11.2017, 12:54   #9
kropotkina-alice
Участник клуба
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Адрес: в России
Сообщений: 596
Репутация: 588
По умолчанию

Цитата:
таблица штрафов не обновляется
А вы используйте для удаления записей тот самый Query, который привязан к таблице штрафов.
Тогда вам просто придется восстанавливать его запрос SQL, закрывать и открывать его (как вам уже посоветовали)...
Вот и получится все
kropotkina-alice вне форума   Ответить с цитированием
Старый 17.11.2017, 13:08   #10
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,874
Репутация: 6285
По умолчанию

Тот самый - хороший способ разнообразить спектр ошибок ))
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с удалением дубликатов strannick Microsoft Office Excel 19 28.09.2013 18:08
проблемы с удалением строки в таблице retede JavaScript, Ajax 2 15.01.2010 13:57
Проблема с удалением файлов. Dj_smart Общие вопросы Delphi 4 22.03.2008 13:32
как из одной BDgrid скопировать выделенное поле в другую BDgrid Шурик БД в Delphi 7 03.05.2007 14:24


04:39.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru