Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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?


Наверх

Титульная страница Поиск, карта сайта Написать письмо