![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
перемещение строчки в DataSet?
Dimanch © (2003-02-03 10:41:00)Задача состоит в том, что в наборе данных, полученных с сервера, надо переместить запись. Попробовал отработать на локальной (Paradox) табличке примерно такой код:
AnsiString dstn = Data->Bookmark;
Data->Prior();
Data->Prior();
AnsiString source = Data->Bookmark;
char *buf = new char[Data->RecordSize];
Data->GetCurrentRecord(buf);
Data->Bookmark = dstn;
Data->Insert();
char *ptr = Data->ActiveBuffer();
for (int i = 0; i < Data->RecordSize; i++)
ptr[i] = buf[i];
Data->Post();
Data->Bookmark = source;
Data->Delete();
Data->Bookmark = dstn;
delete[] buf;
Поясню, курсор находится на третьей записи в наборе данных, после выполнения описанных действий должны поменяться местами 1-ая и 2-ая записи. Для случая, когда Data есть объект TTable - все ок (после 2-ой записи добавляется пустая, туда копируется 1-ая, а затем 1-ая запись удаляется), но если Data типа TQuery*, возникают проблемы. Первый раз все отрабатывает нормально, на второй раз происходит следующее: вставляется пустая запись, потом в нее копируются данные из 1-ой записи, и после Post, эта запись перемещается на одну позицию вверх (оказывается между 1-ой и 2-ой), потом удаляется 1-ая запись, и визуально кажется, что просто ничего не произошло. На третий раз - просто вылетает по "Invalid BLOB handle in record buffer".
Понятно, что бардак с указателями на записи (на область хранения), но непонятно, почему нет проблем с TTable, и самое главное, как все-таки переместить запись?
Dimanch (2003-02-03 15:10:00) [1]Еще вопрос. У меня проект в BCB3.0, там компонент TQuery (вызов хранимой процедуры), как ему скормить этот самый индекс?
Dimanch (2003-02-03 13:29:00) [2]Понял, попробую этот способ, спасибо
MsGuns (2003-02-03 12:42:00) [3]Если перемещение записи только "для грида", т.е. для удобства просмотра юзером, но не для реального изменения записи внутри какого-то набора уникальных ключей, то лучше всего использовать для датасета временный курсор (типа таблицы в памяти) и при этом все записи курсора "снабдить" доп.полем - номером порядковым. Вот с этим номером и производить манипуляции, "заставляя" выбранную запись перемещаться куда надо.
Dimanch (2003-02-03 12:09:00) [4]Хорошо, но тогда все-таки непонятно, почу по-разному ведет себя тест для TTable и TQuery. В таблице не определены индексы, а в запросе order by. Но таблица упорно работает как надо, а запрос упорно отказывается делать то что требуется. Все-таки может быть можно его тоже прочухать как-нибудь?
Dimanch (2003-02-03 12:01:00) [5]Дело в том, что запрос достаточно долго выполняется, и обновлять его часто - это неправильно, тем более для простого перемещения записи. Я думаю, что просто какой-то нюанс не учтен. Что же все-таки происходит по Post при Cached Updates = true, что новая строчка перемещается на позицию вверх (на второй и др. разы) и как этого избежать?
Johnmen (2003-02-03 11:53:00) [6]Последовательность записей в НД определяется только лишь указанием сортировки для запроса и активным индексом при исп-ии TTable.
В отсутствии указания сортировки упорядоченность НД непредсказуемая...:)
pl_quad (2003-02-03 11:49:00) [7]я бы завел поле с каким-либо признаком (возможно функцию) на серваке и юзал order by
Dimanch (2003-02-03 11:47:00) [8]Ну да, от лукавого:), кто спорит. Но вот лукавый:)) настаивает на перемещении строк в наборе данных. А чем таблица отличается от набора данных, вроде как понимаю:)
Dimanch (2003-02-03 11:42:00) [9]А что значит переместить значения? Без Insert()? Но это значит поменять местами записи, а не переместить одну. А если мне надо первую строчку куда-нибудь в конец? Не хотелось бы сдвигать весь набор для этого
Johnmen (2003-02-03 11:38:00) [10]Все эти манипуляции от лукавого...:)))
И от недопонимания, что есть таблица и НД, а это различные сущности...
gsu (2003-02-03 11:31:00) [11]>> как все-таки переместить запись
А переместить значения нельзя ?
Dimanch (2003-02-03 11:29:00) [12]Если обойтись без ActiveBuffer(), просто сохраняя Variant-значения полей перемещаемой записи, например
...
for (int i = 0; i < Table1->Fields->Count; i++)
Data->Fields->Fields[i]->Value = buf[i];
...
то все то же самое, только больше не появляется ошибка, а запись все равно перемещается один раз. Конечно, если эту операцию проделывать в другом месте набора данных, то там все срабатывает, но тоже только один раз.