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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2010, 23:25   #1
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
По умолчанию Узнать только определенные ID и удалить их

у меня есть 2 таблицы я хочу удалить со справочника все id-шники которых нет в основной таблице. и еще выдает еще ошибку... invalid pointer operation
Код:
var
s,koli,si,k,l,i: integer;
mas_diag: array of integer;
begin
    si:=dm.ADOQ_Diagnozid_diagnoza.Value;//таблица справочников
    DM.ADOQuery1.Close;//основная таблица
    DM.ADOQuery1.SQL.Clear;
    DM.ADOQuery1.SQL.Add('SELECT id_diagnoza as KOL FROM osnovnoy_soputstvuyhiy_diagnoz WHERE osnovnoy_soputstvuyhiy_diagnoz.id_diagnoza=:si;');
    dm.ADOQuery1.Parameters.ParamByName('si').Value:=si;
    DM.ADOQuery1.Open;
    setlength(mas_diag,dm.ADOQuery1.RecordCount);
    for i:=1 to dm.ADOQuery1.RecordCount do
      begin
        mas_diag[i]:=dm.ADOQuery1.FieldByName('KOL').AsInteger;
        s:=MessageDlg('Удалить запись ?',mtWarning,[mbNO,mbOK],0);
        if s=mrOK then
            begin
                DM.ADOC_PAC.CommandText:='DELETE FROM diagnoz WHERE id_diagnoza<>:idd';
                DM.ADOC_PAC.Parameters.ParamByName('idd').Value:=mas_diag[i];
                DM.ADOC_PAC.Execute;

                DM.ADOQ_Diagnoz.Close;
                DM.ADOQ_Diagnoz.SQL.Clear;
                DM.ADOQ_Diagnoz.SQL.Add('SELECT * FROM diagnoz');
                DM.ADOQ_Diagnoz.Open;
                l:=dm.ADOQ_Diagnoz.RecordCount;
                f_diagnoz.sb_d.Panels[0].Text:='Всего диагнозов: '+inttostr(l);
                mas_diag:=nil;
            end
        else
          if s=mrNO then
                exit;
        end;
end;
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Старый 15.05.2010, 00:35   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Droid Посмотреть сообщение
и еще выдает еще ошибку... invalid pointer operation
видимо, ошибка здесь возникает
Код:
 mas_diag:=nil;
а зачем так все сложно?
есть подозрение, что если оно все заработает, то работать будет неправильно
имхо можно все сделать одним запросом
soleil@mmc вне форума Ответить с цитированием
Старый 15.05.2010, 00:39   #3
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
видимо, ошибка здесь возникает
Код:
 mas_diag:=nil;
а зачем так все сложно?
есть подозрение, что если оно все заработает, то работать будет неправильно
имхо можно все сделать одним запросом
каким ? и как результат запроса может получить к примеру 3000 id ? кроме как не черезмассив целых чисел ?
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Старый 15.05.2010, 07:56   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а зачем так все сложно?
есть подозрение, что если оно все заработает, то работать будет неправильно
имхо можно все сделать одним запросом
+1

Согласен. Подход к решению изначально неверен!

Эту задачу ОДНОЗНАЧНО надо решать через один простенький запрос!

Код:
DELETE FROM diagnoz 
   WHERE id_diagnoza NOT IN
     (SELECT id_diagnoza as KOL FROM 
       osnovnoy_soputstvuyhiy_diagnoz)
предварительно добавить вопрос - "Удалить все диагнозы из справочника, на которые нет ссылок в основной таблице? "
потом .ExecSQL.
и всё. задача решена!

p.s. Это практически ПОЛНАЯ программа! Весь Ваш остальной код выкинуть из процедуры напрочь!

Последний раз редактировалось Serge_Bliznykov; 15.05.2010 в 07:58.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.05.2010, 11:34   #5
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
По умолчанию

Благодарю все получилось )
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как узнать ID чтобы удалить пауэрлифтинг БД в Delphi 5 05.04.2010 12:57
найти определенные числа в строке fize Помощь студентам 3 15.01.2010 11:26
браузер пр и захоже на определенные сайты должен перенапрвлять на мой сайт dradysman Общие вопросы Delphi 4 04.07.2009 14:41
Удалить определенные строки DBGrid Serval Помощь студентам 2 08.05.2009 08:20
Выборка данных, попадающих под определенные условия tambovsky Microsoft Office Excel 2 13.08.2008 14:48