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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2020, 15:13   #1
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию Дельфи ADOQuery.Delete

При помощи метода ADOQuery.Delete пытаюсь удалить запись из таблицы на которую ссылаются из другой таблицы.
Код:
...
DataModule2.ADOQuery3.Delete;
...
Естественно выскакивает ошибка:
Конфликт инструкции DELETE с ограничением REFERENCE..

Как просто при таком случае добавить проверку и вывести в самой дельфи пользовательское сообщение что на него ссылаются и удаление невозможно?
goto ∞ вне форума Ответить с цитированием
Старый 26.04.2020, 16:59   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

вар.1
Код:
ADOQtest.SQL.Text:='...';
 select ... 
from <таблица где ссылки> 
where <поле ссылки> = <проверяемое значение ссылки>

ADOQtest.open;
if ADOQtest.IsEmpty then ShowMessage('можно удалять');
вар.2
Код:
select count(*) from .. where ... //см.выше.
n:=ADOQtest.fields.field[0].Asinteger;
if n=0 then ...
вар.3
Код:
select tname, q 
from ( select 'x1' as tname, count(*) as q from <первая таблица с сылками> where ...
union select 'z2', count(*) from <другая таблица с сылками> where...
      ) as qq
where qq.q>0 

tt:=adoqtest.fieldbyname('tname');
if not aqoqtest.isempty then showmessage(tt.asstring+'имеет действующие ссылки ');
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.04.2020 в 17:11.
evg_m вне форума Ответить с цитированием
Старый 26.04.2020, 17:26   #3
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

[QUOTE=evg_m;1813857]вар.1
Код:
ADOQtest.SQL.Text:='...';
 select ... 
from <таблица где ссылки> 
where <поле ссылки> = <проверяемое значение ссылки>

ADOQtest.open;
if ADOQtest.IsEmpty then ShowMessage('можно удалять');

Ну вот есть общая таблица Order из которого ссылается на таблицу Spec

ADOQuery1 связано с Order
ADOQuery3 связано с Spec

в Order есть запись с id = 2

пишу как вы написали

Код:

         ADOQuery1.SQL.Text := 'SELECT * FROM Order WHERE id = 2';
         ADOQuery1.Open;

         if ADOQuery1.IsEmpty then ShowMessage('Можно удалить');
код пишет что можно удалить, ставлю несущ id = 7 все равно пишет Можно удалить

Последний раз редактировалось goto ∞; 26.04.2020 в 17:31.
goto ∞ вне форума Ответить с цитированием
Старый 26.04.2020, 17:53   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
ставлю несущ id = 7
ссылок с таким кодом нет, значит запись с таким кодом(если бы она была) можно было бы и удалить.

Цитата:
Ну вот есть общая таблица Order из которого ссылается на таблицу Spec
и какое поле таблицы Order содержит ссылку на Spec.id ?
Код:
select .. from order where order.refspec =7

IsEmpty  Spec.id =7 можно удалить.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.04.2020 в 18:02.
evg_m вне форума Ответить с цитированием
Старый 26.04.2020, 17:57   #5
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
ссылок с таким кодом нет, значит запись с таким кодом(если бы она была) можно было бы и удалить.
Я проверял с значением 2 тоже, не работает как надо.

Можете привести полный код как составляется SQL запрос в дельфи, есть несколько вариантов вроде как?
goto ∞ вне форума Ответить с цитированием
Старый 26.04.2020, 20:47   #6
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Все решил проблему на основе первого варианта:
Код:

var t_id :integer;
begin
if MessageDlg('Вы точно хотите удалить запись?',

            mtConfirmation, [mbYes, mbNo], 0) = mrYes

            then
                  begin
                    with DataModule2 do
                    begin
                         t_id := DataModule2.ADOQuery3.FieldByName('id').AsInteger;
                         showmessage(inttostr(t_id));
                         ADOQuery1.Close;
                         ADOQuery1.SQL.Clear;

                         ADOQuery1.SQL.add('SELECT * FROM "Order" WHERE id_sp = :t');
                         ADOQuery1.Parameters.ParamByName('t').Value:= t_id;
                         ADOQuery1.Open;


                        if ADOQuery1.IsEmpty then ShowMessage('Можно удалять') else ShowMessage('Нельзя удалять');

                        {Восстанавление таблицы}
                         ADOQuery1.Close;
                         ADOQuery1.SQL.Clear;
                         ADOQuery1.SQL.add('SELECT * FROM "Order"');
                         ADOQuery1.Open;


                    end;
                  end;
goto ∞ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Python. В чем отличие Entry.delete(0, END) от Entry.delete(0.0, END) и еще вопрос pompiduskus PHP 4 12.08.2014 23:17
таблицы подстановок в дельфи(базы данных в дельфи) ManiagoZ БД в Delphi 0 15.05.2011 15:07
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14