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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2011, 01:04   #1
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию Проверка существования записи

Использую Delphi + Access. Процедура добавления а за одно и существования записи.
Код:
procedure TfrmDodIzUsers.BitBtn1Click(Sender: TObject);   //Добавление пользователя
var q:integer;
begin
DataModule4.ADOQueryUsers.SQL.Text:='Select * From  Users';
DataModule4.ADOQueryUsers.Open;
DataModule4.ADOQueryUsers.First;
if (Edit1.Text='') or
   (Edit2.Text='') or
   (ComboBox1.Text='') then BEGIN
   MessageBox(Handle, 'Заполните все поля', 'Information', MB_OK) ;
  exit;
  end;
for q:=1 to DataModule4.ADOQueryUsers.RecordCount do
     begin
      if (Edit1.Text=DataModule4.ADOQueryUsers.FieldByName('login').Value) and(Edit2.Text=DataModule4.ADOQueryUsers.FieldByName('password').Value) and(ComboBox1.Text=DataModule4.ADOQueryUsers.FieldByName('dostup').Value) then
         begin
            MessageBox(Handle, 'Такая запись существует', 'Information', MB_OK);
            exit;
         end else
            begin
             DataModule4.ADOQueryUsers.Next;
            end;
             end;

for i:=1 to 99999999 do
if DataModule4.UsersTable.Locate('Key1',i,[])=false then break;
DataModule4.UsersTable.Active:=False;
DataModule4.ADOQueryUsers.Insert;

DataModule4.ADOQueryUsers.FieldByName('login').Value:=Edit1.Text;
DataModule4.ADOQueryUsers.FieldByName('password').Value:=Edit2.Text;
DataModule4.ADOQueryUsers.FieldByName('dostup').Value:=ComboBox1.Text;
DataModule4.ADOQueryUsers.FieldByName('Key1').Value:=i;
DataModule4.ADOQueryUsers.Post;
DataModule4.UsersTable.Active:=true;
Edit1.Clear;
Edit2.Clear;
frmUsers.Show;
frmUsers.Enabled:=True;
DataModule4.UsersTable.IndexFieldNames:='login';
Close;
end;
Работает, но препод мне сказал, что можно проще сделать. Особенно обратил внимание на проверку существования записи.
У кого какие идеи???
StudentMarat вне форума Ответить с цитированием
Старый 13.11.2011, 01:33   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну разумеется, можно (и нужно) делать проверку по другому.
вариант 1.
по сути, тоже самое, что и у Вас, только использовать готовый метод датасета Locate:
Код:
DataModule4.ADOQueryUsers.Open;
if DataModule4.ADOQueryUsers.Locate('login;password;dostup',
VarArrayOf([Edit1.Text, Edit2.Text ,ComboBox1.Text ]), []) then begin
    DataModule4.ADOQueryUsers.Close;
    MessageBox(Handle, 'Такая запись существует', 'Information', MB_OK);
            exit;
end;
вариант 2.
ЛУЧШЕ!
использовать запрос вида:
Код:
DataModule4.ADOQueryUsers.SQL.Text:='Select count(*) as cnt1 From  Users where login='+QuotedStr(Edit1.text)+
' and  password = '+QuotedStr(Edit2.Text)+
' and  dostup = '+QuotedStr(ComboBox1.Text );
DataModule4.ADOQueryUsers.Open;
if DataModule4.ADOQueryUsers.FieldByName('cnt1').AsInteger>0 then 
begin
    DataModule4.ADOQueryUsers.Close;
    MessageBox(Handle, 'Такая запись существует', 'Information', MB_OK);
            exit;
end;

ну и ещё несколько замечаний по коду.
1-е. Зачем Вы доступ проверяете при проверке сущестования записи. Вы уверены, что имени и пароля недостаточно для идентификации? Или у Вас может быть несколько записей с одинаковыми логинами и паролями, отличающиеся только разными уровнями доступа?!

2-е.
Цитата:
for i:=1 to 99999999 do ...
это что за тихий ужас?!?!?!!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.11.2011, 19:27   #3
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию

Цитата:
1-е. Зачем Вы доступ проверяете при проверке сущестования записи. Вы уверены, что имени и пароля недостаточно для идентификации? Или у Вас может быть несколько записей с одинаковыми логинами и паролями, отличающиеся только разными уровнями доступа?!
Да, Вы правы, об этом я не подумал. Теперь для проверки существования записи буду использовать только поле login

Цитата:
Цитата:
for i:=1 to 99999999 do ...
это что за тихий ужас?!?!?!!!
В таблице Users есть первичное поле key1 (формат числовой). Повторятся оно конечно же не может.
К примеру в таблице есть поля
Key1 login Password Dostup
1 Admin 1234 Да
3 Ivan 567 Нет
4 Petr 444 Да

К примеру нужно добавить пользователя Пупкин с паролем 455. Ясное дело, пользователю нельзя доверять ввод этого поля
Цитата:
for i:=1 to 99999999 do
if DataModule4.UsersTable.Locate('Key1 ',i,[])=false then break;
Здесь идет цикл по полю key1 и Пупкин автоматически получает значение 2. В итоге итоговая таблица:
1 Admin 1234 Да
2 Пупкин 455 Нет
3 Ivan 567 Нет
4 Petr 444 Да

К сожалению, другого способа я так и не придумал. Очень надеюсь, что Вы мне подскажите в этом

После модификации у меня получился вот такой код.
Код:
procedure TfrmDodIzUsers.BitBtn1Click(Sender: TObject);   //Добавление пользователя
var q:integer;
begin
DataModule4.ADOQueryUsers.SQL.Text:='Select count(*) as cnt1 From  Users where Login='+QuotedStr(edit1.Text );
DataModule4.ADOQueryUsers.Open;
DataModule4.ADOQueryUsers.First;
if (Edit1.Text='') or
   (Edit2.Text='') or
   (ComboBox1.Text='') then BEGIN
   MessageBox(Handle, 'Заполните все поля', 'Information', MB_OK) ;
  exit;
  end;
if DataModule4.ADOQueryUsers.FieldByName('cnt1').AsInteger>0 then
begin
DataModule4.ADOQueryUsers.Close;
MessageBox(Handle, 'Такая запись существует', 'Information', MB_OK);
exit;
end;

for i:=1 to 99999999 do
if DataModule4.UsersTable.Locate('Key1',i,[])=false then break;
DataModule4.UsersTable.Active:=False;

DataModule4.ADOQueryUsers.Insert;

DataModule4.ADOQueryUsers.FieldByName('login').Value:=Edit1.Text;
DataModule4.ADOQueryUsers.FieldByName('password').Value:=Edit2.Text;
DataModule4.ADOQueryUsers.FieldByName('dostup').Value:=ComboBox1.Text;
DataModule4.ADOQueryUsers.FieldByName('Key1').Value:=i;
DataModule4.ADOQueryUsers.Post;
DataModule4.UsersTable.Active:=true;
Edit1.Clear;
Edit2.Clear;
//ComboBox1.Clear;
frmUsers.Show;
frmUsers.Enabled:=True;
DataModule4.UsersTable.IndexFieldNames:='login';
Close;
end;
Но теперь я почему-то не могу добавить нового пользователя. У меня вылетает такая ошибка, хотя до этого было без проблем. Как говориться, избавились от одного, получили другое
Изображения
Тип файла: jpg Error.JPG (194.7 Кб, 143 просмотров)

Последний раз редактировалось StudentMarat; 13.11.2011 в 19:45.
StudentMarat вне форума Ответить с цитированием
Старый 13.11.2011, 19:51   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
DataModule4.UsersTable.First;
i:=1;
while not DataModule4.UsersTable.Eof do begin
  if DataModule4.UsersTable.FielByName('Key1')>i then Break;
  Inc(i);
  DataModule4.UsersTable.Next;
end;
// вот в i и искомое значение  (дырка)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.11.2011, 20:26   #5
StudentMarat
Форумчанин
 
Регистрация: 10.10.2008
Сообщений: 123
По умолчанию

Аватар, а по ошибке не подскажешь please????
StudentMarat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка существования записи NikkMih C/C++ Базы данных 3 19.10.2011 11:26
Проверка существования слова. C# kloffelin Помощь студентам 2 18.03.2011 10:50
Проверка существования компонента _-Re@l-_ Общие вопросы Delphi 3 29.12.2010 18:59
Проверка существования TEdit John_chek Общие вопросы Delphi 9 18.04.2008 14:56
Проверка существования директории Gorin Общие вопросы Delphi 7 25.11.2007 19:47