Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Ошибка при добавленни записи в таблицу


Автор: AlexLogos 10.6.2010, 15:56
Здравствуйте форумчане! Вопрос следующий: работаю з Oracle 8i в Delphi 2009. Создал таблицу в которую пишу сведенья о связи некоего обьекта и нескольких характеристик. Таблица предельно проста:
Код

CREATE TABLE REF_OSOBA_HO
(
    id    NUMBER UNIQUE NOT NULL,
    idos    NUMBER NOT NULL,
    idcl    NUMBER NOT NULL,
    cluplevel    NUMBER,
    CONSTRAINT PK_REF_OSOBA_HO PRIMARY KEY (id )
)


дело в том что в Oracle нет поля autoincrement, поэтому я решил использовать для этого триггер. Создал следующий сиквенс и триггер:
Код

CREATE SEQUENCE REF_OSOBA_HO_SEQ
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE
/


CREATE OR REPLACE TRIGGER REF_OSOBA_HO_BI before INSERT on REF_OSOBA_HO FOR each row
BEGIN
IF :new.id IS NULL then
    SELECT REF_OSOBA_HO_SEQ.NEXTVAL
    INTO :new.id
    FROM dual;
  end IF;
END;

Для работы с базой я использую Древний Тоад. Когда я добавляю в базу данные с помощью тоада - триггер и сиквенс работают нормально и мне не нужно вводить значение ID - оно заполняется автоматически... Но когда при прогоне программы я с помощью ДБНавигатора добавляю запись, жму на Пост - вилезает ошибка что поле ID должно бить заполнено. Триггер не сработал. Я так понимаю что в этом случае Делфа контролирует ввод данных в таблицу до использования триггера. Каким образом это обойти? Путь выполнения запроса к базе для вычисления максимального значения индекса не предлагать  smile 





 

Автор: 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 (который для отображения редактирования таблиц используете) какая фамилия ? smile

Автор: 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 Ы  подходят для редактирования только локальных бд, нет теоретически можно как угодно, но практически нах.. В общем для редактирования и добавления= только запросы, как и где решайте сами. Или редактируйте стандартные компоненты под свои нужды.. не так сложно как кажется (а гораздо сложнее заколебаешся разбиратся в куче функций и процедур, но вполне возможно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)