Все бесплатно
    Все ссылки на файлы, расположенные на страницах сайта, добавлены пользователями и доступны для бесплатного скачивания. За содержание этих файлов администрация сайта ответственности не несет.



Вопросы
  Перекодировка в DBASE
   Категория: Базы данных
  Прочитать содержимое папки
   Категория: Файловая система
  Удалить пробелы в начале и конце
   Категория: Текст и строки
  Удалить или оставить симолы
   Категория: Текст и строки
  Тpансляция ошибок в BDE
   Категория: Базы данных
  Сохраняем Bitmap в поле dbase
   Категория: Базы данных
  Как удалить не пустой каталог
   Категория: Файловая система

Публикации: Мои статьи

Перемещение записи в TDataSet вверх-вниз

Дата: 30.10.2011 | Комментариев: 0 | Просмотров: 35842
На форумах часто задают вопрос как переместить запись в таблицу вверх или вниз в DBGrid-е. Если DataSet сортируется по какому-нибудь ключевому полю, то нужно поменять местами значения этого поля между двумя записями. А если DataSet сортируется по автоинкрементному полю которое нельзя изменять?

В таком случае придется заменить значения всех полей кроме автоинкрементного.
Итак, имеем DataSet, в свойтве которого IndexFieldNames указано автоинкрементное поле.

Можно использовать такую процедуру:
procedure MoveRow(Dataset: TDataSet; MoveUp: Boolean);
var
В В bmOld, bmNew: TBookmark;
В В v_new, v_old: array [0 .. 50] of Variant;
В В i: Integer;
begin
В В with Dataset do
В В begin
В В {Установим закладку на текущую запись}
В В В В bmOld := GetBookmark;

В В В В  {Передадим в массив значения всех
В В В В В В полей кроме автоинкрементного}
В В В В for i := 0 to FieldCount - 1 do
В В В В В В if Fields[i].DataType <> ftAutoInc then
В В В В В В В В v_old[i] := Fields[i].AsVariant;

В В В В if MoveUp then
В В В В В В Prior
В В В В else
В В В В В В Next;

В В  {Если перемещаем первую запись вверх или
В В  последнюю вниз, то прекращаем процедуру}
В В В В if (Eof) or (Bof) then
В В В В В В Exit;

В В В В  {Снова установим закладку на текущую запись}
В В В В bmNew := GetBookmark;

В В В В  {Снава передадим в массив значения всех
В В В В В В полей кроме автоинкрементного}
В В В В for i := 0 to FieldCount - 1 do
В В В В В В if Fields[i].DataType <> ftAutoInc then
В В В В В В В В v_new[i] := Fields[i].AsVariant;
В В В В Edit;
В В В В В В  {Запишем значения}
В В В В for i := 0 to FieldCount - 1 do
В В В В В В if Fields[i].DataType <> ftAutoInc then
В В В В В В В В Fields[i].AsVariant := v_old[i];
В В В В Post;
В В В В GotoBookmark(bmOld);
В В В В Edit;
В В В В {Запишем значения}
В В В В for i := 0 to FieldCount - 1 do
В В В В В В if Fields[i].DataType <> ftAutoInc then
В В В В В В В В Fields[i].AsVariant := v_new[i];
В В В В Post;
В В В В GotoBookmark(bmNew);
В В end;
end;


Пример использования:
{Вверх}
MoveRow(Table, True);

{Вниз}
MoveRow(Table, False);


Удачи.
Delphi_Coder
Октябрь, 2011
При перепечатке любых статей ссылка на сайт delphi-z.ru обязательна.
Все используемые на сайте статьи, файлы и логотипы компаний принадлежат их законным владельцам. Если вы являетесь правообладателем "Перемещение записи в TDataSet вверх-вниз" и не желаете, чтобы ваша информация находилась на нашем сайте, напишите нам и эта информация будет удалена.

Теги: мои статьи

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.