Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

Обновление по индексу таблицы 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]

опиши эти условия



Страницы: 1 2 вся ветка

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.032 c
1-67373
CussedJohn
2003-04-10 11:24
2003.04.21
Чтение Нового Формата Файла 16-бит. INTEGER


1-67305
АлеКо
2003-04-09 05:45
2003.04.21
Excel


1-67350
DenisS
2003-04-09 16:20
2003.04.21
Как заставить выпасть ComboBox по кнопке Enter?


1-67326
Лана Розанова
2003-04-09 12:48
2003.04.21
Delphi & Excel


3-67133
НастяР
2003-04-01 14:55
2003.04.21
наипоследняя датой