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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2014, 13:08   #1
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию Редактирование записей

Добрый день.
Есть СУБД MS SQL 2005 с таблицей t_nomer в которой есть колонки nomer, kross, dlu_int, polka_blok, modul_slot, port и форма MainForm на которой расположены ADOConnection1, DataSource1, ADOQuery1, DBGrid1 и кнопки "Добавить", "Редактировать", "Удалить" соответственно для добавления, редактирования и удаления записей. Добавление и удаление записей сделал, никак не могу решить задачу с редактированием.
При редактировании записи надо учесть следующее:
1. Номера не должны повторяться
2. Могут присутствовать пустые записи.
Сделал следующее:
Код:
procedure TMainForm.EditBtnClick(Sender: TObject);
begin
With ADOQuery1 do begin
if (Trim(AbNomerEdit.Text) <> '') then begin
    Active:=False;
    SQL.Clear;
    SQL.Add('SELECT nomer, kross, dlu_int, polka_blok, modul_slot, port FROM t_nomer WHERE nomer='+AbNomerEdit.Text);
    Active:=True;
    ExecSQL;
    if not IsEmpty then begin
      Application.MessageBox('Такой номер уже существует', 'Внимание!', mb_OK);      
      SQL.Clear;
      SQL.Add('SELECT nomer, kross, dlu_int, polka_blok, modul_slot, port FROM t_nomer');
      Active:=True;
    end
    else begin
       Active:=False;
       SQL.Clear;
       SQL.Add('SELECT nomer, kross, dlu_int, polka_blok, modul_slot, port FROM t_nomer');
       Active:=True;
       SQL.Clear;
       SQL.Add('UPDATE ewsd SET nomer ='+AbNomerEdit.Text+' where nomer='+FieldByName('nomer').AsString);
       ExecSQL;
       AbNomerEdit.Clear;
     end;
end  
else begin
  Edit;
  FieldByName('Nomer').AsString := AbNomerEdit.Text;
  Post;
  Sort:='Nomer';
  AbNomerEdit.Clear;
end;
end;
end;
Работает правильно, если в AbNomerEdit ввели пустое значение и ввели номер, который уже имеется. Если ввести не существующий номер, то выходит ошибка на строке 22 "ADOQuery1: Field nomer not found". И это правильно, т.к. после выполнения запроса на строке 7, если нет удовлетворяющего номера, то я получается пытаюсь изменить пустое поле. В общем надо исправить участок кода на строках с 17 по 24.

Последний раз редактировалось royun; 17.03.2014 в 13:14.
royun вне форума Ответить с цитированием
Старый 17.03.2014, 16:30   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а на что надо исправить?
что надо сделать-то
Цитата:
если нет удовлетворяющего номера,
исправить несуществующую запись?
и где какая (7/ 22/ 17/ 24/....) строчка?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.03.2014 в 16:32.
evg_m вне форума Ответить с цитированием
Старый 18.03.2014, 05:11   #3
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Может не красиво, но работает так как мне надо.
Код:
else begin
      ADOConnection1.Connected:=False;
      Active:=False;
      SQL.Clear;
      ADOConnection1.Connected:=True;
      SQL.Add('SELECT nomer, kross, dlu_int, polka_blok, modul_slot, port FROM t_nomer');
      Active:=True;
      Edit;
      FieldByName('Nomer').AsString:=AbNomerEdit.Text;
      Post;     
      AbNomerEdit.Clear;      
     end;
Спасибо всем участникам за помощь.
royun вне форума Ответить с цитированием
Старый 18.03.2014, 06:22   #4
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Намного правильный вариант:

Код:
procedure TMainForm.EditBtnClick(Sender: TObject);
begin
With ADOQuery1 do begin
  if (Trim(AbNomerEdit.Text) <> '') then begin
    if not Locate('nomer',AbNomerEdit.Text,[loCaseInsensitive, loPartialKey]) then begin
      Edit;
      FieldByName('nomer').AsString:=AbNomerEdit.Text;
      Post;
      Sort:='nomer';
    end
    else
      ShowMessage('Такой номер уже существует!');
    end
  else begin
  Edit;
  FieldByName('nomer').AsString:=AbNomerEdit.Text;
  Post;
  Sort:='nomer';
  end;
end;
end;
royun вне форума Ответить с цитированием
Старый 18.03.2014, 08:51   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ИМХО:
Код:
procedure TMainForm.EditBtnClick(Sender: TObject);
begin 
 With ADOQuery1 do begin
  if (Trim(AbNomerEdit.Text) <> '') then begin
    if Locate('nomer',AbNomerEdit.Text,[loCaseInsensitive, loPartialKey]) then begin
      ShowMessage('Такой номер уже существует!');
      exit;
    end
  end;

  Edit;
  FieldByName('nomer').AsString:=AbNomerEdit.Text;
  Post;
  Sort:='nomer';
 end;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как настроить редактирование записей в таблице Access'a Emmelman Microsoft Office Access 2 28.01.2013 16:04
Редактирование записей в базе "*.mdb" Dark_Wolf БД в Delphi 4 16.11.2011 08:13
Редактирование записей в файле Neroaz Помощь студентам 9 12.04.2010 20:06
Редактирование записей, отобранных через SQL Detka Помощь студентам 28 08.02.2009 01:56
Типизированные файлы.Создание, удаление, редактирование, сортировка записей типизированного файла.Паскаль Студент Шиза Помощь студентам 6 08.12.2007 13:41