Страница 1 из 3
Как проверть наличие объекта в базе?
Добавлено: 16 мар 2009, 16:19
Kikx
Нужно сделать так: в действии, имея описание и тип для объекта, проверить, существует ли такой в базе, и если нет, то создать его, а если есть - то, например, получить его ID. Возможно такое?
Re: Как проверть наличие объекта в базе?
Добавлено: 16 мар 2009, 16:50
Disillusioned
Например, при помощи:
Код: Выделить всё
obj_id=Set(Number(f_ExecSQLSelect_3('SELECT id FROM object_reference_view WHERE description=~''+obj_desc+'~' AND type_id='+string(tobj),'','','cols:decimal(18)',0))) //Ищем ID объекта в базе, если не нашли получим 0
obj=SetByID(obj_id,'Y') //Пытаемся получить объект по коду, если 0 получим null
Goto(if(isnull(obj),'NEW','OLD')) //В зависимомти от полученного результата либо создаем новый объект, либо используем ранее созданный
Re: Как проверть наличие объекта в базе?
Добавлено: 16 мар 2009, 20:49
Kikx
Спасибо! Только вот терзают сомнения, execsqlselect_3 вроде бы с новых версий работает, а мы на 4.12 сидим...
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 08:53
Disillusioned
f_ExecSQLSelect_2
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 08:54
gali
Я не очень помню, что было в 4.12, но наверняка была f_ExecSQLSelect. В данном случае разница не принципиальна. И еще одно добавление к совету Disillusioned'а. Мне в свое время рекомендовали SELECT min(id) искать (или max), чтоб уж наверняка запрос не выдавал ошибок.
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 10:06
Kikx
Код: Выделить всё
obj_id=Set(Number(f_ExecSQLSelect_3('SELECT id FROM object_reference_view WHERE description=~''+obj_desc+'~' AND type_id='+string(tobj),'','','cols:decimal(18)',0)))
А можно небольшую справочку по синтаксису?

obj_desc - это, я так понимаю, имя переменной типа строка, содержащее описание объекта, и подставляется в запрос между плюсиков;
tobj - имя переменной "тип объекта", подставляется в скобки
Так?
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 10:18
Disillusioned
obj_desc - это, я так понимаю, имя переменной типа строка, содержащее описание объекта, и подставляется в запрос между плюсиков;
tobj - имя переменной "тип объекта", подставляется в скобки
Так?
В принципе так, только тип объекта не в скобки подставляется, string преобразует число в строку.
И не забудьте про min(id), как верно заметила gali.
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 10:36
Anderyt
да, очень похоже на то.
замечу, искать объект можно и без запросов к базе.
можно устроить поиск переменной типа объект (по описанию и типу, в том числе) и анализировать найденный объект. если объект не найден - будет null.
но! у этого способа есть очень серьезный момент, который иногда не позволит его применять.
Лоция в этом случае ищет не просто объект по условию, а ищет ОДИН объект по условию. другими словами, если таких объектов несколько - то один объект найден НЕ будет, и в переменной будет null.
достаточно допустить появления одного незаконного объекта - и такая проверка будет всегда сообщать, что объекта не существует, приводя к созданию очередного клона..
в этом смысле использование запросов - более гибкая и надежная штука.
(хотя синтаксис использования переменных в запросе - это блин отдельная тема

со всеми этими '~' и так далее...)
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 11:23
Старик Крупский
А можно в запросе еще и count использовать. Тогда даже можно вывести сообщение типа сорри, месье (мадам), а в базе уже есть столько-то таких объектов

Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 12:42
gali
да уж, использовать в действии в строчечке запрос к базе да еще с многими условиями, да еще с переменными...
это отдельная головная боль
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 13:07
Kikx
Disillusioned писал(а):
В принципе так, только тип объекта не в скобки подставляется, string преобразует число в строку.
И не забудьте про min(id), как верно заметила gali.
Тогда запрос будет выглядеть, как
Код: Выделить всё
obj_id=Set(Number(f_ExecSQLSelect_3('SELECT min(id) FROM object_reference_view WHERE description=~''+obj_desc+'~' AND type_id='+string(tobj),'','','cols:decimal(18)',0)))
Мне все же хочется узнать, как расставляются кавычки, пробелы и плюсики, т.к. функция в данном виде выдает ошибку. Видимо, где-то чего-то не хватает.
Вот, например, что дают тильда и две кавычки, когда мы задаем описание? Может, там надо писать
'~'+obj_desc+'~'? И с type_id=... тоже не понятно

Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 13:19
Disillusioned
~' добавление апострофа в строку
Строку - description='описание'
надо указывать как description=~'описание~'
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 13:38
Kikx
а плюсики зачем? чтобы отличать строку от имени переменной?
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 14:48
Disillusioned
плюсики чтобы строки складывать
Re: Как проверть наличие объекта в базе?
Добавлено: 17 мар 2009, 16:00
Kikx
Еще одну вещь заметил.
Код: Выделить всё
f_ExecSQLSelect_3('SELECT min(id) FROM object_reference_view WHERE description=~''+obj_desc+'~' AND type_id='+string(tobj),'','','cols:decimal(18)',0)
Перед SELECT есть кавычка, а после, походу, нет. Нужна?