Страница 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 использовать. Тогда даже можно вывести сообщение типа сорри, месье (мадам), а в базе уже есть столько-то таких объектов :D

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 есть кавычка, а после, походу, нет. Нужна?