![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление по индексу таблицы Paradox [D5, Paradox]
Sam Stialy © (2003-04-02 10:35:00)Сталкнулся с такой проблемой
Есть таблица у которой одно из полей которое служит признаком обработана запись или нет(если нет то поле пусто).
Запускаю цикл по необработанным записям и проверяю условие обработки и обновляю запись.
Цикл обрабатывает только первую запись!!!
В чем может быть дело?
MsGuns (2003-04-02 13:31:00) [21]>Sam Stialy (02.04.03 13:25)
>Для реальной задачи, к сожалению не получиться SQL прикрупиться
А что, SQL используют только для нереальных задач ? Или для этого надо супер-пупер платный пакет поддержки ? Или просто не знаем SQL и в лом изучить ?
MsGuns (2003-04-02 13:28:00) [22]>Sam Stialy (02.04.03 13:09)
Бог мой, действительно ! Совсэм ослэп ;((
Тогда ты вообще - чудо ! Ведь после поста запись перепозиционируется в курсоре в "порядке общей очереди". Т.е. метод Next здесь вообще неприменим ! Или перед сканированием вырубай индекс, или используй буферизацию (кэширование) изменений, либо (и это - лучший способ !) делай как говорит Соловьев © (02.04.03 13:18)
Соловьев (2003-04-02 13:26:00) [23]
update table1
set "stamp"=1
where "attribute"=1
Sam Stialy (2003-04-02 13:25:00) [24]Для реальной задачи, к сожалению не получиться SQL прикрупиться.
А как хотелось бы :)
И было бы мне счастье
Соловьев (2003-04-02 13:18:00) [25]используй SQL и будет тебе счастье.
Sam Stialy (2003-04-02 13:09:00) [26]Если посмотреть приведенный код, то первым делом устанавливается
Table1.IndexName := "Stamp";
Table1.SetRange([""], [""]);
MsGuns (2003-04-02 13:04:00) [27]Чудес не бывает ! Если у тебя без строки Next курсор переходит на другую запись (относительно начала курсора), то либо ты меняешь ключ (индекс) и запись просто перемещается внутри курсора (надеюсь, Stamp у тебя не ключ и не активный индекс), либо где-то у тебя автоматом делается этот переход (скорее всего в событиях)
Sam Stialy (2003-04-02 12:57:00) [28]Нет
:(((
И судя по счетчику iUpdate, то обновления после первой записи - набор данных заканчивается
MsGuns (2003-04-02 12:44:00) [29]>Sam Stialy (02.04.03 12:37)
>Если все атрибуты = 2 (и есть >else) обновляются все нужные записи,а без него - только первая запись :((((
Обработчики AfterXXX/BeforeXXX есть ?
Соловьев (2003-04-02 12:39:00) [30]
> Соловьев © (02.04.03 11:26
Sam Stialy (2003-04-02 12:37:00) [31]Но обновит от всего одну запись :((
Я тоже думал, что будет бесконечный цикл, но тольки BDE умное, либо я ..., но если первая запись с 2 нет бесконечного цикла.
А если выводиьть записи, которые были обработаны, то становиться еще интереснее.
Если все атрибуты = 2 (и есть else) обновляются все нужные записи,а без него - только первая запись :((((
MsGuns (2003-04-02 12:06:00) [32]Блин, опять засветился ;((((
Ильич (2003-04-02 12:03:00) [33]>Sam Stialy (02.04.03 11:21
Так-с. Пишем нормальненько. И комментируем
while not Table1.Eof do
begin // Перебор записей в текущем куросре таблицы
Inc(iUpdate); // Счетчик просмотренных записей (?)
if Table1.FieldByName("Attribute").AsString = "2" then
// Для записи с атрибутом 2 меняем <Stamp>
try
Table1.Edit;
Table1.FieldByName("Stamp").AsInteger := 1;
Table1.Post;
except
Table1.Cancel;
end
else
// Если атрибут у записи не "2", переходим к след.записи
Table1.Next;
// Возврат к началу цикла
end;
Теперь внимательно смотрим. Ага, если атрибут<>2, по переходим на след.запись, а если равен ? Остаемся на месте ! Бесконечный цикл..
Вывод: Уважаемый, Вы или привели не тот код или держите нас за идиотов ! При таком коде прога не будет виснуть только если у нее не будет записей с кодом "2" или нет принудительного обрыва цикла (например, по таймеру или кто-то "со стороны" поменяет этот чертовый атрибут на 1 или 3)
Sam Stialy (2003-04-02 11:26:00) [34]даже если первая запись с 2, по дойдет до конца :)
Испытано :))
Соловьев (2003-04-02 11:26:00) [35]
update table1
set "stamp"=1
where "attribute"=1
Sam Stialy (2003-04-02 11:21:00) [36]Мне нужны не все записи, а только удовлетворяющие определенному условию.
Это только пример, реально я получаю условие неободимости простановки признака из других таблиц :(
Я думаю, что в моем случае запросом я воспользоваться не смогу
В этом примере else Table1.Next обновляет больше записей.
Если убрать else то обновляется только одна запись
MsGuns (2003-04-02 11:15:00) [37]Круто ! У тебя если первая запись имеет признак "2", то Next`а нет вообще ! Все крутится вокруг ее же !
Вот что бывает, если чел игнорирует отступы при кодировании ;)))
Соловьев (2003-04-02 10:57:00) [38]
> );
> if Table1.FieldByName("Attribute").AsString = "2" then
> try
> Table1.Edit;
> Table1.FieldByName("Stamp").AsInteger := 1;
> Table1.Post;
> except
> Table1.Cancel;
> end
> else
> Table1.Next;
>
тебе же нужны все записи зачем ты это условие проверяешь?
Sam Stialy (2003-04-02 10:53:00) [39]
Table1.IndexName := "Stamp";
Table1.Open;
Table1.SetRange([""], [""]);
Table1.First;
while not Table1.Eof do
begin
Inc(iUpdate);
if Table1.FieldByName("Attribute").AsString = "2" then
try
Table1.Edit;
Table1.FieldByName("Stamp").AsInteger := 1;
Table1.Post;
except
Table1.Cancel;
end
else
Table1.Next;
end;
Silver_ (2003-04-02 10:52:00) [40]не телепат но ...
...МожетDataSet .Next;
а лучше через запрос (по возможности)
а вопще ГДЕ код то ???