Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 362
от 12.07.2007, 09:35

Администратор:Gh0stik
В рассылке:Подписчиков: 329, Экспертов: 43
В номере:Вопросов: 1, Ответов: 2


Вопрос № 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;
Подскажите пожалуйста что у меня неправильно.
Отправлен: 06.07.2007, 14:16
Вопрос задал: Николайченко Андрей Сергеевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Кэр Лаэда
Здравствуйте, Николайченко Андрей Сергеевич!
Попробуйте сделать так.

разместите компонент 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.53 beta от 09.07.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное