| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Ошибка при добавленни записи в таблицу |
| Автор: AlexLogos 10.6.2010, 15:56 | ||||
Здравствуйте форумчане! Вопрос следующий: работаю з Oracle 8i в Delphi 2009. Создал таблицу в которую пишу сведенья о связи некоего обьекта и нескольких характеристик. Таблица предельно проста:
дело в том что в Oracle нет поля autoincrement, поэтому я решил использовать для этого триггер. Создал следующий сиквенс и триггер:
Для работы с базой я использую Древний Тоад. Когда я добавляю в базу данные с помощью тоада - триггер и сиквенс работают нормально и мне не нужно вводить значение ID - оно заполняется автоматически... Но когда при прогоне программы я с помощью ДБНавигатора добавляю запись, жму на Пост - вилезает ошибка что поле ID должно бить заполнено. Триггер не сработал. Я так понимаю что в этом случае Делфа контролирует ввод данных в таблицу до использования триггера. Каким образом это обойти? Путь выполнения запроса к базе для вычисления максимального значения индекса не предлагать |
| Автор: vovk 10.6.2010, 16:42 |
| 1)В датасете в наборе исключить поле id 2)Добавлять запросом 3) Подправить procedure TDataSet.CheckRequiredFields; в модуле DB или 4) найти компонент который учитывает ваши требования |
| Автор: AlexLogos 10.6.2010, 16:49 |
| Прекрасный ответ. Первый вариант работает но выдает ошибку при удалении записи тем же ДБНавигатором - нет поля OldID. Второй вариант классный и безотказный но я не хотел лишний раз писать код и бросать на форму лишние Квоери. Трерий вариант, я б сказал Вариантище - не хоцца мне туду лезть... Четвертый - надо ж искать, а я себе не представляю как сформлировать поисковый запрос. Искать Автоинкрементик? Еще предложения... Пока склоняюсь к запросу... |
| Автор: vovk 10.6.2010, 17:11 |
| А вы какие компоненты доступа используете? Точнее у TDAtaset (который для отображения редактирования таблиц используете) какая фамилия ? |
| Автор: AlexLogos 11.6.2010, 11:26 |
| Для доступа к базе использую OraSession, для доступа к данным - OraTable, таблицы между собой слегка связаны, но не по тому полю через которое ошибка... Отображаю данныес помощью стандартных DBGrid, DBEdit, DBLookUpListBox... |
| Автор: AlexLogos 11.6.2010, 20:19 |
| Универсального решения не нашел. В одних случаях решил использовать триггер, в некоторых - вычисление и подстановку значений... |
| Автор: vovk 12.6.2010, 02:21 |
| ну ненаю, то что вы сказали к стандартым компонентам дельфи я не отношу (даже не знаю что это OraSession, OraTable ) Но подход к проблеме простой, всё что нужно делает СУБД , а с клиенского приложения только отправляются данные , что куда записать, или что от куда показать . удалите на**** навигатор, а DBGrid используйте только для отображеня данных, но никак не для редактирования. И вообще ввсякие dbedit Ы подходят для редактирования только локальных бд, нет теоретически можно как угодно, но практически нах.. В общем для редактирования и добавления= только запросы, как и где решайте сами. Или редактируйте стандартные компоненты под свои нужды.. не так сложно как кажется (а гораздо сложнее заколебаешся разбиратся в куче функций и процедур, но вполне возможно |