Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-67088
Valeriya
2003-04-03 11:55
2003.04.21
QReport и геморой


1-67309
minotavr
2003-04-08 19:01
2003.04.21
Работа с DLL


14-67465
Карлсон
2003-04-04 19:48
2003.04.21
напиться, обкуриться, забыться.


1-67354
Ace
2003-04-09 22:38
2003.04.21
Помогите новечку разобратся с глючным циклом for.to.do


9-67064
Axis_of_Evil
2002-11-18 13:13
2003.04.21
Вопросы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский