Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-63503
Nikola62
2003-02-02 14:00
2003.02.20
Где раздаются Grandы к процедурам IB5


14-63814
Борец за свободу
2003-02-04 13:50
2003.02.20
Правда о Родине.


14-63846
Delirium^.Tremens
2003-02-04 15:49
2003.02.20
Об использовании мягкого знака (Ь) в глаголах


1-63621
БурЖуй
2003-02-10 23:56
2003.02.20
Выделение в Treeview


4-63918
AlexG
2003-01-09 09:12
2003.02.20
ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский