Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странная ошибка после сортировки [D7, Paradox]


Впервые ©   (2008-12-14 21:18:00) 

Здравствуйте.
Использую стандартный набор: Table, Query, DataSource.
Сортирую таблицу
Query1.DatabaseName :='ТемпБаза';
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT * FROM baza.DB ORDER BY tb');
 Query1.Active :=true;

 DataSource1.DataSet :=Query1;
 DBGrid1.DataSource :=DataSource1;

Когда я начинаю делать какие-либо манипуляции (добавление записи, удаление) у меня самопроизвольно теряются записи (сами удаляются).
Есть событие onMouseUp
procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if DBGrid1.Focused = true then begin
  TabNumber :=     DataSource1.DataSet.Fields[0].AsInteger;
  Family :=        DataSource1.DataSet.Fields[1].AsString;
  Name :=          DataSource1.DataSet.Fields[2].AsString;
  Otchestvo :=     DataSource1.DataSet.Fields[3].AsString;
  Doljnost :=      DataSource1.DataSet.Fields[4].AsString;
  Foto :=          DataSource1.DataSet.Fields[5].AsString;
  DataVidachi :=   DataSource1.DataSet.Fields[6].AsString;
  SrokDeistviya := DataSource1.DataSet.Fields[7].AsString;
  VidPropuska :=   DataSource1.DataSet.Fields[8].AsInteger;
 end;
end;
- Получаю данные из БД.
Может у меня фокус ставится не на ту запись? Любая манипуляция и я лишаюсь какой -то другой записи, вообще ничего не могу делать в БД.
Как только выполняется этот запрос с сортировкой - конец, можно смело закрывать и запускать заново программу
Что за глюк?


Loginov Dmitry   (2008-12-15 10:06:00) [1]


> Есть правда проблемка. В Delphi отсортированный таким образом
> набор данных невозможно изменять. При изменении приходиться
> отменять сортировку, а потом сортировать заново.


Интересно, для кого был придуман TUpdateSQL...


Anatoly Podgoretsky   (2008-12-15 09:55:00) [2]

Сортируй, не сортируй, а СУБД пофигу, все равно вставит в нужном ей порядке.


Сергей М.   (2008-12-15 09:11:00) [3]


> Впервые


Убери из проекта TTable - он здесь как собаке пятая нога.
Для просмотра и редактирования таблицы достаточно одного TQuery.


Сергей М.   (2008-12-15 09:05:00) [4]


> Запусти сортировку методом "пузырька" и переупорядочий базу


А вот это куда как интересней).. Прямо-таки не догма, а руководство к действию)


Johnmen   (2008-12-15 08:59:00) [5]


> Есть правда проблемка. В Delphi отсортированный таким образом
> набор данных невозможно изменять.

Это интересное открытие. То-то мужики удивятся...:)


Катунов Юрий   (2008-12-15 00:44:00) [6]

В Delphi доступ к таблице обеспечивается с помощью компонента Query и формируется SQL-запрос вида "Select * From <имя файла таблицы>
Where <условия отбора записей>
Order By <имя поля, по которому производится сортировка>"

Если по полю задан индекс, сортировка работает немножко быстрее. Есть правда проблемка. В Delphi отсортированный таким образом набор данных невозможно изменять. При изменении приходиться отменять сортировку, а потом сортировать заново.
Поэтому ты и повис. Жмёшь свои кнопки, жмёшь, а эффекта нет. :-)

Запусти сортировку методом "пузырька" и переупорядочий базу, но это долго, нудно и не по-пацански... :-)


Впервые   (2008-12-14 23:57:00) [7]

Нет никакой связи. Тут выборка берётся просто по той записи на которую ткнули машью.

В переменные
  TabNumber :=     DataSource1.DataSet.Fields[0].AsInteger;
  Family :=        DataSource1.DataSet.Fields[1].AsString;
  Name :=          DataSource1.DataSet.Fields[2].AsString;
  Otchestvo :=     DataSource1.DataSet.Fields[3].AsString;
  Doljnost :=      DataSource1.DataSet.Fields[4].AsString;
  Foto :=          DataSource1.DataSet.Fields[5].AsString;
  DataVidachi :=   DataSource1.DataSet.Fields[6].AsString;
  SrokDeistviya := DataSource1.DataSet.Fields[7].AsString;
  VidPropuska :=   DataSource1.DataSet.Fields[8].AsInteger;

просто подставляется выбранная запись


Loginov Dmitry   (2008-12-14 23:38:00) [8]

> Нет! Всё правильно! Переменные правильно отображаются. Всегда
> удаляется последняя запись


Где связь между переменными, отображаемыми на Form2 и удалением последней записи?


Впервые   (2008-12-14 23:27:00) [9]

Нет! Всё правильно! Переменные правильно отображаются. Всегда удаляется последняя запись


Впервые   (2008-12-14 23:18:00) [10]

Я и удаляю. Фокус у меня чтоли не на ту запись ставится наверное. Всегда в конце. Как будто не обновляет переменные. Щас под отладкой проскочу


Loginov Dmitry   (2008-12-14 22:50:00) [11]

> Сортируем через Query - результат в DBGrid отображаем


Я это вижу! Вопрос в том, какую запись должен удалять код
Form1.Table1.Delete; //Удалить выделенную запись из БД

Кто на эту запись устанавливает курсор?


Впервые   (2008-12-14 22:39:00) [12]

procedure TForm1.Button6Click(Sender: TObject);
begin
Query1.DatabaseName :='ТемпБаза';
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM baza.DB ORDER BY tb');
Query1.Active :=true;

DataSource1.DataSet :=Query1;
DBGrid1.DataSource :=DataSource1;
end;
- вот это сортировка

Сортируем через Query - результат в DBGrid отображаем


Loginov Dmitry   (2008-12-14 22:35:00) [13]

> Что бы я не выделял - всегда удаляется последняя запись
> в БД. ВСЕГДА!!!


Откуда взялось тут Table1? Было же Query1!!!


Loginov Dmitry   (2008-12-14 22:34:00) [14]

> 5) Нажимаю сортировка (код выше) - делается какая то новая
> запись.


Сама по себе делается чтоли? Или код для этого есть какой-нибудь? Тогда почему мы его до сих пор не увидели???


Впервые   (2008-12-14 22:06:00) [15]

Момент №2 связанный с удалением записи.
Делаю всё теже манипуляции и....нажимаю на кнопку "Удалить"
procedure TForm1.Button3Click(Sender: TObject);
begin
//**** Чё нибудь вывести: Удаляется такая то запись и вывести пару полей
//**** и запись переносится в БД удалённых!!!
 Form1.Table1.Delete; //Удалить выделенную запись из БД
 Form1.Table1.Active :=false;
 Form1.Table1.DatabaseName :='ТемпБаза';
 Form1.Table1.TableName :='deli.db';
   Form1.Table1.Active :=true;
   Form1.Table1.Insert;

     Form1.Table1.Fields[0].AsInteger  :=TabNumber; //Уникальный ТБ
     Form1.Table1.Fields[1].AsString   :=Family; //Фамилия
     Form1.Table1.Fields[2].AsString   :=Name; //Имя
     Form1.Table1.Fields[3].AsString   :=Otchestvo; //Отчество
     Form1.Table1.Fields[4].AsString   :=Doljnost;//Должность
     Form1.Table1.Fields[5].AsString   :=Foto; //Фото
     Form1.Table1.Fields[6].AsDateTime :=StrToDate (DataVidachi);
     Form1.Table1.Fields[7].AsDateTime :=StrToDate (SrokDeistviya);
     Form1.Table1.Fields[8].AsInteger  :=VidPropuska;
    Form1.Table1.Post;

 Form1.Table1.Active :=false;
 Form1.Table1.DatabaseName :='ТемпБаза';
 Form1.Table1.TableName :='baza.db';
 Form1.Table1.Active :=true;

end;

Что бы я не выделял - всегда удаляется последняя запись в БД. ВСЕГДА!!!
Притом если не использовать код сортировки - всё работает чётко. Все проблемы возникают только после неё


Впервые   (2008-12-14 22:01:00) [16]

Значит .....
1) Выполняется запрос.
procedure TForm1.Button6Click(Sender: TObject);
begin
 Query1.DatabaseName :='ТемпБаза';
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT * FROM baza.DB ORDER BY tb');
 Query1.Active :=true;

 DataSource1.DataSet :=Query1;
 DBGrid1.DataSource :=DataSource1;
end;

2) Выделяю запись в DBGrid.
procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if DBGrid1.Focused = true then begin
  TabNumber :=     DataSource1.DataSet.Fields[0].AsInteger;
  Family :=        DataSource1.DataSet.Fields[1].AsString;
  Name :=          DataSource1.DataSet.Fields[2].AsString;
  Otchestvo :=     DataSource1.DataSet.Fields[3].AsString;
  Doljnost :=      DataSource1.DataSet.Fields[4].AsString;
  Foto :=          DataSource1.DataSet.Fields[5].AsString;
  DataVidachi :=   DataSource1.DataSet.Fields[6].AsString;
  SrokDeistviya := DataSource1.DataSet.Fields[7].AsString;
  VidPropuska :=   DataSource1.DataSet.Fields[8].AsInteger;
 end;
end;

3) Нажимаю кнопку "Правка"
procedure TForm1.Button2Click(Sender: TObject);
begin
 Form2.Caption :='Правка: Редактирование данных';
 Form2.Image1.Visible :=true;
 GlobalFlag :=2; //Если 2 - то в режиме правка записи

 Form2.Edit1.Text := IntToStr (TabNumber);
 Form2.Edit2.Text := Family;
 Form2.Edit3.Text := Name;
 Form2.Edit4.Text := Otchestvo;
 Form2.Memo1.Lines.Text :=Doljnost;
 Form2.Edit5.Text :=Foto;
 Form2.Image1.Picture.LoadFromFile(Foto);
 Form2.DateTimePicker1.Date :=StrToDate (DataVidachi);
 Form2.DateTimePicker2.Date :=StrToDate (SrokDeistviya);
 if VidPropuska  = 0 then
   Form2.CheckBox1.Checked :=false
 else if VidPropuska  = 1 then
   Form2.CheckBox1.Checked :=true;

 Form2.ShowModal;
end;
Т.е. тут появляются нужные записи
Меняю, например, в поле Name имя человека
5) Нажимаю сортировка (код выше) - делается какая то новая запись.


YurikGL   (2008-12-14 21:49:00) [17]


> Когда я начинаю делать какие-либо манипуляции (добавление
> записи, удаление) у меня самопроизвольно теряются записи
> (сами удаляются).

Как делаешь манипуляции? DB-навигатором? Непосредственно в таблице? Запросами?


Правильный$Вася   (2008-12-14 21:48:00) [18]


> Когда я начинаю делать какие-либо манипуляции (добавление
> записи, удаление)

не вижу текста манипуляций

> самопроизвольно теряются записи (сами удаляются)

так не бывает
если они удаляются, то это делает твой код


Наверх

Титульная страница Поиск, карта сайта Написать письмо