Форум: "Базы";
Текущий архив: 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.013 c