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

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
gali
Активный участник
Сообщения: 285
Зарегистрирован: 27 мар 2007, 07:43

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

Сообщение gali »

той, что перед select'ом соответствует та, что после ~'. Там ведь их две, не так ли?
Это просто строка, которая передается в sql на выполнение
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

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

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

Короче. Если в функции есть строковый аргумент, то он передается в функцию либо через переменную, либо через выражение. Выражение должно вернуть строку - мы же помним, что аргумент строковый. Соответственно, если в выражении используются разные штучки типа констант, функций и переменных, то их надо между собой сцепить так, чтобы результат выглядел как цельная строка.
Если у нас есть строковая переменная с именем Var со значением 'value', то если указать ее в кавычках, получим строку 'Var', а если без кавычек, то как раз получим значение этой переменной.
Тильды используются для того, чтобы внутри одной пары кавычек использовать другую пару. Тильдами вложенная пара кавычек и помечается. Можно наружные кавычки заменить двойными, а внутренние одинарными, тогда тильды не понадобятся.
"Лучше меньше, да лучше" (C)
Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

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

Сообщение Kikx »

О, теперь понятно :-) Разложил всю строку, так сказать, по полочкам, и Лоция больше не выдает ошибки в редакторе действий. Функция f_execSQLSelect теперь выглядит следующим образом:

Код: Выделить всё

f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description=obj_desc AND type_id=tobj' , '' , '' )
где obj_desc - строковая переменная, и tobj - числовая переменная.

Однако даже если объект с такими параметрами существует, запрос всегда возвращает 0. Теперь вопросы :-)
1. Имя столбцов таблицы object_reference указывается просто "как есть", или как "object_reference.<столбец>"?
2. Зачем было нужно

Код: Выделить всё

'cols:decimal(18)',0
в конце запроса?
3. Чтобы выбрать минимальный id, нужно писать как у меня [min(id)]?
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

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

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

Kikx писал(а):О, теперь понятно :-) Разложил всю строку, так сказать, по полочкам, и Лоция больше не выдает ошибки в редакторе действий. Функция f_execSQLSelect теперь выглядит следующим образом:

Код: Выделить всё

f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description=obj_desc AND type_id=tobj' , '' , '' )
где obj_desc - строковая переменная, и tobj - числовая переменная.

Однако даже если объект с такими параметрами существует, запрос всегда возвращает 0.
Ничего вам не понятно :) Должно быть:

Код: Выделить всё

f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description=~'' +obj_desc + '~' AND type_id=tobj' , '' , '' )
То есть строку надо разорвать, чтобы obj_desc было вне кавычек и "отдало" свое значение. А так у вас ищется объект с описанием "obj_desc".
Теперь вопросы :-)
1. Имя столбцов таблицы object_reference указывается просто "как есть", или как "object_reference.<столбец>"?
По правилам языка SQL. Лучше в полном формате.
2. Зачем было нужно

Код: Выделить всё

'cols:decimal(18)',0
в конце запроса?
Это синтаксис функции f_ExecSQLSelect_3
3. Чтобы выбрать минимальный id, нужно писать как у меня [min(id)]?
Да
"Лучше меньше, да лучше" (C)
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

Сообщение Александр »

ну блин вы даете :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

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

Сообщение Kikx »

Так-с, еще раз, давайте разбираться.
Старик Крупский писал(а): Если у нас есть строковая переменная с именем Var со значением 'value', то если указать ее в кавычках, получим строку 'Var', а если без кавычек, то как раз получим значение этой переменной.
Из этого следует, что, указав description=obj_desc, в sql-запрос передается значение переменной obj_desc, а не ее имя.

Код: Выделить всё

description=~'' +obj_desc + '~'
1. Меня тут такая мысль посетила... Мы же говорим о запросах для MS SQL, а не для Oracle или Sybase? :-)
2. Как должен выглядеть передаваемый аргумент description вообще? description='<значение>' или description=<значение>?
3. Этим мы хотим передать строку '<значение переменной obj_desc>', как строку, взяв ее в кавычки еще раз?
4. Лоции не нравится конструкция из тильд и кавычек, пишет "ошибка".
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

Сообщение Александр »

можно я еще немного запутаю :wink:
http://www.lplm.ru/phpBB2/viewtopic.php?f=18&t=313

Лоции нравится очень много - просто проверь синтаксис
нужно получить СТРОКУ в синтаксисе SQL и все

то что получается на самом деле покажет отладчик/трассировщик SQL
для mssql2005 это Profiler

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

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

Сообщение Kikx »

Потыкал MS SQL Server, понял, зачем столько кавычек :-) Сам сервер хочет запрос в формате description = '<string>', и чтобы передать эти кавычки, нужны еще одни, для самой Лоции.
Однако тут возникла трудность :-) Кавычек этих в ряд получается не 2, а 3 (одни для запроса, вторые для того, чтобы Лоция передавала первые в виде строки, третьи - закрывающие для кавычки перед SELECT). И вот как это все написать, чтобы Лоция поняла? ))
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

Сообщение Александр »

можно я на своем примере? :wink:

Код: Выделить всё

test = Set ( f_ExecSQLSelect_2 ('select count(*) from lsdbo.object_reference_view where lsdbo.object_reference_view.id='+string(Parent_ID_int ),'','') )
1. нам нужно получить запрос который понимает SQL - типа

Код: Выделить всё

select count(*) from lsdbo.object_reference_view where lsdbo.object_reference_view.id=78923759687
2. запрос передается из Лоции в SQL в виде строки
3. соответсвенно формируем СТРОКУ преобразуя все числовые данные в строковые и сцепляя их плюсом где надо
и все все кавычки парные.
тильда нужна чтобы передать в запросе кавычку

итого
1. кавычки для части строки запроса (строка) - 2штуки
2. кавычки для кавычек - 2 штуки (строка) на каждую с тильдой
3. а третье? третьего не дано :wink: :wink: :wink:
4. совсем забыл - все числовые данные преобразованные к строкам (строка) - они БЕЗ кавычек :wink:
три строки объединенные через + составят запрос

ps
сегодня просто не ваш день :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

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

Сообщение Kikx »

Тема превращается в мой личный "дневник разработчика" :-) Нашел решение к предыдущему вопросу (комбинируя ', ~' и "). Однако теперь еще проблема :cry: Из админки MS SQL все запросы выполняются, как надо, находя и возвращая нужные поля, и из Лоции - фиг. Не думаю, что это связано с учетной записью, т.к. сижу с аккаунта администратора БД.

PS По первому времени у всех столько проблем? :wink:
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

Сообщение Александр »

Код: Выделить всё

f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description=obj_desc AND type_id=tobj' , '' , '' )
правильно будет выглядеть как

Код: Выделить всё

f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description= '+'~''+obj_desc+'~''+' AND type_id='+string(tobj), '' , '' )
obj_desc - строка
tobj - число
ps
код в студию - разберемся как запускать из Лоции :wink:
pps
проблем? это еще не проблемы :wink:
с учетной записью связано только то что админ может выполнять запросы напрямую к данным а пользователь только к видам _view, так что если запрос по видам - то будет работать у всех

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

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

Сообщение Kikx »

Александр писал(а):

Код: Выделить всё

f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description= '+'~''+obj_desc+'~''+' AND type_id='+string(tobj), '' , '' )
obj_desc - строка
tobj - число
>_< Боже, еще новый вариант... ))) Он, кстати, тоже ошибку выдает.
Давайте слегка упростим пример, убрав второе условие отбора. Вот код, он весьма прост:

Код: Выделить всё

obj_id = Set ( Number ( f_execSQLSelect ('SELECT min(lsdbo.project_reference_view.id) FROM lsdbo.project_reference_view WHERE lsdbo.project_reference_view.description=<сюда надо вставить переменную obj_desc>' , '' , '') ) )
obj_id - числовая переменная
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

Сообщение Александр »

да ошибочка пропустил lsdbo
типа того

Код: Выделить всё

obj_desc = Set ( 'Участники' )
tobj = Set ( 100004049000000 )
obj_id = Set ( f_execSQLSelect ( 'SELECT min(id) FROM lsdbo.object_reference_view WHERE description= '+'~''+obj_desc+'~''+' AND type_id='+string(tobj), '' , '' ) )
все работает отлично (здесь obj_id строковая переменная)

кстати вида lsdbo.project_reference_view как и самой таблицы у меня в базе например нет - может здесь собака порылась? :wink:
на самом деле все очевидно - нужно просто сделать перерыв - иначе здесь нельзя :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Kikx
Участник
Сообщения: 32
Зарегистрирован: 06 фев 2008, 15:23
Откуда: Москва
Контактная информация:

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

Сообщение Kikx »

Ты прав, нужно идти отдыхать :-)
Промежуточный результат такой: все работает, если я сразу пишу предопределенное значение description`а (типа description='123456'). C переменной пока не получается. В твоем примере меня смутило то, что кавычки есть в первом действии ('участники'), а потом добавляется еще 2 пары в запросе. Итого в SQL приходит строка типа ''участники''. А еще, по-моему, нужна кавычка в type_id, чтобы было type_id='+string()+'.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

Сообщение Александр »

:wink: :wink:
понимаешь в чем дело - пример, 'вышеуказанный', - Рабочий :wink:
соответственно рассуждения типа
В твоем примере меня смутило то, что кавычки есть в первом действии ('участники'), а потом добавляется еще 2 пары в запросе. Итого в SQL приходит строка типа ''участники''. А еще, по-моему, нужна кавычка в type_id, чтобы было type_id='+string()+'.
мягко говоря - необоснованны :wink:
в MSSQL уходит строка вида

Код: Выделить всё

SELECT min(id) FROM lsdbo.object_reference_view WHERE description= 'Участники' AND type_id=100004049000000
Как это происходит? - я не могу объяснить - Просто попробуй сам....

без обид :wink:
Удачи!

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Ответить