Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
9-1133447973
Cash
2005-12-01 17:39
2006.08.27
OpenGL - Создание текстур


11-1131652752
Flea
2005-11-10 22:59
2006.08.27
MHFindReplaceDialog


15-1153207818
novoalex
2006-07-18 11:30
2006.08.27
FreeBSD


6-1144603398
Izolda
2006-04-09 21:23
2006.08.27
Поисковая система


9-1116212592
Xeno
2005-05-16 07:03
2006.08.27
Экшн с элементами RTS - ЭДЕМ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский