Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

DBGrid, Lookup Field, "Non-nullable column cannot be updated..."   Найти похожие ветки 

 
Clone   (2004-11-24 14:22) [0]

Пустячок, вроде, а обидно: Настроил LookUp поле в выборке, редактирую через Grid, все ОК.
НО: если просто руками стираю значение в LookUp столбце (то бишь очищаю ссылку на LookUp DataSet), то получаю EOle Exception вида:
"Non-nullable column cannot be updated to Null".
А мне бы надо получить не Null, а просто пустую строку. А не выходит...
PS: В LookUp DataSet"е есть запись вида: id=0, desc="" - т.е. именно определение пустой ссылки.
Если выбирать ее из выпадающего списка, то ОК, а вот руками - никак. М.б. где забыл какой "крыжык" проставить в Obj. Insp. а?


 
Sandman25 ©   (2004-11-24 14:32) [1]

Required у TField True?


 
Clone   (2004-11-24 14:38) [2]

Yes!


 
Sandman25 ©   (2004-11-24 14:42) [3]

Можно попробовать поставить обработчик TIntegerField.OnSetText:
if Text = "" then
 TIntegerField(Sender).AsInteger := 0
else
 TIntegerField(Sender).AsInteger := StrToInt(Text)


 
Clone   (2004-11-24 15:07) [4]

Не помогает абсолютно...
PS: я предполагаю, что можно попробовать ловить событие типа OnChange, OnSetText, OnValidate (причем именно для поля в LookUp столбце) и извращаться в обработчике... но надеялся, что "такую крохотную фичу" можно реализовать и простой настройкой компонентов. Неужто так запущено ?


 
Sergey13 ©   (2004-11-24 15:14) [5]

2Clone   (24.11.04 14:22)
А зачем ты его "просто руками стираю значение", если поле не может быть нулом?


 
Sandman25 ©   (2004-11-24 15:16) [6]

[5] Sergey13 ©   (24.11.04 15:14)

Точно. Нужно на пробел нажать, а в справочнике сделать значение из одного пробела!


 
Clone   (2004-11-24 15:17) [7]

Sergey13: А какой ты предложишь способ "очищать ссылку" ?
Причем именно руками, с клавиатуры (объяснять пользователю, что обязательно надо выбирать из выпадающего списка ?!)


 
Clone   (2004-11-24 15:21) [8]

Sandman25: Какой, блин, пробел? Вы чо, ребята! (Да и не всегда это вообще возможно!) Это еще хуже, чем "ловить события и причесывать их кодом". Ну дела...


 
Sergey13 ©   (2004-11-24 15:21) [9]

2 [7] Clone   (24.11.04 15:17)
Поле у тебя не может быть NULL (это ограничение в таблице такое). Ты его и не сможешь "очистить". Исправить на другое можно, "очистить" нельзя.


 
Clone   (2004-11-24 15:25) [10]

Опять сначала: Да, поле NOT NULL. Вопрос был - как присвоить ему значение "пустая строка"? Неужто никак без обработчиков???


 
Clone   (2004-11-24 15:25) [11]

Опять сначала: Да, поле NOT NULL. Вопрос был - как присвоить ему значение "пустая строка"? Неужто никак без обработчиков???


 
Clone   (2004-11-24 15:28) [12]

Упсс! Склонировал... 8 )))
Эк здесь сервер глючит... (Или только у меня?)


 
Sergey13 ©   (2004-11-24 15:31) [13]

2[10] Clone   (24.11.04 15:25)
>Опять сначала: Да, поле NOT NULL. Вопрос был - как присвоить ему значение "пустая строка"?
А в справочнике, на который ссылается лукап есть запись с "пустая строка"?


 
Clone   (2004-11-24 15:35) [14]

Я, конечно, извиняюсь, но в самом первом своем посте я уже предварил этот вопрос своим PS :)))


 
Sergey13 ©   (2004-11-24 15:58) [15]

2[14] Clone   (24.11.04 15:35)
>Я, конечно, извиняюсь
Сори, не разглядел. 8-) А набирая что либо поиск по полю работает?


 
Clone   (2004-11-24 16:03) [16]

Конечно! Поэтому пользователю и удобнее все делать с клав-ры.


 
Sergey13 ©   (2004-11-24 16:06) [17]

Тогда может сделать не desc="" а например desc="   Нет ссылки" и пусть пробелом жмет. Видимо при стирании поиск не идет, что в общем то логично.


 
Clone   (2004-11-24 16:19) [18]

Sergey13: Да нет уж, менять идеологию и содержимое БД не буду. Наверное, ничего не остается, как писать процедуру, к-рая будет анализировать переданный ей Text, и подставлять 0 в поле c именем KeyFields, взятым из текущего LookUp поля.
И вызывать эту процедуру из всех OnSetText для таких LookUp полей.
Не ожидал, признаться... 8(((


 
Clone   (2004-11-24 17:46) [19]

Наверное, последнее дополнение:
Сперва маленькое уточнение - я использую DBGridEh.
Так вот, проще всего оказалось написать обработчик на dbGridColumnEh.OnUpdateData - всего из одной строки:
if (Value = Null) then Value := 0;
Этот обработчик имеет 2 параметра:
var Text: String; var Value: Variant
Причем, что интересно, для LookUp поля в этом обработчике Text - это LookUpResultField, а Value - это LookUpKeyField.
Так что присваивать надо именно 0, а не ""...



Страницы: 1 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
3-1101389391
СержК
2004-11-25 16:29
2004.12.26
При попытке записи в поле типа DATE выскакивает ошибка


3-1101453999
gantoxa
2004-11-26 10:26
2004.12.26
Подскажите, как определить тип поля и его длину


14-1102489705
NewDelpher
2004-12-08 10:08
2004.12.26
Переводчик с C++ на Pas


9-1093143246
Xerx
2004-08-22 06:54
2004.12.26
Где достать модели косм. кораблей?


9-1093282124
Creep
2004-08-23 21:28
2004.12.26
Как ввести в игру свой шрифт? Стандартными средствами Delphi7.