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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2010, 20:28   #1
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию Связанные таблицы

Есть две таблицы tb_1(главная) и tb_2 (дочерняя), связаны через MasterSource.
Необходимо из дочерней таблицы удалить все записи. Собственно проблема и заключается в удалении.
Работаю с TTable, DataSource.
Пробовал сделать следующим способом(код ниже), не получается.
Код:
dm.tb_tb_1.First;   
for ii:=0 to dm.tb_tb_1.RecordCount-1 do 
 begin
  dm.tb_tb_1.RecNo:=ii; 
  dm.tb_tb_2.First;
  for i:=0 to dm.tb_tb_2.RecordCount-1 do 
   begin
    dm.tb_tb_2.Delete;
    dm.tb_tb_2.Next;
   end; 
 end;

Последний раз редактировалось aimk0; 26.10.2010 в 20:44.
aimk0 вне форума Ответить с цитированием
Старый 26.10.2010, 20:51   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Пробовал сделать следующим способом(код ниже), не получается.
что значит не получается
выдает ошибку (какую)
не удаляет ничего
удаляет но не все
укажите другой вариант ответа
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 26.10.2010, 22:29   #3
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

В tb_2 удаляются только записи соответствующие первой записи в tb_1. Т.е. внешний цикл
Цитата:
for ii:=0 to dm.tb_tb_1.RecordCount-1 do
begin
dm.tb_tb_1.RecNo:=ii;
не работает
aimk0 вне форума Ответить с цитированием
Старый 26.10.2010, 22:55   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Код:
dm.tb_tb_1.First;
for ii:=0 to dm.tb_tb_1.RecordCount-1 do
 begin
  dm.tb_tb_1.RecNo:=ii; //Для чего эта строка ?
  dm.tb_tb_2.First;
  for i:=0 to dm.tb_tb_2.RecordCount-1 do
   begin
    dm.tb_tb_2.Delete;
    dm.tb_tb_2.Next; {Эта строка здесь не нужна,
    при удалении курсор и так перейдет к следующей записи, или
    ты через одну удалять будешь}
   end;
 dm.tb_tb_1.Next; //А как они могут удаляться без этой строки
 end;
И вообще, уж если удалять циклом (что не практично, можно все удалить одним sql-запросом), то хотя бы так...
Навскидку
Код:
 dm.tb_tb_1.First;
while not dm.tb_tb_1.eof do
 begin
  dm.tb_tb_2.First;
  while not dm.tb_tb_2.Eof do  dm.tb_tb_2.Delete;
 dm.tb_tb_1.Next;
 end;
_SERGEYX_ вне форума Ответить с цитированием
Старый 26.10.2010, 23:07   #5
Dimasw
Пользователь
 
Регистрация: 12.09.2010
Сообщений: 69
По умолчанию

Зачем циклы??? Так таблица долго удаляться будет.
Делай так:

Код:
tb_2.close;
tb2.EmptyTable; //очистка таблицы
tb2.open;
SELECT BEST FROM LIFE
Dimasw вне форума Ответить с цитированием
Старый 27.10.2010, 02:58   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

ИМНО конечно, но лучше связать таблицы по общему полю в запросе и запросом удалять и прописывать в запросе связь. Тогда должно удалиться.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 29.10.2010, 10:07   #7
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

_SERGEYX_, спасибо, что-то я с NEXTом провтыкал))
Dimasw, при такой очистке ошибку выдает
artemavd, не совсем понял как связать таблицы в запросе (если можно, приведите пример).
aimk0 вне форума Ответить с цитированием
Старый 29.10.2010, 10:30   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
не совсем понял как связать таблицы в запросе
Вместо таблиц используешь TQuery.
Допустим, ты их назвал так же, tb_tb_1 и tb_tb_2. Имена таблиц в БД такие же.
Таблицы связаны по полю, например, Number.
В свойствах SQL первого пишешь
Код:
select * from tb_tb_1
В событии AfterScroll первого пишешь
Код:
  tb_tb_2.close;
  tb_tb_2.SQL.Text:='select * from tb_tb_2 where Number = "'+tb_tb_1Number.Text+'"';
  tb_tb_2.Open;
Если нужно удалить из таблицы 2 только видимые записи пишешь
Код:
  Qurery.close;
  Qurery.SQL.Text:='delete from tb_tb_2 where Number = "'+tb_tb_1Number.Text+'"';
  Qurery.ExecSQL;
Если нужно очистить всю вторую таблицу:
Код:
  Qurery.close;
  Qurery.SQL.Text:='delete from tb_tb_2';
  Qurery.ExecSQL;
Предвижу будующие вопросы... Как добавлять и изменять записи????
Читай учебники по SQL. Их в интернете полно...

Последний раз редактировалось _SERGEYX_; 29.10.2010 в 10:36.
_SERGEYX_ вне форума Ответить с цитированием
Старый 29.10.2010, 17:52   #9
Dimasw
Пользователь
 
Регистрация: 12.09.2010
Сообщений: 69
По умолчанию

Цитата:
Сообщение от aimk0 Посмотреть сообщение
Dimasw, при такой очистке ошибку выдает
artemavd).
Скомпилируй проект, закрой Дельфи и попробуй мой код запустить из Exe-шника.
У меня работает.
SELECT BEST FROM LIFE
Dimasw вне форума Ответить с цитированием
Старый 01.11.2010, 22:12   #10
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

Dimasw, и правда, при закрытом Delphi все работает ))
aimk0 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление строк в связанные таблицы StIKEG БД в Delphi 4 16.06.2010 11:46
Добавление в связанные таблицы ADOQuery и ADOTable Alukard ń_ಶ Помощь студентам 0 07.06.2010 21:11
SQL-запрос (связанные таблицы) astra-48 БД в Delphi 3 03.03.2010 01:44
Связанные таблицы в Аксессе mirawoo Microsoft Office Access 8 12.03.2008 00:13
Добавление записей в связанные таблицы с помощью Навигатора ~MaGic~ БД в Delphi 2 09.07.2007 08:01