![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление по индексу таблицы Paradox [D5, Paradox]
Sam Stialy © (2003-04-02 10:35:00)Сталкнулся с такой проблемой
Есть таблица у которой одно из полей которое служит признаком обработана запись или нет(если нет то поле пусто).
Запускаю цикл по необработанным записям и проверяю условие обработки и обновляю запись.
Цикл обрабатывает только первую запись!!!
В чем может быть дело?
Sam Stialy (2003-04-02 17:31:00) [1]Table1.Data = Table2.Data
AND
Table1.Number = Table2.Number
AND
Table1.IDSuplier = Table2.IDSuplier
Data - дата
Number - строка(10)
IDSuplier - страка(10) - не номер, а некий идентификатор
Соловьев (2003-04-02 16:48:00) [2]опиши эти условия
Sam Stialy (2003-04-02 16:45:00) [3]это задано в <condition1> и <condition2>
Соловьев (2003-04-02 16:40:00) [4]
> записи table2 можно однозначно определить запись Table1.
как?
Sam Stialy (2003-04-02 16:33:00) [5]Тогда да, связаны
Соловьев (2003-04-02 16:24:00) [6]
> записи table2 можно однозначно определить запись Table1.
а ты говоришь не связаны...
Sam Stialy (2003-04-02 16:21:00) [7]А их и будет разные, т.е. не всем записям в Table1 соотвествует записи Table2.
Но по записи table2 можно однозначно определить запись Table1.
Соловьев (2003-04-02 16:19:00) [8]
> В том то и одна из проблем, что ни как :(
????
а если будет разное колличество записей?
Mike Kouzmine (2003-04-02 16:17:00) [9]to Соловьев ©
Если файл серверные базы, то пример:
таблица - 600К записей (120 Мб), обновление 1 поля с условием Поле1 = "XXX" (поле в этой же таблице) SQL примерно 40 мин, перебором примерно 15 мин. + прогресс бар + можно прервать + соответственно нормально отрисовывается все (нет ощущения подвисания)
Sam Stialy (2003-04-02 16:15:00) [10]В том то и одна из проблем, что ни как :(
Наследие старых времен.
Соловьев (2003-04-02 16:08:00) [11]как связаны Table1 и Table2?
Mike Kouzmine (2003-04-02 16:08:00) [12]А поробуй в старом варианте после Cancel поставить Next. Может у тебя случается Exception, то бесконечный цикл.
Или, возможно, после post - refresh? Хотя это плохо. Запись и без него должна уходить.
Sam Stialy (2003-04-02 16:05:00) [13]Sorry, опечатался я
в подзапросе Table2
UPDATE Table1 refID =
(
SELECT ID FROM Table2WHERE <condition1> and <condition2>
)
WHERE <condition3> AND RefID is NULL
Соловьев (2003-04-02 16:00:00) [14]
UPDATE Table1 refID = ID
WHERE <condition3> AND RefID is NULL and <condition1> and <condition2>
а так?
Sam Stialy (2003-04-02 15:56:00) [15]1. Решил воспользоваться советом много уважаемого общества и использовать SQL запрос, как бы все просто
UPDATE Table1 refID =
(
SELECT ID FROM Table1
WHERE <condition1> and <condition2>
)
WHERE <condition3> AND RefID is NULL
, но ...
При этом только на тестовой БД всего с 20K записями, на использование SQL получил увеличение времени примерно на 250%
:(, хотя общее время не значительно.
2. Спасибо Mike, но не получиться - атрибут был введен только для эксперимента - реально он расчитывается на основании другой Таблицы
Mike Kouzmine (2003-04-02 15:42:00) [16]А нельзя так? Изменить индекс Штамп + Аттрибуте
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;
Anatoly Podgoretsky (2003-04-02 14:05:00) [17]Убери Table1.SetRange([""], [""]) это какое то страшное выражение, правда гарантировано твоя программа повиснет.
Smashich (2003-04-02 13:55:00) [18]>Sam Stialy (02.04.03 13:41)
>Условие получается выборкой из БД в которой примерно 1.3M записей. И найти по ключу примерно быстрее, и намного, чем через SQL запрос
используй SQL и НИИ мозги!
Ильич (2003-04-02 13:52:00) [19]>Sam Stialy (02.04.03 13:41)
>Условие получается выборкой из БД в которой примерно 1.3M записей. И найти по ключу примерно быстрее, и намного, чем через SQL запрос
Неужели ? В самом деле ? И проверял ? И несколько раз ?
Эх, скажи спасибо, что нет здесь ни Джонмена, ни Александра, ни других Мастеров - они б тебя на молекулы разъяли !
Сканированием быстрее чем запросом ! Это надо выбить на мраморе и повесить в Школе Для Самоуверенных Дилетантов
Sam Stialy (2003-04-02 13:41:00) [20]Увы нет, нет и нет
Конечно можно сделасть запросом, но есть одно НО, которое и делает в данном случае невозмоность пременения SQL.
Условие получается выборкой из БД в которой примерно 1.3M записей. И найти по ключу примерно быстрее, и намного, чем через SQL запрос :(.