Форум: "Базы";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];
ВнизОбновление по индексу таблицы Paradox Найти похожие ветки
← →
Sam Stialy (2003-04-02 10:35) [0]Сталкнулся с такой проблемой
Есть таблица у которой одно из полей которое служит признаком обработана запись или нет(если нет то поле пусто).
Запускаю цикл по необработанным записям и проверяю условие обработки и обновляю запись.
Цикл обрабатывает только первую запись!!!
В чем может быть дело?
← →
Соловьев (2003-04-02 10:39) [1]код?
← →
Silver_ (2003-04-02 10:52) [2]не телепат но ...
...МожетDataSet .Next;
а лучше через запрос (по возможности)
а вопще ГДЕ код то ???
← →
Sam Stialy (2003-04-02 10:53) [3]
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;
← →
Соловьев (2003-04-02 10:57) [4]
> );
> if Table1.FieldByName("Attribute").AsString = "2" then
> try
> Table1.Edit;
> Table1.FieldByName("Stamp").AsInteger := 1;
> Table1.Post;
> except
> Table1.Cancel;
> end
> else
> Table1.Next;
>
тебе же нужны все записи зачем ты это условие проверяешь?
← →
MsGuns (2003-04-02 11:15) [5]Круто ! У тебя если первая запись имеет признак "2", то Next`а нет вообще ! Все крутится вокруг ее же !
Вот что бывает, если чел игнорирует отступы при кодировании ;)))
← →
Sam Stialy (2003-04-02 11:21) [6]Мне нужны не все записи, а только удовлетворяющие определенному условию.
Это только пример, реально я получаю условие неободимости простановки признака из других таблиц :(
Я думаю, что в моем случае запросом я воспользоваться не смогу
В этом примере else Table1.Next обновляет больше записей.
Если убрать else то обновляется только одна запись
← →
Соловьев (2003-04-02 11:26) [7]
update table1
set "stamp"=1
where "attribute"=1
← →
Sam Stialy (2003-04-02 11:26) [8]даже если первая запись с 2, по дойдет до конца :)
Испытано :))
← →
Ильич (2003-04-02 12:03) [9]>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)
← →
MsGuns (2003-04-02 12:06) [10]Блин, опять засветился ;((((
← →
Sam Stialy (2003-04-02 12:37) [11]Но обновит от всего одну запись :((
Я тоже думал, что будет бесконечный цикл, но тольки BDE умное, либо я ..., но если первая запись с 2 нет бесконечного цикла.
А если выводиьть записи, которые были обработаны, то становиться еще интереснее.
Если все атрибуты = 2 (и есть else) обновляются все нужные записи,а без него - только первая запись :((((
← →
Соловьев (2003-04-02 12:39) [12]
> Соловьев © (02.04.03 11:26
← →
MsGuns (2003-04-02 12:44) [13]>Sam Stialy (02.04.03 12:37)
>Если все атрибуты = 2 (и есть >else) обновляются все нужные записи,а без него - только первая запись :((((
Обработчики AfterXXX/BeforeXXX есть ?
← →
Sam Stialy (2003-04-02 12:57) [14]Нет
:(((
И судя по счетчику iUpdate, то обновления после первой записи - набор данных заканчивается
← →
MsGuns (2003-04-02 13:04) [15]Чудес не бывает ! Если у тебя без строки Next курсор переходит на другую запись (относительно начала курсора), то либо ты меняешь ключ (индекс) и запись просто перемещается внутри курсора (надеюсь, Stamp у тебя не ключ и не активный индекс), либо где-то у тебя автоматом делается этот переход (скорее всего в событиях)
← →
Sam Stialy (2003-04-02 13:09) [16]Если посмотреть приведенный код, то первым делом устанавливается
Table1.IndexName := "Stamp";
Table1.SetRange([""], [""]);
← →
Соловьев (2003-04-02 13:18) [17]используй SQL и будет тебе счастье.
← →
Sam Stialy (2003-04-02 13:25) [18]Для реальной задачи, к сожалению не получиться SQL прикрупиться.
А как хотелось бы :)
И было бы мне счастье
← →
Соловьев (2003-04-02 13:26) [19]
update table1
set "stamp"=1
where "attribute"=1
← →
MsGuns (2003-04-02 13:28) [20]>Sam Stialy (02.04.03 13:09)
Бог мой, действительно ! Совсэм ослэп ;((
Тогда ты вообще - чудо ! Ведь после поста запись перепозиционируется в курсоре в "порядке общей очереди". Т.е. метод Next здесь вообще неприменим ! Или перед сканированием вырубай индекс, или используй буферизацию (кэширование) изменений, либо (и это - лучший способ !) делай как говорит Соловьев © (02.04.03 13:18)
← →
MsGuns (2003-04-02 13:31) [21]>Sam Stialy (02.04.03 13:25)
>Для реальной задачи, к сожалению не получиться SQL прикрупиться
А что, SQL используют только для нереальных задач ? Или для этого надо супер-пупер платный пакет поддержки ? Или просто не знаем SQL и в лом изучить ?
← →
Sam Stialy (2003-04-02 13:41) [22]Увы нет, нет и нет
Конечно можно сделасть запросом, но есть одно НО, которое и делает в данном случае невозмоность пременения SQL.
Условие получается выборкой из БД в которой примерно 1.3M записей. И найти по ключу примерно быстрее, и намного, чем через SQL запрос :(.
← →
Ильич (2003-04-02 13:52) [23]>Sam Stialy (02.04.03 13:41)
>Условие получается выборкой из БД в которой примерно 1.3M записей. И найти по ключу примерно быстрее, и намного, чем через SQL запрос
Неужели ? В самом деле ? И проверял ? И несколько раз ?
Эх, скажи спасибо, что нет здесь ни Джонмена, ни Александра, ни других Мастеров - они б тебя на молекулы разъяли !
Сканированием быстрее чем запросом ! Это надо выбить на мраморе и повесить в Школе Для Самоуверенных Дилетантов
← →
Smashich (2003-04-02 13:55) [24]>Sam Stialy (02.04.03 13:41)
>Условие получается выборкой из БД в которой примерно 1.3M записей. И найти по ключу примерно быстрее, и намного, чем через SQL запрос
используй SQL и НИИ мозги!
← →
Anatoly Podgoretsky (2003-04-02 14:05) [25]Убери Table1.SetRange([""], [""]) это какое то страшное выражение, правда гарантировано твоя программа повиснет.
← →
Mike Kouzmine (2003-04-02 15:42) [26]А нельзя так? Изменить индекс Штамп + Аттрибуте
Table1.SetRange(["","2"], ["","2"]);
while not Table1.Eof do
begin // Перебор записей в текущем куросре таблицы
Inc(iUpdate); // Счетчик просмотренных записей (?)
try
Table1.Edit;
Table1.FieldByName("Stamp").AsInteger := 1;
Table1.Post;
except
Table1.Cancel;
Table1.Next;
end;
// Если атрибут у записи не "2", переходим к след.записи
// Возврат к началу цикла
end;
← →
Sam Stialy (2003-04-02 15:56) [27]1. Решил воспользоваться советом много уважаемого общества и использовать SQL запрос, как бы все просто
UPDATE Table1 refID =
(
SELECT ID FROM Table1
WHERE <condition1> and <condition2>
)
WHERE <condition3> AND RefID is NULL
, но ...
При этом только на тестовой БД всего с 20K записями, на использование SQL получил увеличение времени примерно на 250%
:(, хотя общее время не значительно.
2. Спасибо Mike, но не получиться - атрибут был введен только для эксперимента - реально он расчитывается на основании другой Таблицы
← →
Соловьев (2003-04-02 16:00) [28]
UPDATE Table1 refID = ID
WHERE <condition3> AND RefID is NULL and <condition1> and <condition2>
а так?
← →
Sam Stialy (2003-04-02 16:05) [29]Sorry, опечатался я
в подзапросе Table2
UPDATE Table1 refID =
(
SELECT ID FROM Table2 WHERE <condition1> and <condition2>
)
WHERE <condition3> AND RefID is NULL
← →
Mike Kouzmine (2003-04-02 16:08) [30]А поробуй в старом варианте после Cancel поставить Next. Может у тебя случается Exception, то бесконечный цикл.
Или, возможно, после post - refresh? Хотя это плохо. Запись и без него должна уходить.
← →
Соловьев (2003-04-02 16:08) [31]как связаны Table1 и Table2?
← →
Sam Stialy (2003-04-02 16:15) [32]В том то и одна из проблем, что ни как :(
Наследие старых времен.
← →
Mike Kouzmine (2003-04-02 16:17) [33]to Соловьев ©
Если файл серверные базы, то пример:
таблица - 600К записей (120 Мб), обновление 1 поля с условием Поле1 = "XXX" (поле в этой же таблице) SQL примерно 40 мин, перебором примерно 15 мин. + прогресс бар + можно прервать + соответственно нормально отрисовывается все (нет ощущения подвисания)
← →
Соловьев (2003-04-02 16:19) [34]
> В том то и одна из проблем, что ни как :(
????
а если будет разное колличество записей?
← →
Sam Stialy (2003-04-02 16:21) [35]А их и будет разные, т.е. не всем записям в Table1 соотвествует записи Table2.
Но по записи table2 можно однозначно определить запись Table1.
← →
Соловьев (2003-04-02 16:24) [36]
> записи table2 можно однозначно определить запись Table1.
а ты говоришь не связаны...
← →
Sam Stialy (2003-04-02 16:33) [37]Тогда да, связаны
← →
Соловьев (2003-04-02 16:40) [38]
> записи table2 можно однозначно определить запись Table1.
как?
← →
Sam Stialy (2003-04-02 16:45) [39]это задано в <condition1> и <condition2>
← →
Соловьев (2003-04-02 16:48) [40]опиши эти условия
← →
Sam Stialy (2003-04-02 17:31) [41]Table1.Data = Table2.Data
AND
Table1.Number = Table2.Number
AND
Table1.IDSuplier = Table2.IDSuplier
Data - дата
Number - строка(10)
IDSuplier - страка(10) - не номер, а некий идентификатор
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.013 c