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

Вниз

Или лыжи не едут, или что-то не так   Найти похожие ветки 

 
pasha_golub ©   (2006-08-22 18:49) [0]

В моем потомке ТДатасет при отображении через TDBGrid творяться чудныя вещи. То строки дублируются, то не дублируются, то поля пустые. В таблице то их всего-то три. А в гриде штук 12 вылазит. Я уж подумал, что кривизна рук не совместима с жизню. Потом лезу в исходники TDataLink из DB.pas и шо  я вижу:


function TDataLink.GetRecordCount: Integer;
begin
 if DataSource.State = dsSetKey then Result := 1 else
 begin
   Result := DataSource.DataSet.FRecordCount;
   if Result > FBufferCount then Result := FBufferCount;
 end;
end;


А на кой хрен, спрашивается, было определять виртуальный метод TDataset.GetRecordCount:


function TDataSet.GetRecordCount: Longint;
begin
 Result := -1;
end;


Да еще и в хелпе писать:
As implemented in TDataSet, RecordCount is always -1. Ordinarily an application does not access RecordCount at the TDataSet level. Instead a redeclared and implemented RecordCount property in a descendant class is accessed. RecordCount provides a fallback property for derived dataset classes that do not reimplement the property access method.

Плюс FRecordCount в привате объявлен.

Ну, вот скажите, мне кто на асфальте в лыжи обутый, а? Три дня убил, блин... Уйду на Миддлет Паскаль, к чертям! ;-(


 
Ega23 ©   (2006-08-22 18:53) [1]


>  Result := DataSource.DataSet.FRecordCount;


Ага. В своё время, когда ковырял всю эту связку TDataSet -> TDataSource -> TDataLink был несказанно удивлён этой строчкой.
Даже, скажем, шокирован.


 
pasha_golub ©   (2006-08-22 18:54) [2]


> Ega23 ©   (22.08.06 18:53) [1]
>
>

А шо ж ты молчал-то? ;0)


 
Ega23 ©   (2006-08-22 18:58) [3]


> А шо ж ты молчал-то? ;0)


Почему? Как раз где-то с год назад, когда своё DBTree писал, именно этот вопрос и задавал. Общественность руками развела, мол "Это Борланд, им можно"...


 
pasha_golub ©   (2006-08-22 18:59) [4]


> Ega23 ©   (22.08.06 18:58) [3]

И как победил? А что-то у меня мозг тупит, собака.


 
Ega23 ©   (2006-08-22 19:07) [5]

А никак...  :(
Компонент будет работать только с теми потомками TDataSet, которые при открытии данные до конца фетчат. Хотя я уже давно ничего кроме TADODataSet и TClientDataSet не использую.


 
ANB ©   (2006-08-22 19:16) [6]


> pasha_golub ©   (22.08.06 18:59) [4]

Посмотреть исходники одака или DOA. Там как то обошли, скорее всего писали свой TDataSet. Ща под рукой нету - подсказал бы. Скопируй и не мучайся.


 
pasha_golub ©   (2006-08-22 19:17) [7]

Не, ну я абсолютно нифига не понимаю. Использование FRecordCount размазано по всему TDataset. И в тоже время никакой возможности присвоить реальные данные ему не придвидится. Может там у него другое тайное предназначение, типо флаг, есть ли строки вообще?


 
Ega23 ©   (2006-08-22 19:19) [8]

А ты чего там ваяешь-то? Свою СУБД с компонентами доступа? А то вопросы у тебя больно интересные в последнее время...   :о)


 
pasha_golub ©   (2006-08-22 19:23) [9]


> ANB ©   (22.08.06 19:16) [6]

Глянем. Однако, вся прелесть в том, что данная гадость возникает при изумительныих условиях. А именно:

1. Используется TDBGrid
2. Имеется TMemoField
3. Имеется calculated field, который TStringField. И в итоге представляет собой нечто такое: StrField.AsString := Copy(memoField.AsString,1,100);

При других условиях, ну хоть ты танцуй никаких намеков на такое поведение. Мистика, блин.

Ща попробую проверить на TcxDBGrid... И заодно через стандартный TQuery..


 
pasha_golub ©   (2006-08-22 19:24) [10]


> Ega23 ©   (22.08.06 19:19) [8]

Доваиваю. :0) Компоненты доступа.


 
pasha_golub ©   (2006-08-22 19:31) [11]

Вообщем, при более глубоком изучении создалось впечатление, что FRecordCount таки растет. Однако странным для меня образом.

До упора вызывается GetNextRecords & GetNextrecord, которые в свою очередь увеличивают FBufferCount. В дебрях того же датасета происходит проверка

If FRecordCount < FBufferCount then Inc(FRecordCount)

От чего мой воспаленный мозг делает вывод, что дяди из Борланда учитывали, что кол-во записей на момент чтения оных может быть не известно. Не исповедимы пути Господни. Воистину. Ибо.


 
jack128 ©   (2006-08-22 20:34) [12]

pasha_golub ©   (22.08.06 19:31) [11]
что дяди из Борланда учитывали, что кол-во записей на момент чтения оных может быть не известно

Вполне может быть. В IBX так и есть, например.


 
pasha_golub ©   (2006-08-22 21:24) [13]

Мужики, а знает ли кто-нибудь хорошее чтиво по внутренностям DB.pas и TDataset, в частности? Хелп явно не дотягивает. Пойдет, что угодно. В news"ах бывают прекрасные ветки.

ЗЫ Читал Голованова&Веселова "Создание компонентов ...". Есть информация, но мало.


 
Petr V. Abramov ©   (2006-08-23 00:06) [14]

> pasha_golub ©   (22.08.06 19:23) [9]
 может, "особенности" TGridDataLink?


 
pasha_golub ©   (2006-08-23 00:11) [15]


> Petr V. Abramov ©   (23.08.06 00:06) [14]

Да нет. Скорее всего мои собственные особенности, которые не учли особенности TGriddatalink. :0)


 
Petr V. Abramov ©   (2006-08-23 00:14) [16]

> pasha_golub ©   (23.08.06 00:11) [15]
 ну оно понятно, что все особенности TGridDataLink называются фичами по оперделению и нних надо ориентироваться :)


 
Anatoly Podgoretsky ©   (2006-08-23 00:48) [17]

Нервы надо лечить.


 
pasha_golub ©   (2006-08-23 10:07) [18]


> Anatoly Podgoretsky ©   (23.08.06 00:48) [17]

Как всегда глубокомысленно и не понятно. :P


 
Desdechado ©   (2006-08-23 10:54) [19]

> Ega23 ©   (22.08.06 19:07) [5]
> Компонент будет работать только с теми потомками TDataSet,
>  которые при открытии данные до конца фетчат. Хотя я уже
> давно ничего кроме TADODataSet и TClientDataSet не использую.
Кстати, TClientDataSet умеет фетчить по запросу и пачками. Хотя по умолчанию - до конца.


 
Ega23 ©   (2006-08-23 11:40) [20]


> Кстати, TClientDataSet умеет фетчить по запросу и пачками.
>  Хотя по умолчанию - до конца.


Я знаю.
Кстати, именно из-за этой особенности (GetRecordCount) я компонент не стал в сеть выкладывать - уж очень он ограниченным получается...


 
pasha_golub ©   (2006-08-23 11:58) [21]

Вывод пока у меня один - нужно следить за количеством буфферов. И все будет ОК. Так как FRecordCount будет синхронизироваться. И пофигу пачками или заначками тащаться строки.


 
pasha_golub ©   (2006-08-23 12:32) [22]

Статья по написанию Датасетов: http://www.gexperts.com/CustomDS.html


 
Андрей Пазик   (2006-08-23 13:21) [23]

Паша, зачем тебе стандартный грид? VirtualTree намного лучше в плане управляемости и скорости. Причем твой грид получается изначально заточенным под древообразную структуру, которая может пригодиться.


 
pasha_golub ©   (2006-08-23 14:28) [24]

Да мне то он и не нужен. Однако юзерам я не могу навязывать ничего.

Кстати, обнаружилось, что нельзя использовать данные из БЛОБов в расчетах calculated fields. Сами же ребяты из Борланда об этом говорят:

http://groups.google.ru/group/borland.public.delphi.database.sqlservers/browse_thread/thread/5fd81dd76f49ccb6/fdbd1b6bad4a9144?lnk=st&q=borland+calculated+fields+memo&rnum=5#fdbd1b6bad4a9144

Так что это, видимо, какие-то ограничения TDataset.


 
Чапаев ©   (2006-08-23 19:00) [25]

> В моем потомке ТДатасет при отображении через TDBGrid творяться
> чудныя вещи

Как человек, написавший некогда потомка TDataSet и помнящий основные "шишки", смею предположить, что где-то чему-то ты присваиваешь ActiveBuffer. Присваивай его локальную копию! ;-)



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.039 c
15-1156137693
Ega23
2006-08-21 09:21
2006.09.17
С Днём рождения! 19 - 21 августа


1-1155006078
vladimirg88
2006-08-08 07:01
2006.09.17
Координаты картинки


15-1156859319
Chort
2006-08-29 17:48
2006.09.17
MathCad против Delphi


2-1156775394
AlexanderMS
2006-08-28 18:29
2006.09.17
Флаги.


15-1156936062
Layner
2006-08-30 15:07
2006.09.17
Помогите разобраться с формулировкой (1й курс) :(