Как проверть наличие объекта в базе?

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

Как проверть наличие объекта в базе?

Сообщение Kikx »

Нужно сделать так: в действии, имея описание и тип для объекта, проверить, существует ли такой в базе, и если нет, то создать его, а если есть - то, например, получить его ID. Возможно такое?
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение 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')) //В зависимомти от полученного результата либо создаем новый объект, либо используем ранее созданный
Ах и с ними невозможно
И без них никак нельзя
Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение Kikx »

Спасибо! Только вот терзают сомнения, execsqlselect_3 вроде бы с новых версий работает, а мы на 4.12 сидим...
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение Disillusioned »

f_ExecSQLSelect_2
Ах и с ними невозможно
И без них никак нельзя
gali
Активный участник
Сообщения: 285
Зарегистрирован: 27 мар 2007, 07:43

Re: Как проверть наличие объекта в базе?

Сообщение gali »

Я не очень помню, что было в 4.12, но наверняка была f_ExecSQLSelect. В данном случае разница не принципиальна. И еще одно добавление к совету Disillusioned'а. Мне в свое время рекомендовали SELECT min(id) искать (или max), чтоб уж наверняка запрос не выдавал ошибок.
Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение 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 - имя переменной "тип объекта", подставляется в скобки
Так?
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение Disillusioned »

obj_desc - это, я так понимаю, имя переменной типа строка, содержащее описание объекта, и подставляется в запрос между плюсиков;
tobj - имя переменной "тип объекта", подставляется в скобки
Так?
В принципе так, только тип объекта не в скобки подставляется, string преобразует число в строку.
И не забудьте про min(id), как верно заметила gali.
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение Anderyt »

да, очень похоже на то.
замечу, искать объект можно и без запросов к базе.
можно устроить поиск переменной типа объект (по описанию и типу, в том числе) и анализировать найденный объект. если объект не найден - будет null.
но! у этого способа есть очень серьезный момент, который иногда не позволит его применять.
Лоция в этом случае ищет не просто объект по условию, а ищет ОДИН объект по условию. другими словами, если таких объектов несколько - то один объект найден НЕ будет, и в переменной будет null.
достаточно допустить появления одного незаконного объекта - и такая проверка будет всегда сообщать, что объекта не существует, приводя к созданию очередного клона..
в этом смысле использование запросов - более гибкая и надежная штука.
(хотя синтаксис использования переменных в запросе - это блин отдельная тема :-( со всеми этими '~' и так далее...)
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Как проверть наличие объекта в базе?

Сообщение Старик Крупский »

А можно в запросе еще и count использовать. Тогда даже можно вывести сообщение типа сорри, месье (мадам), а в базе уже есть столько-то таких объектов :D
"Лучше меньше, да лучше" (C)
gali
Активный участник
Сообщения: 285
Зарегистрирован: 27 мар 2007, 07:43

Re: Как проверть наличие объекта в базе?

Сообщение gali »

да уж, использовать в действии в строчечке запрос к базе да еще с многими условиями, да еще с переменными...
это отдельная головная боль
Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение 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=... тоже не понятно :-(
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение Disillusioned »

~' добавление апострофа в строку
Строку - description='описание'
надо указывать как description=~'описание~'
Ах и с ними невозможно
И без них никак нельзя
Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение Kikx »

а плюсики зачем? чтобы отличать строку от имени переменной?
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Как проверть наличие объекта в базе?

Сообщение Disillusioned »

плюсики чтобы строки складывать
Ах и с ними невозможно
И без них никак нельзя
Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

Re: Как проверть наличие объекта в базе?

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