Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Вниз

хранение значенй 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.015 c
4-1140673293
delphi-oracle
2006-02-23 08:41
2006.05.21
Как получить строку SendMessage


2-1146503348
sarafat
2006-05-01 21:09
2006.05.21
получение картинки из сети


2-1146402413
Ezorcist
2006-04-30 17:06
2006.05.21
Узнать разрешение экрана


2-1146582089
AlexanderMS
2006-05-02 19:01
2006.05.21
Нет тильде!


2-1146655911
Vetas
2006-05-03 15:31
2006.05.21
Печать Tchart





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский