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

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

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

Народное голосование ПРЕМИИ РУНЕТА-2007!
Голосуем за RusFAQ.ru >>

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

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

Выпуск № 416
от 07.11.2007, 11:35

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


Вопрос № 107754: Здрасвтвуйте, господа эксперты. столкнулся с очередной проблемой: у меня есть форма более менее стандартная: с полями Edit (Ф., И., О., тел., и все такое прочее), а так же dbgrid (в нем в виде таблицы отображаюца записи), а так же кнопки - до...

Вопрос № 107.754
Здрасвтвуйте, господа эксперты.
столкнулся с очередной проблемой:
у меня есть форма более менее стандартная: с полями Edit (Ф., И., О., тел., и все такое прочее), а так же dbgrid (в нем в виде таблицы отображаюца записи), а так же кнопки - добавить, удалить, изменить . Когда щелкаешь по строчке в dbgrid'е то поля оттуда соответственно отображаются в полях Edit. Поправил запись - нажал изменить. Чтобы изменения отображались сразу в dbgrid, я делаю повторную выбрку (Query.Active:=false, потом true). после этого, курсор в dbgrid указывает на 1-ю строчку в списке, а мне надо бы что бы он оставался на той которая изменялась. я вроде нашел способ как это реализовать с помощью свойства BookMark (GetBookMark и GoToBookMark), но к сожалению это помогло лишь отчасти - дело в том что записи при выводе в dbgrid'е сортируюся по полю "ник" и если он изменялся, то меняется и место в списке для данной записи, но bookmark ставит курсор именно на то место где запись БЫЛА до изменения, и, стало быть, теперь указывает на совершенно другую запись. Как мне можно побороть эту ситуацию?
И еще один вопрос:
Я использую БД FireBird. Есть таблица с полямии "ник", Ф., И., О., адрес, и т.п. предполагается что поле ник будет уникальным и непустым - о чем соответственно установлено в свойствах данного поля и когда я работаю с таблицей с помощью тулза IBExpert - это все отслеживается ОК. но если я заношу данные с помощью программы, которую пишу, (используются стандартные компоненты из палитры Interbase (IBDatabase, IBQuery, IBTransaction, IB StoredProcedure а так же стандартные Edit, DBGrid, DataSource) - для добавления-удаления использутся вызов хранимых процедур), то почему-то можно добавить записи в которых поле ник будет пустым или допускаюца повторения.
что лучше сделать: может надо что-то (что именно?) поменять в свойствах стандартных компонентов в программе?
или начать писать процедуры проверки полей при вводе?
или может это решено в доп комонентах для дельфи (я скачал в инете FIBPlus, но еще руки не дошли поставить и начать рабираца)?
Благодарю за внимание
Отправлен: 02.11.2007, 11:30
Вопрос задал: Косяков Михаил (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Netizen
Здравствуйте, Косяков Михаил!
Отвечу лишь отчасти советом. Для того, что обновить ADOQuery необязательно делать Active false потом true есть свойства ADOQuery.Requery();
Ответ отправил: Netizen (статус: Студент)
Ответ отправлен: 02.11.2007, 11:58
Оценка за ответ: 3
Комментарий оценки:
Спасибо за совет, но в Interbase метода такого не нашел.

Отвечает: Кэр Лаэда
Здравствуйте, Косяков Михаил!

По первому вопросу

используйте Locate



with CustTable do
Locate('Company;Contact', VarArrayOf(['Sight Diver','P']), loPartialKey);


по второму вопросу не могу ничего ответить так как не работал с FireBird, но могу дать все же совет, использовать в качестве ключевого поля integer с автоинкрементом, а перед вставкой нового имени просто делать запрос на наличие такого имени в базе.
---------
Я знаю что ничего не знаю, но я знаю больше, чем тот кто думает что знает все
Ответ отправил: Кэр Лаэда (статус: Практикант)
Ответ отправлен: 02.11.2007, 12:02

Отвечает: Проходящий Мимо
Здравствуйте, Косяков Михаил!
Дополню ответ Кэр Лаэда.
Для перемещения к нужной позиции после переоткрытия запроса нужно запомнить текущую позиция по ключевому полю, переоткрыть запрос, переместится к записи при помощи Locate:
var vId:string;
....
vId:=Query.FieldByName('Ключевое_поле');
Query.Active:=false;
..
Query.Open;
if Query.Locate('Ключевое_поле', vId, [])
then ... //действие, если нашли поле
else ... //действие, если поле не нашли

Для проверки уникальности достаточно создать индекс
ALTER TABLE "Таблица" ADD CONSTRAINT UNQ_CONTROLS UNIQUE ("Ник");
или при помощи IBExpert в редакторе таблиц перейти на закладку "Ограничения" -> "4.Уникальные" и через контекстное меню выбрать "Новый уникальный ключ". Для того, чтобы Ваш ник не был пустым, в редакторе напротив названия поля нужно поставить галочку в столбце "Не пусто". Удачи.

---------
Carpe diem!
Ответ отправил: Проходящий Мимо (статус: 9-ый класс)
Ответ отправлен: 02.11.2007, 12:29


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

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

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

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

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


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


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

В избранное