Вопрос № 94171: Здравствуйте уважаемые! Мне срочно нужна помощь, если кто знает подскажите как организовать сравнение по вводу данных, сейчас поясню: мне нужно ввести новую строчку в таблицу DBGrid1, вводиться значение через Edit1, и когда я нажимаю на кнопку «Добав...
Вопрос № 94.171
Здравствуйте уважаемые! Мне срочно нужна помощь, если кто знает подскажите как организовать сравнение по вводу данных, сейчас поясню: мне нужно ввести новую строчку в таблицу DBGrid1, вводиться значение через Edit1, и когда я нажимаю на кнопку «Добавления» button1, мне нужно чтобы значение в Edit1 сравнилось с другими значениями находящимися в DBGrid1 в строчках определенного столбца DBGrid1.Columns.Items[0].FieldName := ‘Номер документа’. И после сравнения если такая запись уже есть, то нужно вывести сообщение
«запись уже есть» и отменить добавление.
Вот код моего мучения:
adotable1.insert;
adotable1.FieldByName(Номер документа).AsString:=edit1.text;
if edit1.text = adotable1.FieldByName(Номер документа) then adotable1.delete;
else begin if adotable1.Modified then adotable1.Post;
end;
Подскажите пожалуйста что у меня неправильно.
Отвечает: Кэр Лаэда
Здравствуйте, Николайченко Андрей Сергеевич!
Попробуйте сделать так.
разместите компонент AdoQuery1 на форме, и настройте строку Connection так как было настроено в AdoTable
затем сделайте так
так как я не знаю какая у вас таблица то предположим что таблица называется table
после того как ввели данные в Edit, делаем следущее
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select Номер_документа from table where Номер_документа='+Edit1.Text);
Open;
end;
if ADOQuery1.RecordCount>0 then ShowMessage('Запись уже есть')
else
begin
//а тут можно сделать добавление записи так же запросом
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('insert into table (Номер_документа) values ('+Edit1.Text+')');
ExecSQL;
end;
end
единственное на что хочу обратить внимание это то что я использовал в качестве имени поля 'Номер_документа' а не 'Номер документа' т.к. давать именам полей таблицы с пробелами можно не очень хорошо, в таком случае нужно в некоторых базах данных использовать в запросе в имени []
т.е. в данном случае [Номер документа] но повторяю это работает не везде именно поэтому я сделал имя поля без пробела.
--------- Я знаю что ничего не знаю, но я знаю больше, чем тот кто думает что знает все
Ответ отправил: Кэр Лаэда (статус: Студент)
Ответ отправлен: 06.07.2007, 14:46
Отвечает: Виктор Пырлик
Здравствуйте, Николайченко Андрей Сергеевич!
Вам надо определить – имеется ли уже такая запись, и если да – исключить дублирование. Это делается, как правило, на уровне базы данных (таблицы), но предлагаю второй, тоже распространенный и более верный метод чем ваш:
Поиск ведется по таблице – набору данных.
Суть в методе Locate имеющегося у всех наборов данных (TTable, TQuery, TADOTable, TADOQuery, TADOQuery, TIBQuery).
Вызов:
ADOTable1.Locate(‘NumDok’, Edit1.Text, [loPartialKey]);
Возвращает true – если запись имеется и false если нет (при этом, если запись имеется – курсор переходит на эту запись)
Ключи и примеры использования можете посмотреть в справке Delphi.
Простейший случай – создать функцию, которая проверяет существования записи:
function TForm1.IsValidRec(pole:String; value:String):Boolean;
begin
ADOTable1.DisableControls; // предотвращаем моргание набора данных
result := ADOTable1.Locate(‘NumDok’, Edit1.Text, [loPartialKey]);
if (result = true) then
ShowMessage(‘Запись ‘+value+’ имеется’);
ADOTable1.EnabkeControls;
end;
Можно сделать такую функцию универсальной, если добавить параметр TDataSet.
Таким образом, вся логика строится на наборах данных и ни как не затрагивает компоненты отображения данных.
По вашему коду: Надо сначала сравнить – есть или нет в таблице такие данные, если нет, можно сделать команду Insert иначе ничего не делать – сообщить.
Результат = ПроверитьДанные(данные)
Если результат = ложь то
Перевести набор данных в вставку
Записать новое значение
Сохранить значение
Иначе
Сообщить о дублировании
Выйти
--------- Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: 6-ой класс)
Ответ отправлен: 06.07.2007, 17:17