![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная ошибка после сортировки [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]
> Когда я начинаю делать какие-либо манипуляции (добавление
> записи, удаление)
не вижу текста манипуляций
> самопроизвольно теряются записи (сами удаляются)
так не бывает
если они удаляются, то это делает твой код