1 (edited by savage 2014-08-23 11:52:13)

Topic: [Решено] Таблица - словарь -- уникальные поля

День добрый,

Есть такая проблема:
1. есть ряд таблиц, которые являются словарями
2. необходимо сделать механизм предотвращения ввода одинаковых значений в конкретные поля.
Например, есть справочник Пользователей с полями "Фамилия", "Имя", "Статус". Как защитится от ввода одинакового юзера?
Под одинаковым я понимаю аналогичные значения в полях "Фамилия" + "Имя"

Еще хотелось бы немного поподробнее про характеристику под таблицами : "Таблица является словарем"

с уважением,

savage

PS просто прекрасный софт у Вас, DriveSoft, получается. То, что надо для несложных программ.

Re: [Решено] Таблица - словарь -- уникальные поля

Добрый день )


Сама  база  данных  sqlite  поддерживает  механизм предотвращения ввода одинаковых значений,  но  у  меня в программе  она  пока  не  реализована,  поэтому  можете  включить  эту возможность например через SQLite Studio, где необходимо зайти в режим редактирования  структуры  базы  данных  и поставить галочку на против пункта "Уникальность" в нужных полях БД.


К сообщение приложен скриншот как это сделать.
Но в вашем случае данный способ не подойдет, т.к. необходимо организовать ограничение при уникальности одновременно двух полей, как это сделать я пока не знаю.




В вашем случае это придется реализовать с помощью скрипта, создав событие OnClick на кнопке сохранения

procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
    if StrToInt(VarToStr(SQLExecute ('SELECT count(*) from users WHERE firstname="' + Form1.edFirstname.Text + '" AND 'lastname = "' +  Form1.edLastname.Text + '" ))) > 0 then 
  begin
    ShowMessage('Такой пользователь уже есть');
    Cancel := True;
  end;
end;

код писал прямо здесь, не проверял )




Словарь, это такие таблицы, которые обычно заполняются первыми, перед использование базы данных и в дальнейшем не редактируются, например таблицы со Странами, Пол, Статус, Группа

Post's attachments

Attachment icon uniq.png 246.49 kb, 362 downloads since 2014-08-23 

Dmitry.

3 (edited by savage 2014-08-23 11:51:43)

Re: [Решено] Таблица - словарь -- уникальные поля

DriveSoft, сначала попробовал для одиночного применить Ваш скрипт - получилось!

procedure AddAuthor_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
      // защита от сохранения пустой записи
      if AddAuthor.Edit1.Text='' then
            begin
              ShowMessage('Заполните поле "ФИО Автора"!'); 
              Cancel := True; // отменяем действие кнопки
            end else
             // защита от дублирования записи
              if StrToInt(VarToStr(SQLExecute ('SELECT count(*) from Authors WHERE authors_name="' + AddAuthor.Edit1.Text + '"'))) > 0 then
                 begin
                    ShowMessage('Такой пользователь уже есть');
                    Cancel := True;
                 end;
end;

сейчас попробую сделать защиты при условии проверки 2-х полей
Сделал, тоже все ОК, только небольшая ошибка закралась в Вашем скрипте. У меня так заработало (таблицу, поля и эдиты уже не стал изменять):

if StrToInt(VarToStr(SQLExecute ('SELECT count(*) from Readers WHERE lastname="' + AddReader.Edit1.Text + '" AND firstname="' + AddReader.Edit2.Text + '"' ))) > 0 then

Re: [Решено] Таблица - словарь -- уникальные поля

Прошу прощения, а как можно проверить уникальность при добавлении TableGrid

Задача такая:
в TableGrid1 после поиска содержится информация о человеке (имя, должность)
надо добавить его ответственным к предмету
Реализовал через промежуточную таблицу: "Номер предмета - номер человека" (у предмета может быть много ответственных и человек может отвечать за много предметов, но по одному разу)
Соответственно хотелось бы выдать ошибку при попытке добавить повторно человека к тому же предмету.

Re: [Решено] Таблица - словарь -- уникальные поля

dpviper
Пришлите проект на support@drive-software.com
постараюсь помочь.

Dmitry.