Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.20;
Скачать: CL | DM;

Вниз

перемещение строчки в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
14-63755
Term
2003-02-03 16:38
2003.02.20
KLADR кто нибудь работал с класификатором...


14-63853
iNew
2003-02-05 08:21
2003.02.20
Кто программил на VB, подскажите как сделать так чтоб размер


8-63691
maker
2002-11-06 20:42
2003.02.20
Звук, файлы


14-63833
Kotka
2003-02-03 00:34
2003.02.20
Дайджесты


14-63771
pl_quad
2003-02-03 11:51
2003.02.20
доки по com интерфейсам MS Office