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

Вниз

хранение значенй TBookmarkStr   Найти похожие ветки 

 
Arm79 ©   (2006-03-24 14:22) [0]

У меня такой вопрос посетителям форума.

Как правильно хранить список закладок?

я сделал так:

 ......
 FUpdatedRows  := TStringList.Create;
 with FUpdatedRows do
 begin
   Sorted      := True;
   Duplicates  := dupError;
 end;
 ...
 FUpdatedRows.Add(cdsOrders.Bookmark);
 ...

При заполнении гарантированно все строки новые, то есть идет только инсерт. Тем не менее, возникает ошибка дублирования

Есть подозрение, что TStringList некорректно обрабатывает сортировку с таким типом данных. Подскажите другой способ хранить данные


 
Ega23 ©   (2006-03-24 14:24) [1]

type TBookmark = Pointer;

ПРИ ЧЁМ ТУТ TStringList?????????????????????????????


 
Arm79 ©   (2006-03-24 14:25) [2]

Нет

bookmark : TBookmarkStr = string


 
Johnmen ©   (2006-03-24 14:55) [3]

>Подскажите другой способ хранить данные

TList + GetBookmark


 
vovnuke ©   (2006-03-24 15:04) [4]

А что ты хочешь получить?
Если ты хочешь получить список уникальных закладок, то Duplicates := dupIgnore.


 
Arm79 ©   (2006-03-24 15:15) [5]

задача - держать в памяти таблицу данных

туда поступают данные. все поступившие новые записи имеют статус необработанных. Я завел StringList для хранения закладок на добавленные или измененные строки. После обработки из этого списка соответствующая закладка удаляется. Таким образом обеспечивается актуальная информация о необработанных строках.

Логика подсказывает, что если ТОЛЬКО ДОБАВЛЯТЬ строки, то каждая закладка должна быть уникальна, и никогда не повторяться

тем не менее, отсортированный список строк с Duplicates = dupError генерирует ошибку дубликации данных. Duplicates = dupIgnore предполагает ситуацию, когда одна закладка может указывать на 2 разные записи, что не только неприемлемо, но и скорее всего невозможно


> Johnmen ©   (24.03.06 14:55) [3]
> >Подскажите другой способ хранить данные
>
> TList + GetBookmark


Я тоже над этим думал, но в хелпе сказано, что рекомендуется пользоваться TBookmarkStr, а указатели оставлены для совместимости с предыдущими версиями Delphi


 
Ega23 ©   (2006-03-24 15:20) [6]


> задача - держать в памяти таблицу данных
>
> туда поступают данные. все поступившие новые записи имеют
> статус необработанных.


Заводишь в выборке дополнительное поле RecordStatus, изначально равно 0. Как запись обработана - апдейтишь его на 1.
Всё.


 
Arm79 ©   (2006-03-24 15:23) [7]


> Ega23 ©   (24.03.06 15:20) [6]
>
> Заводишь в выборке дополнительное поле RecordStatus, изначально
> равно 0. Как запись обработана - апдейтишь его на 1.
> Всё.


Изначально так и было. Но мне показалось, что с закладками должно быть не только быстрее, но и более правильнее логически. Хотя бы потому, что список полей в той таблице формируется динамически


 
vovnuke ©   (2006-03-24 15:30) [8]

при Duplicates := dupIgnore, игнорирует попытку добавить такую же строку которая уже есть.
при Duplicates := dupError, генерирует ошибку при попытке добавить такую же строку которая уже есть.
А в какой момент ты добавляешь закладку?


 
Johnmen ©   (2006-03-24 15:34) [9]


> Arm79 ©   (24.03.06 15:15) [5]
> Я тоже над этим думал, но в хелпе сказано, что рекомендуется
> пользоваться TBookmarkStr, а указатели оставлены для совместимости
> с предыдущими версиями Delphi


Ткни меня в хелп...:)


 
Arm79 ©   (2006-03-24 15:36) [10]

2 vovnuke ©   (24.03.06 15:30) [8]

> Duplicates := dupIgnore, игнорирует попытку добавить такую
> же строку которая уже есть.

я это знаю :))))


> А в какой момент ты добавляешь закладку?

procedure TOrderStorage.UpdateStorage(const NewData : TDataSet;
 const BookmarkList: TStringList = nil; const IsinList : TStringList = nil);
 var
   bmTemp: TBookmarkStr;
   i     : Integer;
begin
 if not NewData.Active
 then Exit;

 Lock;

 bmTemp := NewData.Bookmark;

 with NewData do
 begin
   First;
   while not Eof do
   begin
     if cdsOrders.Locate("id_ord", FieldValues["id_ord"], [loCaseInsensitive])
     then begin
       i := FUpdatedRows.IndexOf(cdsOrders.Bookmark);
       if i > -1
       then FUpdatedRows.Delete(i);
       cdsOrders.Edit;
     end
     else cdsOrders.Insert;

     for i := 0 to Fields.Count-1
     do begin
       if Assigned(FindField(Fields[i].FieldName))
       then begin
         cdsOrders[Fields[i].FieldName] := Fields[i].Value;
       end;
     end;

     cdsOrders.Post;

     FUpdatedIsins.Add(FieldValues["isin"]);
     FUpdatedRows.Add(cdsOrders.Bookmark); // <-- Здесь ошибка

     if Assigned(BookmarkList)
     then BookmarkList.Add(cdsOrders.Bookmark);
     if Assigned(IsinList)
     then IsinList.Add(FieldValues["isin"]);

     Next;
   end;
 end;

 NewData.Bookmark := bmTemp;

 UnLock;
end;


 
Arm79 ©   (2006-03-24 15:47) [11]


> Ткни меня в хелп...:)

прошу прощения, не в хелпе :)))
но все равно. я точно не придумал это сам, а вычитал где то.

но конечно строковые закладки были бы для меня гораздо предпочтительнее


 
Johnmen ©   (2006-03-24 15:53) [12]

cdsOrders.Edit;
...
cdsOrders.Post;
...
FUpdatedRows.Add(cdsOrders.Bookmark); // <-- Здесь ошибка

И так два разА -> ошибка


 
Arm79 ©   (2006-03-24 16:00) [13]


> И так два разА -> ошибка

если не затруднит, где ДВА раза?


 
Johnmen ©   (2006-03-24 16:19) [14]


> если не затруднит, где ДВА раза?


Хм-м-м... А процедура UpdateStorage вызывается один раз за время работы программы?


 
Arm79 ©   (2006-03-24 16:20) [15]

нет, не один. Но в моем случае ошибка выпадает именно при первом вызове.

а во вторых:

>  i := FUpdatedRows.IndexOf(cdsOrders.Bookmark);
>  if i > -1
>  then FUpdatedRows.Delete(i);


 
Johnmen ©   (2006-03-24 16:27) [16]

Кстати.
Набей свой FUpdatedRows букмаркастр"ми попростому, нескольких записей cdsOrders. Посмотри что там в FUpdatedRows получилось...


 
Arm79 ©   (2006-03-24 17:01) [17]

Text = #1#0#0#0#0#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#$D#$A#1#0#0#0#0#0#0#0#2#0#0#0#2#0#0#0#1 #0#0#0#$D#$A#1#0#0#0#0#0#0#0#3#0#0#0#3#0#0#0#1#0#0#0#$D#$A#1#0#0#0#0#0#0#0#4#0#0 #0#4#0#0#0#1#0#0#0#$D#$A#1#0#0#0#0#0#0#0#5#0#0#0#5#0#0#0#1#0#0#0#$D#$A ......


 
vovnuke ©   (2006-03-24 17:06) [18]

а какого типа cdsOrders?


 
Arm79 ©   (2006-03-24 17:22) [19]

cds - ClientDataSet


 
sniknik ©   (2006-03-24 18:13) [20]

cached updates ... ClientDataSet.Modified
все что в [5] только "желается" в cached updates уже реализовано.


 
vovnuke ©   (2006-03-24 18:23) [21]

странно???.
У меня похожий код работает, щас экпериментировал с DBGrid и ClientDataSet.
могу предположить только то, что действительно одинаковые закладки, поробуй их вывести куда-нибудь.


 
Arm79 ©   (2006-03-24 18:29) [22]


> sniknik ©   (24.03.06 18:13) [20]
> cached updates ... ClientDataSet.Modified
> все что в [5] только "желается" в cached updates уже реализовано.
>

Сейчас почитаю


> vovnuke ©   (24.03.06 18:23) [21]
> странно???.
> У меня похожий код работает, щас экпериментировал с DBGrid
> и ClientDataSet.
> могу предположить только то, что действительно одинаковые
> закладки, поробуй их вывести куда-нибудь.

Посмотрю. Я - домой. Если на выходных руки дойдут - переделаю все.

Спасибо за помощь



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

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

Наверх




Память: 0.53 MB
Время: 0.04 c
3-1143189457
VitaWED
2006-03-24 11:37
2006.05.21
SQL Server и большие объемы


15-1145735753
Kolan
2006-04-22 23:55
2006.05.21
Полезная программа или нет?


2-1146505658
rust01
2006-05-01 21:47
2006.05.21
Чудеса с переменными №2


6-1138024115
frEE)styler
2006-01-23 16:48
2006.05.21
Подсчитать трафик определенного сайта


15-1146022327
Vitaliy
2006-04-26 07:32
2006.05.21
TTryIcon