Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.07.2019, 20:48
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Удаление записей из связанных таблиц

Здравствуйте.

Из одной таблицы удаление:
Код:
if
(Table1.RecordCount>0)   then

  begin
u:=MessageDlg('Удалить проект?',mtCustom,[mbYes,mbNo],0);
if u=mrYes then
begin

Table1.Delete;
//Table2.Delete;
end;

Но в связанных с таблицей 1, таблицах записи не удаляются. Я понимаю , что есть каскадное удаление, но там при удалении ошибка появлялась.
И второй вопрос.
Что надо добавить в строке u:=MessageDlg('Удалить проект?',mtCustom,[mbYes,mbNo],0);
чтобы в диалоговом окне удалить проект стояло ,то что введено в таблицу 1, т.е в combobox?

Последний раз редактировалось Maks19, 17.07.2019 в 20:53.
Ответить с цитированием
  #2  
Старый 17.07.2019, 23:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,475
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

на второй вопрос:
Код:
u:=MessageDlg('Удалить проект '+Table1.FieldByName('...').AsSTring + '?',mtCustom,[mbYes,mbNo],0);

На первый вопрос. Если база - СУБД (MS SQL, Oracle, Interbase, etc), то действительно можно применять каскадное удаление.Тогда БД сама по ключам удалит нужные записи.
Если БД локальная (типа Paradox, dBase), то придется удалять руками. Т.е. из главной таблицы запоминаешь уникальный id записи, удаляешь из подчиненных таблиц записи с соотв. значением, указывающем на главную запись и в конце удаляешь соотв. запись из главной таблицы.
Ответить с цитированием
  #3  
Старый 17.07.2019, 23:34
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
на второй вопрос:
Код:
u:=MessageDlg('Удалить проект '+Table1.FieldByName('...').AsSTring + '?',mtCustom,[mbYes,mbNo],0);


На запись
Код:
u:=MessageDlg('Удалить проект'+'Table1.FieldByname('Projname').AsString'+'?',mtCustom,[mbYes,mbNo],0);
Выдает ошибку Not enocugh actual parametrs
Ответить с цитированием
  #4  
Старый 17.07.2019, 23:38
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Maks19
На запись
Код:
u:=MessageDlg('Удалить проект'+'Table1.FieldByname('Projname').AsString'+'?',mtCustom,[mbYes,mbNo],0);
Выдает ошибку Not enocugh actual parametrs
Работает. кавычки не там поставил.
Ответить с цитированием
  #5  
Старый 18.07.2019, 04:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,475
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

не просто не там, а по своей инициативе добавил лишних...
Ответить с цитированием
  #6  
Старый 18.07.2019, 13:57
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
на второй вопрос:
Код:
u:=MessageDlg('Удалить проект '+Table1.FieldByName('...').AsSTring + '?',mtCustom,[mbYes,mbNo],0);

На первый вопрос. Если база - СУБД (MS SQL, Oracle, Interbase, etc), то действительно можно применять каскадное удаление.Тогда БД сама по ключам удалит нужные записи.
Если БД локальная (типа Paradox, dBase), то придется удалять руками. Т.е. из главной таблицы запоминаешь уникальный id записи, удаляешь из подчиненных таблиц записи с соотв. значением, указывающем на главную запись и в конце удаляешь соотв. запись из главной таблицы.
Зная id из главной таблицы ,как
Ответить с цитированием
  #7  
Старый 18.07.2019, 19:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,475
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Цитата:
Сообщение от Maks19
Зная id из главной таблицы ,как

Ну есть же у тебя какое-то поле, по которому осуществляется связь таблиц. Вот оно и является id записи в главной таблице...
Ответить с цитированием
  #8  
Старый 26.07.2019, 00:09
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Код:
Table3.Delete
Код удаляет только одну запись. Подскажите, как удалить записи (не вообще все в таблице) с нужным id? Может в цикле надо ?
Ответить с цитированием
  #9  
Старый 26.07.2019, 01:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,475
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Ага, именно в цикле.
Тут интересный вопрос, что у тебя в таблице. Если она уже отфильтрована что бы показывать только те записи, которые тебе нужны, то просто надо удалить все записи. Если же там вообще все записи, то тогда надо делать проверку. Например, как-то так (код не проверял):
Код:
Table3.first;
while not Table3.eof do
  if Table3.FieldByName('...').AsInteger = ... // условие на поиск записи, которые надо удалять
    Then Table3.Delete
    Else Table3.Next;
Ответить с цитированием
  #10  
Старый 27.07.2019, 16:02
Zerg06969_ Zerg06969_ вне форума
Прохожий
 
Регистрация: 13.08.2017
Сообщения: 1
Версия Delphi: xe 7
Репутация: 10
По умолчанию Примерный ответ на первый вопрос

Код:
var
DS : TDataSource;

procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
DS := DataSource1;
end;

procedure TForm1.DBGrid2Enter(Sender: TObject);
begin
DS := DataSource2;
Table1.Refresh;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
  begin
    if DS = DataSource1 then //Если активно DBGrid1
      begin
      if Table2.RecordCount <> 0 then
      if MessageDlg('Удалить все записи из таблицы Table1 и Table2?',mtCustom,[mbYes,mbNo],0)  = mrNo then exit
        else
          begin
            Table2.First; // Установка позиции курсора на начало таблицы Table2
              for i := 1 to Table2.RecordCount do Table2.Delete; //цикл удаления всех записей в дочерней Table2
          end;
      if Table1.RecordCount <> 0 then Table1.Delete; // Далее удаление записи в главной Table1
      end
else //иначе удаляем выделенную запись из таблицы Table2
    if DS = DataSource2 then //Если активно DBGrid2
    begin
    if Table2.RecordCount <> 0 then
    if MessageDlg('Удалить выделенную запись из таблицы Table2?',mtCustom,[mbYes,mbNo],0)  = mrNo then exit
    else
     Table2.Delete;
    end;

lmikle: Пользуемся тегами.

Последний раз редактировалось lmikle, 29.07.2019 в 23:44.
Ответить с цитированием
Этот пользователь сказал Спасибо Zerg06969_ за это полезное сообщение:
Maks19 (06.08.2019)
  #11  
Старый 06.08.2019, 21:09
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Здравствуйте! Как сделать чтобы при удалении записи из таблицы удалилась строка в комбобоксе? Т. е изначально при вводе в комбокс текст попадает в таблицу.
По коду привед. ниже удаляется строка в комбобокс, но она не соответствует выбранной записи в таблице.
Код:
for i:=0 to  ComboBox1.Items.Count do
 ComboBox1.Items.Delete(i-1);
Ответить с цитированием
  #12  
Старый 07.08.2019, 02:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,475
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Этот код вообще должен с ошибкой выпадать...
Код:
var
  Idx : Integer;
begin
  DeletedProjectName := '...';
  ...
  Idx := ComboBox1.Items.IndexOf(DeletedProjectName);
  If Idx > -1 Then ComboBox1.Items.Delete(Idx);
end;
Ответить с цитированием
  #13  
Старый 07.08.2019, 08:51
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

А в deletedProjectName что ? Пустая строка?
Не удаляется
Ответить с цитированием
  #14  
Старый 07.08.2019, 19:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,475
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Это то, что ты удаляешь. Т.е. имя, я просто сделал переменную для простоты. Если ты удаляешь выбранный в ComboBox проект, то тогда код будет примерно таким:
Код:
var
  Idx : Integer;
begin
  DeletedProjectName := ComboBox1.Text;
  ...
  Idx := ComboBox1.Items.IndexOf(DeletedProjectName);
  If Idx > -1 Then 
    Begin
      ComboBox1.Items.Delete(Idx);
      ComboBox1.Text := '';
    End;
end;
Ответить с цитированием
  #15  
Старый 07.08.2019, 20:56
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Это то, что ты удаляешь. Т.е. имя, я просто сделал переменную для простоты. Если ты удаляешь выбранный в ComboBox проект, то тогда код будет примерно таким:
Код:
var
  Idx : Integer;
begin
  DeletedProjectName := ComboBox1.Text;
  ...
  Idx := ComboBox1.Items.IndexOf(DeletedProjectName);
  If Idx > -1 Then 
    Begin
      ComboBox1.Items.Delete(Idx);
      ComboBox1.Text := '';
    End;
end;
А где в этом коде связь с таблицей базы данных?
А разве связи не должно быть с записью из удаляемой таблицы? Т.е я сначала удаляю запись из таблицы проектов ,и в комбокс строка с именем проекта должна удалиться.
Ответить с цитированием
Ответ



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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter