Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2017, 20:10   #1
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
Восклицание Проблема с удалением строки в 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 Кб, 135 просмотров)
Тип файла: png 2.png (48.2 Кб, 93 просмотров)
Тип файла: png 3.png (55.4 Кб, 93 просмотров)
Тип файла: png 4.png (16.4 Кб, 94 просмотров)
artems67 вне форума Ответить с цитированием
Старый 16.11.2017, 21:05   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Ну например...
Код:
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 в 21:07.
kropotkina-alice вне форума Ответить с цитированием
Старый 16.11.2017, 22:32   #3
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

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

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

Насчет нескольких машин Вы правы, но я показывал черновой вариант преподавателю. Его устроил этот вариант. Думаю усложнять не стоит, пусть будет 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 Кб, 83 просмотров)
Тип файла: png tickets.png (5.4 Кб, 92 просмотров)
artems67 вне форума Ответить с цитированием
Старый 16.11.2017, 23:37   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Меняем строку
Код:
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, 10:53   #7
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Спасибо, теперь удаляет и водителя и его штрафы. Но загвоздка в том, что если в этот момент открыто окно с таблицей штрафов, то таблица штрафов не обновляется. Можно как-то реализовать,чтобы окно со штрафами обновлялось без необходимости открывать/закрывать форму ? Удаление записей в 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, 11:07   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Можно как-то реализовать,чтобы окно со штрафами обновлялось без необходимости открывать/закрывать форму ?
закрыть/открыть соответствующий НД.
Код:
frm.query.CLose;
frm.Query.Open;
frm.Query.Locate(...);
Код:
DBgrid.DataSource.DataSet.Close|Open
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.11.2017, 11:54   #9
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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