Форум: "Базы";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизTClientDataSet: страноости с Eof Найти похожие ветки
← →
Juice © (2006-05-12 13:40) [0]В наборе данных две записи (RecordCount=2).
DataSet стоит на первой записи(RecNo=1), редактирую ее, вызываю Next - датасет становится на вторую запись(RecNo=2) и DataSet.Eof становится в true. Как это понимать, это глюк такой или как такое возможно ? Перед всеми этими действиями все что я делаю так это меняю один индекс на другой.
← →
Johnmen © (2006-05-12 13:47) [1]Это СТАНДАРТНОЕ БАЗОВОЕ поведение ЛЮБОГО набора данных.
Чтобы это понять, достаточно почитать Eof+F1, Next+F1
← →
Juice © (2006-05-12 13:57) [2]Разве это стандартное ? По идее стандартное это когда стоя на последней записи ПОСЛЕ вызова 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 14:02) [3]Всё, как ты сказал, как написано в справке.
У тебя, видимо, два некста выходит... Приводи подробности.
← →
Desdechado © (2006-05-12 14:04) [4]> меняю один индекс на другой
в этом и причина - меняется порядок записей
отредактированная становится второй, после чего Next приводит к EOF
а также помни, что если ты делаешь выборку с ORDER BY, то CDS это помнит и при изменении значения полей, участвующих в ORDER BY, он переупорядочит записи
← →
Juice © (2006-05-12 14:21) [5]Локализовал проблему. Пишу так :
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.
← →
Juice © (2006-05-12 14:23) [6]
> в этом и причина - меняется порядок записей
> отредактированная становится второй, после чего Next приводит
> к EOF
Поле что редактируется ("quantity") не учавствует в индексе.
← →
Juice © (2006-05-12 15:46) [7]И вообще участвовать не в чем, т.к. я попробовал отменить индекс вообще. Блин, присваеваешь cdsPortfMng.FieldByName("quantity").AsInteger := 0 и начинает глючить, присваеваешь любое другое значение - все нормально. Что за хрень такая ? Библиотека глючит?
← →
Desdechado © (2006-05-12 15:46) [8]Next приводит к неявному Post
поэтому ты смотри recno после явного Post, а потом после Next
← →
Desdechado © (2006-05-12 15:48) [9]> я попробовал отменить индекс вообще
в CDS нельзя отменить индекс вообще, можно только включить исходный порядок (тоже индекс)
← →
Juice © (2006-05-12 15:56) [10]Да, после явного Post и происходит перескок на следующую запись (только в случае когда полю присвоить 0). И почему так?
← →
Desdechado © (2006-05-12 16:00) [11]происходит не перескок на следующую запись, а изменение номера у текущей
еще раз см. 2-ю часть Desdechado © (12.05.06 14:04) [4]
← →
Juice © (2006-05-12 16:07) [12]Нет , Order By не стоит, IndexName="", ну что еще может быть?
Запрос простой : select * from PF_MAIN where orgid=:orgid and datepf=:datepf
← →
Juice © (2006-05-12 16:17) [13]Кстати кстати, а оказывается что после поста происходит именно перескок, я посмотрел PK до и после поста. Не, прикольно конечно, я могу и prior вызывать, и вообще могу цикл не while а for делать и проблема решится, но просто КАКОГО @#$ такая засада в ихнем коде сидит ?
← →
sniknik © (2006-05-12 16:38) [14]всетаки ты чегото не учитываеш, порядок сортировки явно на 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 17:11) [15]
> всетаки ты чегото не учитываеш, порядок сортировки явно
> на quantity стоит
Я ж говорю, после поста изменятся текущая запись - другие поля, другая позиция.
← →
Desdechado © (2006-05-12 18:17) [16]а в других обработчиках CDS нет чего-нибудь еще?
может, на AfterPost какие-то индексы выставляются?
← →
Juice © (2006-05-12 18:38) [17]Только на OnReconcile навешен обработчик, больше ничего.
← →
doomer (2006-06-19 22:16) [18]
> в CDS нельзя отменить индекс вообще, можно только включить
> исходный порядок (тоже индекс)
а нельзя по подробнее? у меня вот странно строки локально сортируются...
← →
Desdechado © (2006-06-20 10:54) [19]Из справки:
Note: You cannot delete the reserved indexes, DEFAULT_ORDER and CHANGEINDEX.
А по поводу странных строчных сортировок - хочу видеть пример.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c