Форум: "Базы";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
Внизперемещение строчки в DataSet? Найти похожие ветки
← →
Dimanch (2003-02-03 10:41) [0]Задача состоит в том, что в наборе данных, полученных с сервера, надо переместить запись. Попробовал отработать на локальной (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 11:29) [1]Если обойтись без ActiveBuffer(), просто сохраняя Variant-значения полей перемещаемой записи, например
...
for (int i = 0; i < Table1->Fields->Count; i++)
Data->Fields->Fields[i]->Value = buf[i];
...
то все то же самое, только больше не появляется ошибка, а запись все равно перемещается один раз. Конечно, если эту операцию проделывать в другом месте набора данных, то там все срабатывает, но тоже только один раз.
← →
gsu (2003-02-03 11:31) [2]>> как все-таки переместить запись
А переместить значения нельзя ?
← →
Johnmen (2003-02-03 11:38) [3]Все эти манипуляции от лукавого...:)))
И от недопонимания, что есть таблица и НД, а это различные сущности...
← →
Dimanch (2003-02-03 11:42) [4]А что значит переместить значения? Без Insert()? Но это значит поменять местами записи, а не переместить одну. А если мне надо первую строчку куда-нибудь в конец? Не хотелось бы сдвигать весь набор для этого
← →
Dimanch (2003-02-03 11:47) [5]Ну да, от лукавого:), кто спорит. Но вот лукавый:)) настаивает на перемещении строк в наборе данных. А чем таблица отличается от набора данных, вроде как понимаю:)
← →
pl_quad (2003-02-03 11:49) [6]я бы завел поле с каким-либо признаком (возможно функцию) на серваке и юзал order by
← →
Johnmen (2003-02-03 11:53) [7]Последовательность записей в НД определяется только лишь указанием сортировки для запроса и активным индексом при исп-ии TTable.
В отсутствии указания сортировки упорядоченность НД непредсказуемая...:)
← →
Dimanch (2003-02-03 12:01) [8]Дело в том, что запрос достаточно долго выполняется, и обновлять его часто - это неправильно, тем более для простого перемещения записи. Я думаю, что просто какой-то нюанс не учтен. Что же все-таки происходит по Post при Cached Updates = true, что новая строчка перемещается на позицию вверх (на второй и др. разы) и как этого избежать?
← →
Dimanch (2003-02-03 12:09) [9]Хорошо, но тогда все-таки непонятно, почу по-разному ведет себя тест для TTable и TQuery. В таблице не определены индексы, а в запросе order by. Но таблица упорно работает как надо, а запрос упорно отказывается делать то что требуется. Все-таки может быть можно его тоже прочухать как-нибудь?
← →
MsGuns (2003-02-03 12:42) [10]Если перемещение записи только "для грида", т.е. для удобства просмотра юзером, но не для реального изменения записи внутри какого-то набора уникальных ключей, то лучше всего использовать для датасета временный курсор (типа таблицы в памяти) и при этом все записи курсора "снабдить" доп.полем - номером порядковым. Вот с этим номером и производить манипуляции, "заставляя" выбранную запись перемещаться куда надо.
← →
Dimanch (2003-02-03 13:29) [11]Понял, попробую этот способ, спасибо
← →
Dimanch (2003-02-03 15:10) [12]Еще вопрос. У меня проект в BCB3.0, там компонент TQuery (вызов хранимой процедуры), как ему скормить этот самый индекс?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c