Главная страница
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.035 c
9-1133725230
Click
2005-12-04 22:40
2006.08.27
Ищу урок


2-1154962705
Alral
2006-08-07 18:58
2006.08.27
Poluchenie simvola v TMemo


15-1153955958
Dust
2006-07-27 03:19
2006.08.27
Редактор исходного кода с аутлайнингом


15-1154237704
Alert2006
2006-07-30 09:35
2006.08.27
PhotoShop


1-1152890545
oleggar
2006-07-14 19:22
2006.08.27
как упростить ввод ?