Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
6-1144012942
MVP
2006-04-03 01:22
2006.08.27
Подмена картинок на форуме


3-1150725870
Olegas
2006-06-19 18:04
2006.08.27
Плагины в bpl и заморочки с TTable


2-1154898634
Alral
2006-08-07 01:10
2006.08.27
Character


4-1146654047
Тфьу
2006-05-03 15:00
2006.08.27
Как отследить процесс перемещения компонента?


2-1154938598
Yeg
2006-08-07 12:16
2006.08.27
Drag&Drop файлов из программы