Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление по индексу таблицы Paradox [D5, Paradox]


Страницы:   1 2 3

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;

а лучше через запрос (по возможности)

а вопще ГДЕ код то ???


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо