![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
хранение значенй TBookmarkStr [D7, MSSQL]
Arm79 © (2006-03-24 14:22:00)У меня такой вопрос посетителям форума.
Как правильно хранить список закладок?
я сделал так:
......
FUpdatedRows := TStringList.Create;
with FUpdatedRows do
begin
Sorted := True;
Duplicates := dupError;
end;
...
FUpdatedRows.Add(cdsOrders.Bookmark);
...
При заполнении гарантированно все строки новые, то есть идет только инсерт. Тем не менее, возникает ошибка дублирования
Есть подозрение, что TStringList некорректно обрабатывает сортировку с таким типом данных. Подскажите другой способ хранить данные
Arm79 (2006-03-24 18:29:00) [1]
> sniknik © (24.03.06 18:13) [20]
> cached updates ... ClientDataSet.Modified
> все что в [5] только "желается" в cached updates уже реализовано.
>
Сейчас почитаю
> vovnuke © (24.03.06 18:23) [21]
> странно???.
> У меня похожий код работает, щас экпериментировал с DBGrid
> и ClientDataSet.
> могу предположить только то, что действительно одинаковые
> закладки, поробуй их вывести куда-нибудь.
Посмотрю. Я - домой. Если на выходных руки дойдут - переделаю все.
Спасибо за помощь
vovnuke (2006-03-24 18:23:00) [2]странно???.
У меня похожий код работает, щас экпериментировал с DBGrid и ClientDataSet.
могу предположить только то, что действительно одинаковые закладки, поробуй их вывести куда-нибудь.
sniknik (2006-03-24 18:13:00) [3]cached updates ... ClientDataSet.Modified
все что в [5] только "желается" в cached updates уже реализовано.
Arm79 (2006-03-24 17:22:00) [4]cds - ClientDataSet
vovnuke (2006-03-24 17:06:00) [5]а какого типа cdsOrders?
Arm79 (2006-03-24 17:01:00) [6]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 ......
Johnmen (2006-03-24 16:27:00) [7]Кстати.
Набей свой FUpdatedRows букмаркастр'ми попростому, нескольких записей cdsOrders. Посмотри что там в FUpdatedRows получилось...
Arm79 (2006-03-24 16:20:00) [8]нет, не один. Но в моем случае ошибка выпадает именно при первом вызове.
а во вторых:
> i := FUpdatedRows.IndexOf(cdsOrders.Bookmark);
> if i > -1
> then FUpdatedRows.Delete(i);
Johnmen (2006-03-24 16:19:00) [9]
> если не затруднит, где ДВА раза?
Хм-м-м... А процедура UpdateStorage вызывается один раз за время работы программы?
Arm79 (2006-03-24 16:00:00) [10]
> И так два разА -> ошибка
если не затруднит, где ДВА раза?
Johnmen (2006-03-24 15:53:00) [11]cdsOrders.Edit;
...
cdsOrders.Post;
...
FUpdatedRows.Add(cdsOrders.Bookmark); // <-- Здесь ошибка
И так два разА -> ошибка
Arm79 (2006-03-24 15:47:00) [12]
> Ткни меня в хелп...:)
прошу прощения, не в хелпе :)))
но все равно. я точно не придумал это сам, а вычитал где то.
но конечно строковые закладки были бы для меня гораздо предпочтительнее
Arm79 (2006-03-24 15:36:00) [13]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;
Johnmen (2006-03-24 15:34:00) [14]
> Arm79 © (24.03.06 15:15) [5]
> Я тоже над этим думал, но в хелпе сказано, что рекомендуется
> пользоваться TBookmarkStr, а указатели оставлены для совместимости
> с предыдущими версиями Delphi
Ткни меня в хелп...:)
vovnuke (2006-03-24 15:30:00) [15]при Duplicates := dupIgnore, игнорируетпопытку добавить такую же строку которая уже есть.
при Duplicates := dupError, генерирует ошибкупри попытке добавить такую же строку которая уже есть.
А в какой момент ты добавляешь закладку?
Arm79 (2006-03-24 15:23:00) [16]
> Ega23 © (24.03.06 15:20) [6]
>
> Заводишь в выборке дополнительное поле RecordStatus, изначально
> равно 0. Как запись обработана - апдейтишь его на 1.
> Всё.
Изначально так и было. Но мне показалось, что с закладками должно быть не только быстрее, но и более правильнее логически. Хотя бы потому, что список полей в той таблице формируется динамически
Ega23 (2006-03-24 15:20:00) [17]
> задача - держать в памяти таблицу данных
>
> туда поступают данные. все поступившие новые записи имеют
> статус необработанных.
Заводишь в выборке дополнительное поле RecordStatus, изначально равно 0. Как запись обработана - апдейтишь его на 1.
Всё.
Arm79 (2006-03-24 15:15:00) [18]задача - держать в памяти таблицу данных
туда поступают данные. все поступившие новые записи имеют статус необработанных. Я завел StringList для хранения закладок на добавленные или измененные строки. После обработки из этого списка соответствующая закладка удаляется. Таким образом обеспечивается актуальная информация о необработанных строках.
Логика подсказывает, что если ТОЛЬКО ДОБАВЛЯТЬ строки, то каждая закладка должна быть уникальна, и никогда не повторяться
тем не менее, отсортированный список строк с Duplicates = dupError генерирует ошибку дубликации данных. Duplicates = dupIgnore предполагает ситуацию, когда одна закладка может указывать на 2 разные записи, что не только неприемлемо, но и скорее всего невозможно
> Johnmen © (24.03.06 14:55) [3]
> >Подскажите другой способ хранить данные
>
> TList + GetBookmark
Я тоже над этим думал, но в хелпе сказано, что рекомендуется пользоваться TBookmarkStr, а указатели оставлены для совместимости с предыдущими версиями Delphi
vovnuke (2006-03-24 15:04:00) [19]А что ты хочешь получить?
Если ты хочешь получить список уникальных закладок, то Duplicates := dupIgnore.
Johnmen (2006-03-24 14:55:00) [20]>Подскажите другой способ хранить данные
TList + GetBookmark