Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

перемещение строчки в 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];
...


то все то же самое, только больше не появляется ошибка, а запись все равно перемещается один раз. Конечно, если эту операцию проделывать в другом месте набора данных, то там все срабатывает, но тоже только один раз.


Наверх

Титульная страница Поиск, карта сайта Написать письмо