![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TClientDataSet: страноости с Eof [D7]
Juice © (2006-05-12 13:40:00)В наборе данных две записи (RecordCount=2).
DataSet стоит на первой записи(RecNo=1), редактирую ее, вызываю Next - датасет становится на вторую запись(RecNo=2) и DataSet.Eof становится в true. Как это понимать, это глюк такой или как такое возможно ? Перед всеми этими действиями все что я делаю так это меняю один индекс на другой.
Desdechado (2006-06-20 10:54:00) [1]Из справки:
Note: You cannot delete the reserved indexes, DEFAULT_ORDER and CHANGEINDEX.
А по поводу странных строчных сортировок - хочу видеть пример.
doomer (2006-06-19 22:16:00) [2]
> в CDS нельзя отменить индекс вообще, можно только включить
> исходный порядок (тоже индекс)
а нельзя по подробнее? у меня вот странно строки локально сортируются...
Juice (2006-05-12 18:38:00) [3]Только на OnReconcile навешен обработчик, больше ничего.
Desdechado (2006-05-12 18:17:00) [4]а в других обработчиках CDS нет чего-нибудь еще?
может, на AfterPost какие-то индексы выставляются?
Juice (2006-05-12 17:11:00) [5]
> всетаки ты чегото не учитываеш, порядок сортировки явно
> на quantity стоит
Я ж говорю, после поста изменятся текущая запись - другие поля, другая позиция.
sniknik (2006-05-12 16:38:00) [6]всетаки ты чегото не учитываеш, порядок сортировки явно на quantity стоит, попробуй поменяй на другое поле
cdsPortfMng.IndexName:= 'newquant';
cdsPortfMng.First;
while not cdsPortfMng.Eof do
begin
cdsPortfMng.Edit;
cdsPortfMng.FieldByName('quantity').AsInteger := 0;
cdsPortfMng.Next;
end;
так, как?
Juice (2006-05-12 16:17:00) [7]Кстати кстати, а оказывается что после поста происходит именно перескок, я посмотрел PK до и после поста. Не, прикольно конечно, я могу и prior вызывать, и вообще могу цикл не while а for делать и проблема решится, но просто КАКОГО @#$ такая засада в ихнем коде сидит ?
Juice (2006-05-12 16:07:00) [8]Нет , Order By не стоит, IndexName='', ну что еще может быть?
Запрос простой : select * from PF_MAIN where orgid=:orgid and datepf=:datepf
Desdechado (2006-05-12 16:00:00) [9]происходит не перескок на следующую запись, а изменение номера у текущей
еще раз см. 2-ю часть Desdechado © (12.05.06 14:04) [4]
Juice (2006-05-12 15:56:00) [10]Да, после явного Post и происходит перескок на следующую запись (только в случае когда полю присвоить 0). И почему так?
Desdechado (2006-05-12 15:48:00) [11]> я попробовал отменить индекс вообще
в CDS нельзя отменить индекс вообще, можно только включить исходный порядок (тоже индекс)
Desdechado (2006-05-12 15:46:00) [12]Next приводит к неявному Post
поэтому ты смотри recno после явного Post, а потом после Next
Juice (2006-05-12 15:46:00) [13]И вообще участвовать не в чем, т.к. я попробовал отменить индекс вообще. Блин, присваеваешь cdsPortfMng.FieldByName('quantity').AsInteger := 0 и начинает глючить, присваеваешь любое другое значение - все нормально. Что за хрень такая ? Библиотека глючит?
Juice (2006-05-12 14:23:00) [14]
> в этом и причина - меняется порядок записей
> отредактированная становится второй, после чего Next приводит
> к EOF
Поле что редактируется ('quantity') не учавствует в индексе.
Juice (2006-05-12 14:21:00) [15]Локализовал проблему. Пишу так :
cdsPortfMng.First;
while not cdsPortfMng.Eof do
begin
cdsPortfMng.Edit;
cdsPortfMng.FieldByName('quantity').AsInteger := 1;
cdsPortfMng.Next;
end;
Все нормально, 2 прохода.
Теперь изменяю так :
cdsPortfMng.First;
while not cdsPortfMng.Eof do
begin
cdsPortfMng.Edit;
cdsPortfMng.FieldByName('quantity').AsInteger := cdsPortfMng.FieldByName('newquant').AsInteger; //после этого оператора RecNo все еще = 1
cdsPortfMng.Next;
end;
И логика сбивается ! Как может обращение к cdsPortfMng.FieldByName('newquant') повлиять на результат Eof, именно повлиять, поскольку после присвоения RecNo не изменяется, остается 1.
Desdechado (2006-05-12 14:04:00) [16]> меняю один индекс на другой
в этом и причина - меняется порядок записей
отредактированная становится второй, после чего Next приводит к EOF
а также помни, что если ты делаешь выборку с ORDER BY, то CDS это помнит и при изменении значения полей, участвующих в ORDER BY, он переупорядочит записи
Johnmen (2006-05-12 14:02:00) [17]Всё, как ты сказал, как написано в справке.
У тебя, видимо, два некста выходит... Приводи подробности.
Juice (2006-05-12 13:57:00) [18]Разве это стандартное ? По идее стандартное это когда стоя на последней записи ПОСЛЕ вызова Next изменяется Eof в true. Вот и в справке написано :
with CustTable do
begin
DisableControls;
try
First;
while not Eof do
begin
{ Process each record here }
Next;
end;
finally
EnableControls;
end;
end;
Это справка по Eof, Delphi Example.
Если по-вашему то получается что после первого же Nexta в DatSete с двумя записями мы получим Eof и таким образом {Process each record here } для второй записи выполнен не будет.
Johnmen (2006-05-12 13:47:00) [19]Это СТАНДАРТНОЕ БАЗОВОЕ поведение ЛЮБОГО набора данных.
Чтобы это понять, достаточно почитать Eof+F1, Next+F1