Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2010, 12:59   #1
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию field required but not supplied - firebird

Здравствуйте.
Не могу понять с какой стороны подступисться к такой проблеме:
в firebird-базе данных есть таблица SUBSCRIBER_TBL. У неё задан первичный ключ по полю ID_ с которым связан соответствующий генератор через триггер BEFORE_INSERT.
Набор данных этой таблицы отображается в DBGridEh из TZQuery (ZEOS).
Проблема заключается в том, что я не могу добавить новую запись в таблицу при помощи DBGridEh (т.е. при помощи курсора). Происходит вот что: после того как у новой записи заполняю требуемые значения (NAME_ и PHONE_) жму Enter (т.е. вызываю Post для моего набора данных) и вылетает сообщение "field ID_ required but not supplied" и запись не добавляется. Хотя если я делаю то же самое в IBExpert-е, то новая запись нормально добавляется.
Подскажите, плз, из-за чего может возникнуть эта проблема (DBGridEh или TZQuery), и как её можно решить. Или хотя бы где копать?
Greek9000 вне форума Ответить с цитированием
Старый 20.10.2010, 14:14   #2
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Проблема из-за того, что отправляя новую запись на сервер TZQuery не имеет и не передает значения ID_. Его парсер, "зная", что это значение требуется, но не обнаружив такового в запросе выдает ошибку.
Такое происходит только если добавление записи делается в гриде на форме.

В IBDataset, например, чтобы обойти эту проблему существует свойство GeneratorField, где указывается какое поле из таблицы имеет автоинкремент и с каким шагом. Это позволяет Dataset'у самому сгенерировать очередное значение новой записи и отправить его с запросом.
Может быть в TZQuery (или других компонентах, работающих с БД) тоже подобное есть. Наверняка разработчики Zeos знают об этой проблеме.

Если же нет, то пути два.
Первый написать ХП, которая доставляет на клиента значение текущего ID нужной таблицы (опросив генератор, в какой позиции у него находится ID). Клиент увеличивает это значение на тот шаг, который задан в генераторе и посылает это значение вместе со значениями всех полей. При этом придется в гриде добавить совсем не нужное поле для значений ID_.

Второй - бросить редактировать таблицу в гриде. Оставить ее только для отображения данных.

Есть, правда, и третий. Генерировать уникальные значение самому, а не поручать это генераторам.

P.S. Не очень понятно зачем в этом случае нужен ZEOS, когда для Firebird в Дельфи есть штатные компоненты IBX.

Последний раз редактировалось Karabash; 20.10.2010 в 14:20.
Karabash вне форума Ответить с цитированием
Старый 20.10.2010, 14:19   #3
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Отвечаю сам себе
Оказывается, что TZQuery, когда создаёт набор полей, то для полей, которые помечены как NOT NULL выставляет св-во Required равным True. А когда он выполняет обновление, порверяет, что бы Required было не равно True.
Обойти эту штуку можно 2-мя способами:
1. Создать поля вручную и нужным полям выстовить Required := False.
2. Каждый раз после загрузки набора данных указывать нужному полю Required := False

P.S.
Пока писал ответ нашлись ещё два варианта

Последний раз редактировалось Greek9000; 20.10.2010 в 14:21.
Greek9000 вне форума Ответить с цитированием
Старый 20.10.2010, 14:32   #4
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Не знаю какие еще нашлись варианты, но первые два из серии: "от лома нет приема".
Зачем же в полях таблицы БД устанавливать NOT NULL, если эта проверка отключается на клиенте (пусть даже у "нужных" полей)?
Karabash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Field not found New_One1603 БД в Delphi 3 11.04.2011 23:42
LValue required _-Re@l-_ Общие вопросы C/C++ 18 25.09.2010 15:20
в чём причина ошибки - mysql_num_rows(): supplied argument is not a valid vedro-compota PHP 6 23.09.2010 16:12
mysql_free_result(): supplied argument is not a valid MySQL result resource in lbkzhf SQL, базы данных 1 30.07.2010 16:46
Field not found Alkatras БД в Delphi 9 26.05.2010 06:51