Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2012, 23:11   #1
game_Racer
Пользователь
 
Регистрация: 09.03.2012
Сообщений: 10
По умолчанию Изменить порядок записей в ADOTable

Есть ADOTable, к которой подключен DBGrid. Хочу добавить две кнопочки переместить наверх и переместить вниз. Чтобы можно было изменять порядок расположения записей в таблице. Ничего кроме как 2 запроса на выборку по ключевому полю+2 набора переменных+3 запроса на обновление в голову не приходит. Копался в свойствах ADOTable, ничего кроме как переместить фокус сделать не смог. Может есть все же какой-то более простой способ?

Последний раз редактировалось game_Racer; 01.04.2012 в 09:39.
game_Racer вне форума Ответить с цитированием
Старый 31.03.2012, 23:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Иметь в таблице поле "номер по порядку" и изменять его в двух соседних записях
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2012, 09:35   #3
game_Racer
Пользователь
 
Регистрация: 09.03.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Иметь в таблице поле "номер по порядку" и изменять его в двух соседних записях
Можно. Но в таблице всего два поля. Это будет не сильно отличаться от моей конструкции. К тому же если записи будут удаляться, то номер будет не совсем по порядку.

Последний раз редактировалось game_Racer; 01.04.2012 в 09:38.
game_Racer вне форума Ответить с цитированием
Старый 01.04.2012, 10:43   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если номер не использовать для отображения, то и не важно наличие дырок. И в ADOTable индекс по этому полю сделать. Если номер п/п не ключевое поле, то при использовании ADOTable необходимость использовать SQL отпадает. Просто Edit и Post
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2012, 13:46   #5
game_Racer
Пользователь
 
Регистрация: 09.03.2012
Сообщений: 10
По умолчанию

Спасибо. Сделал по Вашему совету.

Код:
//переместить ниже
procedure TForm2.btn11Click(Sender: TObject);
var
i1,i2,r:Integer;
begin
r:=Form2.tbl3.RecNo;
if not(r=Form2.tbl3.RecordCount) then begin
i1:=Form2.tbl3.FieldValues['inc'];
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=-1;
Form2.tbl3.Post;
Form2.tbl3.RecNo:=r+1;
i2:=Form2.tbl3.FieldValues['inc'];
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=i1;
Form2.tbl3.Post;
Form2.tbl3.first;
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=i2;
Form2.tbl3.Post;
Form2.tbl3.RecNo:=r+1;
end;
end;

//переместить выше
procedure TForm2.btn12Click(Sender: TObject);
var
i1,i2,r:Integer;
begin
r:=Form2.tbl3.RecNo;
if not(r=1) then begin
i1:=Form2.tbl3.FieldValues['inc'];
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=-1;
Form2.tbl3.Post;
Form2.tbl3.RecNo:=r;
i2:=Form2.tbl3.FieldValues['inc'];
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=i1;
Form2.tbl3.Post;
Form2.tbl3.first;
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=i2;
Form2.tbl3.Post;
Form2.tbl3.RecNo:=r-1;
end;
end;
Все работает
game_Racer вне форума Ответить с цитированием
Старый 01.04.2012, 14:30   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если есть уникальный идентификатор лучше в данном случае RecNo не использовать, а запоминать значение идентификатора и переход по Locate
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2012, 15:26   #7
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если есть уникальный идентификатор лучше в данном случае RecNo не использовать, а запоминать значение идентификатора и переход по Locate
RecNo лучше вообще не использовать, очень протевоечивая штука. Рискуете получить непредсказуемый результат при использовании разных технологий.
По крайней мере в дельфи 7 так было, после пары раз недокументированного поведения RecNo я просто перестал его использовать.
vovk вне форума Ответить с цитированием
Старый 01.04.2012, 15:55   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
RecNo лучше вообще не использовать, очень протевоечивая штука
Не совсем уж так плохо. Пока DataSet не правится, не меняется индекс и фильтр нормально он работает. При изменении состояния да, RecNo не подходит. И еще у него особнность при использовании SetRange у ClientDataSet есть, точно не помню, кажется начало нумерации не такое, как обычно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2012, 15:59   #9
game_Racer
Пользователь
 
Регистрация: 09.03.2012
Сообщений: 10
По умолчанию

А вот с Locate у меня не получается разобраться (мало опыта).
Написал так:
Код:
procedure TForm2.btn12Click(Sender: TObject);
var
i1,i2:Integer;
nm1,nm2:string;
begin
if not(Form2.tbl3.RecNo=1) then begin
nm1:=Form2.tbl3.FieldValues['nm'];
i1:=Form2.tbl3.FieldValues['inc'];
Form2.tbl3.Prior;
nm2:=Form2.tbl3.FieldValues['nm'];
i2:=Form2.tbl3.FieldValues['inc'];
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=-1;
Form2.tbl3.Post;
Form2.tbl3.Locate('inc',nm1,[]);
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=i2;
Form2.tbl3.Post;
Form2.tbl3.Locate('inc',nm2,[]);
Form2.tbl3.Edit;
Form2.tbl3.FieldValues['inc']:=i1;
Form2.tbl3.Post;
Form2.tbl3.Locate('inc',nm1,[]);
end;
end;
получаю:
Цитата:
"Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом"
Пробовал в писать Locate('inc',nm1,[loCaseInsensitive]); Результат тот же.
game_Racer вне форума Ответить с цитированием
Старый 01.04.2012, 16:06   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Значение чего сохраняете и по какому полю ищете?
Код:
nm1:=Form2.tbl3.FieldValues['nm'];
...
Form2.tbl3.Locate('inc',nm1,[]);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить порядок слов в документе на обратный arthur_92 Microsoft Office Word 1 07.06.2011 00:14
Запрос на Изменить нескольких записей ара Помощь студентам 1 15.05.2011 18:48
Почему при открывании БД изменяется порядок записей Oooleg Microsoft Office Access 4 28.02.2010 00:02
порядок отображения новых записей в DBGrid Delphi/Builder roma_ Помощь студентам 1 10.09.2009 10:13
Как копировать данные из ADOTable в ADOTable? mauar БД в Delphi 1 10.05.2008 16:05