![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DBGrid, Lookup Field, "Non-nullable column cannot be updated..."
Clone © (2004-11-24 14:22:00)Пустячок, вроде, а обидно: Настроил LookUp поле в выборке, редактирую через Grid, все ОК.
НО: если просто руками стираю значение в LookUp столбце (то бишь очищаю ссылку на LookUp DataSet), то получаю EOle Exception вида:
"Non-nullable column cannot be updated to Null".
А мне бы надо получить не Null, а просто пустую строку. А не выходит...
PS: В LookUp DataSet'е есть запись вида: id=0, desc='' - т.е. именно определение пустой ссылки.
Если выбирать ее из выпадающего списка, то ОК, а вот руками - никак. М.б. где забыл какой "крыжык" проставить в Obj. Insp. а?
Clone (2004-11-24 17:46:00) [1]Наверное, последнее дополнение:
Сперва маленькое уточнение - я использую DBGridEh.
Так вот, проще всего оказалось написать обработчик на dbGridColumnEh.OnUpdateData - всего из одной строки:
if (Value = Null) then Value := 0;
Этот обработчик имеет 2 параметра:
var Text: String; var Value: Variant
Причем, что интересно, для LookUp поля в этом обработчике Text - это LookUpResultField, а Value - это LookUpKeyField.
Так что присваивать надо именно 0, а не ''...
Clone (2004-11-24 16:19:00) [2]Sergey13: Да нет уж, менять идеологию и содержимое БД не буду. Наверное, ничего не остается, как писать процедуру, к-рая будет анализировать переданный ей Text, и подставлять 0 в поле c именем KeyFields, взятым из текущего LookUp поля.
И вызывать эту процедуру из всех OnSetText для таких LookUp полей.
Не ожидал, признаться... 8(((
Sergey13 (2004-11-24 16:06:00) [3]Тогда может сделать не desc='' а например desc=' Нет ссылки' и пусть пробелом жмет. Видимо при стирании поиск не идет, что в общем то логично.
Clone (2004-11-24 16:03:00) [4]Конечно! Поэтому пользователю и удобнее все делать с клав-ры.
Sergey13 (2004-11-24 15:58:00) [5]2[14] Clone (24.11.04 15:35)
>Я, конечно, извиняюсь
Сори, не разглядел. 8-) А набирая что либо поиск по полю работает?
Clone (2004-11-24 15:35:00) [6]Я, конечно, извиняюсь, но в самом первом своем посте я уже предварил этот вопрос своим PS :)))
Sergey13 (2004-11-24 15:31:00) [7]2[10] Clone (24.11.04 15:25)
>Опять сначала: Да, поле NOT NULL. Вопрос был - как присвоить ему значение "пустая строка"?
А в справочнике, на который ссылается лукап есть запись с "пустая строка"?
Clone (2004-11-24 15:28:00) [8]Упсс! Склонировал... 8 )))
Эк здесь сервер глючит... (Или только у меня?)
Clone (2004-11-24 15:25:00) [9]Опять сначала: Да, поле NOT NULL. Вопрос был - как присвоить ему значение "пустая строка"? Неужто никак без обработчиков???
Clone (2004-11-24 15:25:00) [10]Опять сначала: Да, поле NOT NULL. Вопрос был - как присвоить ему значение "пустая строка"? Неужто никак без обработчиков???
Sergey13 (2004-11-24 15:21:00) [11]2 [7] Clone (24.11.04 15:17)
Поле у тебя не может быть NULL(это ограничение в таблице такое). Ты его и не сможешь "очистить". Исправить на другое можно, "очистить" нельзя.
Clone (2004-11-24 15:21:00) [12]Sandman25: Какой, блин, пробел? Вы чо, ребята! (Да и не всегда это вообще возможно!) Это еще хуже, чем "ловить события и причесывать их кодом". Ну дела...
Clone (2004-11-24 15:17:00) [13]Sergey13: А какой ты предложишь способ "очищать ссылку" ?
Причем именно руками, с клавиатуры (объяснять пользователю, что обязательно надо выбирать из выпадающего списка ?!)
Sandman25 (2004-11-24 15:16:00) [14][5] Sergey13 © (24.11.04 15:14)
Точно. Нужно на пробел нажать, а в справочнике сделать значение из одного пробела!
Sergey13 (2004-11-24 15:14:00) [15]2Clone (24.11.04 14:22)
А зачем ты его "просто руками стираю значение", если поле не может быть нулом?
Clone (2004-11-24 15:07:00) [16]Не помогает абсолютно...
PS: я предполагаю, что можно попробовать ловить событие типа OnChange, OnSetText, OnValidate (причем именно для поля в LookUp столбце) и извращаться в обработчике... но надеялся, что "такую крохотную фичу" можно реализовать и простой настройкой компонентов. Неужто так запущено ?
Sandman25 (2004-11-24 14:42:00) [17]Можно попробовать поставить обработчик TIntegerField.OnSetText:
if Text = '' then
TIntegerField(Sender).AsInteger := 0
else
TIntegerField(Sender).AsInteger := StrToInt(Text)
Clone (2004-11-24 14:38:00) [18]Yes!
Sandman25 (2004-11-24 14:32:00) [19]Required у TField True?