Как проверть наличие объекта в базе?
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Как проверть наличие объекта в базе?
Нужно сделать так: в действии, имея описание и тип для объекта, проверить, существует ли такой в базе, и если нет, то создать его, а если есть - то, например, получить его ID. Возможно такое?
- Disillusioned
- Активный участник
- Сообщения: 420
- Зарегистрирован: 15 июл 2004, 15:12
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Подольск
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Например, при помощи:
Код: Выделить всё
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')) //В зависимомти от полученного результата либо создаем новый объект, либо используем ранее созданный
Ах и с ними невозможно
И без них никак нельзя
И без них никак нельзя
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Спасибо! Только вот терзают сомнения, execsqlselect_3 вроде бы с новых версий работает, а мы на 4.12 сидим...
- Disillusioned
- Активный участник
- Сообщения: 420
- Зарегистрирован: 15 июл 2004, 15:12
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Подольск
- Контактная информация:
Re: Как проверть наличие объекта в базе?
f_ExecSQLSelect_2
Ах и с ними невозможно
И без них никак нельзя
И без них никак нельзя
Re: Как проверть наличие объекта в базе?
Я не очень помню, что было в 4.12, но наверняка была f_ExecSQLSelect. В данном случае разница не принципиальна. И еще одно добавление к совету Disillusioned'а. Мне в свое время рекомендовали SELECT min(id) искать (или max), чтоб уж наверняка запрос не выдавал ошибок.
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Код: Выделить всё
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 - имя переменной "тип объекта", подставляется в скобки
Так?
- Disillusioned
- Активный участник
- Сообщения: 420
- Зарегистрирован: 15 июл 2004, 15:12
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Подольск
- Контактная информация:
Re: Как проверть наличие объекта в базе?
В принципе так, только тип объекта не в скобки подставляется, string преобразует число в строку.obj_desc - это, я так понимаю, имя переменной типа строка, содержащее описание объекта, и подставляется в запрос между плюсиков;
tobj - имя переменной "тип объекта", подставляется в скобки
Так?
И не забудьте про min(id), как верно заметила gali.
Ах и с ними невозможно
И без них никак нельзя
И без них никак нельзя
- Anderyt
- Активный участник
- Сообщения: 777
- Зарегистрирован: 15 июл 2004, 13:15
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Тюмень
- Контактная информация:
Re: Как проверть наличие объекта в базе?
да, очень похоже на то.
замечу, искать объект можно и без запросов к базе.
можно устроить поиск переменной типа объект (по описанию и типу, в том числе) и анализировать найденный объект. если объект не найден - будет null.
но! у этого способа есть очень серьезный момент, который иногда не позволит его применять.
Лоция в этом случае ищет не просто объект по условию, а ищет ОДИН объект по условию. другими словами, если таких объектов несколько - то один объект найден НЕ будет, и в переменной будет null.
достаточно допустить появления одного незаконного объекта - и такая проверка будет всегда сообщать, что объекта не существует, приводя к созданию очередного клона..
в этом смысле использование запросов - более гибкая и надежная штука.
(хотя синтаксис использования переменных в запросе - это блин отдельная тема
со всеми этими '~' и так далее...)
замечу, искать объект можно и без запросов к базе.
можно устроить поиск переменной типа объект (по описанию и типу, в том числе) и анализировать найденный объект. если объект не найден - будет null.
но! у этого способа есть очень серьезный момент, который иногда не позволит его применять.
Лоция в этом случае ищет не просто объект по условию, а ищет ОДИН объект по условию. другими словами, если таких объектов несколько - то один объект найден НЕ будет, и в переменной будет null.
достаточно допустить появления одного незаконного объекта - и такая проверка будет всегда сообщать, что объекта не существует, приводя к созданию очередного клона..
в этом смысле использование запросов - более гибкая и надежная штука.
(хотя синтаксис использования переменных в запросе - это блин отдельная тема

лучше день потерять, потом за пять минут долететь!
- Старик Крупский
- Активный участник
- Сообщения: 803
- Зарегистрирован: 27 июл 2006, 22:17
- Откуда: Москва
Re: Как проверть наличие объекта в базе?
А можно в запросе еще и count использовать. Тогда даже можно вывести сообщение типа сорри, месье (мадам), а в базе уже есть столько-то таких объектов 

"Лучше меньше, да лучше" (C)
Re: Как проверть наличие объекта в базе?
да уж, использовать в действии в строчечке запрос к базе да еще с многими условиями, да еще с переменными...
это отдельная головная боль
это отдельная головная боль
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Тогда запрос будет выглядеть, как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=... тоже не понятно

- Disillusioned
- Активный участник
- Сообщения: 420
- Зарегистрирован: 15 июл 2004, 15:12
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Подольск
- Контактная информация:
Re: Как проверть наличие объекта в базе?
~' добавление апострофа в строку
Строку - description='описание'
надо указывать как description=~'описание~'
Строку - description='описание'
надо указывать как description=~'описание~'
Ах и с ними невозможно
И без них никак нельзя
И без них никак нельзя
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
а плюсики зачем? чтобы отличать строку от имени переменной?
- Disillusioned
- Активный участник
- Сообщения: 420
- Зарегистрирован: 15 июл 2004, 15:12
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Подольск
- Контактная информация:
Re: Как проверть наличие объекта в базе?
плюсики чтобы строки складывать
Ах и с ними невозможно
И без них никак нельзя
И без них никак нельзя
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Еще одну вещь заметил.
Перед SELECT есть кавычка, а после, походу, нет. Нужна?
Код: Выделить всё
f_ExecSQLSelect_3('SELECT min(id) FROM object_reference_view WHERE description=~''+obj_desc+'~' AND type_id='+string(tobj),'','','cols:decimal(18)',0)