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

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

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


Наверх

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