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

Вниз

Странная ошибка после сортировки   Найти похожие ветки 

 
Впервые   (2008-12-14 21:18) [0]

Здравствуйте.
Использую стандартный набор: 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;
- Получаю данные из БД.
Может у меня фокус ставится не на ту запись? Любая манипуляция и я лишаюсь какой -то другой записи, вообще ничего не могу делать в БД.
Как только выполняется этот запрос с сортировкой - конец, можно смело закрывать и запускать заново программу
Что за глюк?


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


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

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

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

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


 
YurikGL ©   (2008-12-14 21:49) [2]


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

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


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

Значит .....
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) Нажимаю сортировка (код выше) - делается какая то новая запись.


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

Момент №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;

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


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

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


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


 
Loginov Dmitry ©   (2008-12-14 22:35) [6]

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


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


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

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:50) [8]

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


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

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


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

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


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

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


 
Loginov Dmitry ©   (2008-12-14 23:38) [11]

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


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


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

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

В переменные
  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;

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


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

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

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

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


 
Johnmen ©   (2008-12-15 08:59) [14]


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

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


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


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


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


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


> Впервые


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


 
Anatoly Podgoretsky ©   (2008-12-15 09:55) [17]

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


 
Loginov Dmitry ©   (2008-12-15 10:06) [18]


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


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



Страницы: 1 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
2-1229020903
CodeMaster
2008-12-11 21:41
2009.01.25
Проблема с выводом на канву


2-1229089075
Андрей Ал.
2008-12-12 16:37
2009.01.25
Фильтр


15-1227966287
Городской Шаман
2008-11-29 16:44
2009.01.25
Что я теряю, переводя проект с Delphi на С++(VS)


15-1227708896
Поросенок Винни-Пух
2008-11-26 17:14
2009.01.25
Богатства сомали


1-1206717670
Still Swamp
2008-03-28 18:21
2009.01.25
GradientFill