Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 15.08.2012, 13:49   #1
Aza-Zel
 
Регистрация: 15.08.2012
Сообщений: 8
Репутация: 10
По умолчанию SQL запрос в цикле

Здравствуйте. В БД создана таблица detali с первичным ключом id_det.
При работе программы требуется изменять значения в столбце parent.
Собственно, запрос исполняется, но только для первой строчки.
Что же не так?

Код, выполняющий задумку:

procedure TForm2.Button3Click(Sender: TObject);
var k:integer;
i:integer;
begin
ZTable1.Active:=false;
ZTable1.TableName:='test.detali';
ZTable1.Active:=true;
k:=ZTable1.RecordCount; // узнаем число записей в таблице
i:=1;
while i<=k do begin
ZQuery4.Active:=false;
ZQuery4.SQL.Clear;
ZQuery4.SQL.Text:='UPDATE detali SET parent=0 WHERE id_det=' + inttostr(i);
ZQuery4.Active:=true;
i:=i+1;
end;
end;

PS. Прошу прощения, если есть нарушения в оформлении поста. Исправлю, если что не так)
Aza-Zel вне форума   Ответить с цитированием
Старый 15.08.2012, 14:01   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,993
Репутация: 6725
По умолчанию

Код не верный и вообще судя по этому коду там скорее всего одной командой UPDATE detali SET parent=0 можно все сделать
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 15.08.2012, 14:12   #3
Aza-Zel
 
Регистрация: 15.08.2012
Сообщений: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код не верный и вообще судя по этому коду там скорее всего одной командой UPDATE detali SET parent=0 можно все сделать
мм, я запрос для примера написала.
А если нужен вот такой:
ZQuery4.SQL.Text:='UPDATE detali SET parent=' +inttostr(i) + 'WHERE id_det=' + inttostr(i);
т.е. значения для parent необходимо тоже менять. Хочу на примере простого разобраться, чтобы потом определять parent из более сложного условия. Например, из второго цикла по j..

Как правильно написать цикл и запрос в нем?

Последний раз редактировалось Aza-Zel; 15.08.2012 в 14:17.
Aza-Zel вне форума   Ответить с цитированием
Старый 15.08.2012, 14:36   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,993
Репутация: 6725
По умолчанию

1. Запросы в цикле это нонсенс. Очень-очень плохой пример программирования. В каждом конкретном случае хорошо все обдумать и как правило оказывается, что цикл не нужен
2. Использовать RecordCount для организации цикла очень рискованно, можно на большие неприятности нарваться. Если уж делать, то
Код:
ZTable1.First;
while not ZTable1.Eof do begin
  ...
  ZTable1.Next;
end;
3. Использовать ZQuery4.ExecSQL для запросов с INSERT, UPDATE, DELETE и т.п. вместо Active:=True или Open
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 15.08.2012, 14:42   #5
Aza-Zel
 
Регистрация: 15.08.2012
Сообщений: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
1. Запросы в цикле это нонсенс. Очень-очень плохой пример программирования. В каждом конкретном случае хорошо все обдумать и как правило оказывается, что цикл не нужен
2. Использовать RecordCount для организации цикла очень рискованно, можно на большие неприятности нарваться. Если уж делать, то
Код:
ZTable1.First;
while not ZTable1.Eof do begin
  ...
  ZTable1.Next;
end;
3. Использовать ZQuery4.ExecSQL для запросов с INSERT, UPDATE, DELETE и т.п. вместо Active:=True или Open
О, большое спасибо) Буду пробовать)
Aza-Zel вне форума   Ответить с цитированием
Старый 15.08.2012, 14:47   #6
Aza-Zel
 
Регистрация: 15.08.2012
Сообщений: 8
Репутация: 10
По умолчанию

Ура! Пошло!
Аватар, низкий вам поклон) вроде фигня, а я с ней второй день вожусь) Сделал, как сказали.

А цикл мне нужен. Конечно, это нехорошо так дерево строить, и есть хорошие статьи для этого, но я слишком плохой программист, чтобы в них разобраться.
Aza-Zel вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL запрос Frosts SQL, базы данных 2 17.05.2011 22:34
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 07:26
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 19:15


09:52.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.