Конференция "Начинающим" » Странная ошибка после сортировки [D7, Paradox]
 
  • Впервые (14.12.08 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;

    - Получаю данные из БД.
    Может у меня фокус ставится не на ту запись? Любая манипуляция и я лишаюсь какой -то другой записи, вообще ничего не могу делать в БД.
    Как только выполняется этот запрос с сортировкой - конец, можно смело закрывать и запускать заново программу
    Что за глюк?
  • Правильный$Вася (14.12.08 21:48) [1]

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

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

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

    так не бывает
    если они удаляются, то это делает твой код
  • YurikGL © (14.12.08 21:49) [2]

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

    Как делаешь манипуляции? DB-навигатором? Непосредственно в таблице? Запросами?
  • Впервые (14.12.08 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) Нажимаю сортировка (код выше) - делается какая то новая запись.
  • Впервые (14.12.08 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 © (14.12.08 22:34) [5]
    > 5) Нажимаю сортировка (код выше) - делается какая то новая
    > запись.


    Сама по себе делается чтоли? Или код для этого есть какой-нибудь? Тогда почему мы его до сих пор не увидели???
  • Loginov Dmitry © (14.12.08 22:35) [6]
    > Что бы я не выделял - всегда удаляется последняя запись
    > в БД. ВСЕГДА!!!


    Откуда взялось тут Table1? Было же Query1!!!
  • Впервые (14.12.08 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 © (14.12.08 22:50) [8]
    > Сортируем через Query - результат в DBGrid отображаем


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



    Кто на эту запись устанавливает курсор?
  • Впервые (14.12.08 23:18) [9]
    Я и удаляю. Фокус у меня чтоли не на ту запись ставится наверное. Всегда в конце. Как будто не обновляет переменные. Щас под отладкой проскочу
  • Впервые (14.12.08 23:27) [10]
    Нет! Всё правильно! Переменные правильно отображаются. Всегда удаляется последняя запись
  • Loginov Dmitry © (14.12.08 23:38) [11]
    > Нет! Всё правильно! Переменные правильно отображаются. Всегда
    > удаляется последняя запись


    Где связь между переменными, отображаемыми на Form2 и удалением последней записи?
  • Впервые (14.12.08 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;


    просто подставляется выбранная запись
  • Катунов Юрий © (15.12.08 00:44) [13]
    В Delphi доступ к таблице обеспечивается с помощью компонента Query и формируется SQL-запрос вида "Select * From <имя файла таблицы>
    Where <условия отбора записей>
    Order By <имя поля, по которому производится сортировка>"

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

    Запусти сортировку методом "пузырька" и переупорядочий базу, но это долго, нудно и не по-пацански... :-)
  • Johnmen © (15.12.08 08:59) [14]

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

    Это интересное открытие. То-то мужики удивятся...:)
  • Сергей М. © (15.12.08 09:05) [15]

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


    А вот это куда как интересней).. Прямо-таки не догма, а руководство к действию)
  • Сергей М. © (15.12.08 09:11) [16]

    > Впервые


    Убери из проекта TTable - он здесь как собаке пятая нога.
    Для просмотра и редактирования таблицы достаточно одного TQuery.
  • Anatoly Podgoretsky © (15.12.08 09:55) [17]
    Сортируй, не сортируй, а СУБД пофигу, все равно вставит в нужном ей порядке.
  • Loginov Dmitry © (15.12.08 10:06) [18]

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


    Интересно, для кого был придуман TUpdateSQL...
 
Конференция "Начинающим" » Странная ошибка после сортировки [D7, Paradox]
Есть новые Нет новых   [134477   +40][b:0][p:0.006]