Как проверть наличие объекта в базе?
Re: Как проверть наличие объекта в базе?
той, что перед select'ом соответствует та, что после ~'. Там ведь их две, не так ли?
Это просто строка, которая передается в sql на выполнение
Это просто строка, которая передается в sql на выполнение
- Старик Крупский
- Активный участник
- Сообщения: 803
- Зарегистрирован: 27 июл 2006, 22:17
- Откуда: Москва
Re: Как проверть наличие объекта в базе?
Короче. Если в функции есть строковый аргумент, то он передается в функцию либо через переменную, либо через выражение. Выражение должно вернуть строку - мы же помним, что аргумент строковый. Соответственно, если в выражении используются разные штучки типа констант, функций и переменных, то их надо между собой сцепить так, чтобы результат выглядел как цельная строка.
Если у нас есть строковая переменная с именем Var со значением 'value', то если указать ее в кавычках, получим строку 'Var', а если без кавычек, то как раз получим значение этой переменной.
Тильды используются для того, чтобы внутри одной пары кавычек использовать другую пару. Тильдами вложенная пара кавычек и помечается. Можно наружные кавычки заменить двойными, а внутренние одинарными, тогда тильды не понадобятся.
Если у нас есть строковая переменная с именем Var со значением 'value', то если указать ее в кавычках, получим строку 'Var', а если без кавычек, то как раз получим значение этой переменной.
Тильды используются для того, чтобы внутри одной пары кавычек использовать другую пару. Тильдами вложенная пара кавычек и помечается. Можно наружные кавычки заменить двойными, а внутренние одинарными, тогда тильды не понадобятся.
"Лучше меньше, да лучше" (C)
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
О, теперь понятно
Разложил всю строку, так сказать, по полочкам, и Лоция больше не выдает ошибки в редакторе действий. Функция f_execSQLSelect теперь выглядит следующим образом:
где obj_desc - строковая переменная, и tobj - числовая переменная.
Однако даже если объект с такими параметрами существует, запрос всегда возвращает 0. Теперь вопросы
1. Имя столбцов таблицы object_reference указывается просто "как есть", или как "object_reference.<столбец>"?
2. Зачем было нужно в конце запроса?
3. Чтобы выбрать минимальный id, нужно писать как у меня [min(id)]?

Код: Выделить всё
f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description=obj_desc AND type_id=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 теперь выглядит следующим образом:
где obj_desc - строковая переменная, и tobj - числовая переменная.Код: Выделить всё
f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description=obj_desc AND type_id=tobj' , '' , '' )
Однако даже если объект с такими параметрами существует, запрос всегда возвращает 0.

Код: Выделить всё
f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description=~'' +obj_desc + '~' AND type_id=tobj' , '' , '' )
По правилам языка SQL. Лучше в полном формате.Теперь вопросы
1. Имя столбцов таблицы object_reference указывается просто "как есть", или как "object_reference.<столбец>"?
Это синтаксис функции f_ExecSQLSelect_32. Зачем было нужнов конце запроса?Код: Выделить всё
'cols:decimal(18)',0
Да3. Чтобы выбрать минимальный id, нужно писать как у меня [min(id)]?
"Лучше меньше, да лучше" (C)
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как проверть наличие объекта в базе?
ну блин вы даете 

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Так-с, еще раз, давайте разбираться.
1. Меня тут такая мысль посетила... Мы же говорим о запросах для MS SQL, а не для Oracle или Sybase? 
2. Как должен выглядеть передаваемый аргумент description вообще? description='<значение>' или description=<значение>?
3. Этим мы хотим передать строку '<значение переменной obj_desc>', как строку, взяв ее в кавычки еще раз?
4. Лоции не нравится конструкция из тильд и кавычек, пишет "ошибка".
Из этого следует, что, указав description=obj_desc, в sql-запрос передается значение переменной obj_desc, а не ее имя.Старик Крупский писал(а): Если у нас есть строковая переменная с именем Var со значением 'value', то если указать ее в кавычках, получим строку 'Var', а если без кавычек, то как раз получим значение этой переменной.
Код: Выделить всё
description=~'' +obj_desc + '~'

2. Как должен выглядеть передаваемый аргумент description вообще? description='<значение>' или description=<значение>?
3. Этим мы хотим передать строку '<значение переменной obj_desc>', как строку, взяв ее в кавычки еще раз?
4. Лоции не нравится конструкция из тильд и кавычек, пишет "ошибка".
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как проверть наличие объекта в базе?
можно я еще немного запутаю
http://www.lplm.ru/phpBB2/viewtopic.php?f=18&t=313
Лоции нравится очень много - просто проверь синтаксис
нужно получить СТРОКУ в синтаксисе SQL и все
то что получается на самом деле покажет отладчик/трассировщик SQL
для mssql2005 это Profiler

http://www.lplm.ru/phpBB2/viewtopic.php?f=18&t=313
Лоции нравится очень много - просто проверь синтаксис
нужно получить СТРОКУ в синтаксисе SQL и все
то что получается на самом деле покажет отладчик/трассировщик SQL
для mssql2005 это Profiler
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Потыкал MS SQL Server, понял, зачем столько кавычек
Сам сервер хочет запрос в формате description = '<string>', и чтобы передать эти кавычки, нужны еще одни, для самой Лоции.
Однако тут возникла трудность
Кавычек этих в ряд получается не 2, а 3 (одни для запроса, вторые для того, чтобы Лоция передавала первые в виде строки, третьи - закрывающие для кавычки перед SELECT). И вот как это все написать, чтобы Лоция поняла? ))

Однако тут возникла трудность

- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как проверть наличие объекта в базе?
можно я на своем примере?
1. нам нужно получить запрос который понимает SQL - типа
2. запрос передается из Лоции в SQL в виде строки
3. соответсвенно формируем СТРОКУ преобразуя все числовые данные в строковые и сцепляя их плюсом где надо
и все все кавычки парные.
тильда нужна чтобы передать в запросе кавычку
итого
1. кавычки для части строки запроса (строка) - 2штуки
2. кавычки для кавычек - 2 штуки (строка) на каждую с тильдой
3. а третье? третьего не дано

4. совсем забыл - все числовые данные преобразованные к строкам (строка) - они БЕЗ кавычек
три строки объединенные через + составят запрос
ps
сегодня просто не ваш день

Код: Выделить всё
test = Set ( f_ExecSQLSelect_2 ('select count(*) from lsdbo.object_reference_view where lsdbo.object_reference_view.id='+string(Parent_ID_int ),'','') )
Код: Выделить всё
select count(*) from lsdbo.object_reference_view where lsdbo.object_reference_view.id=78923759687
3. соответсвенно формируем СТРОКУ преобразуя все числовые данные в строковые и сцепляя их плюсом где надо
и все все кавычки парные.
тильда нужна чтобы передать в запросе кавычку
итого
1. кавычки для части строки запроса (строка) - 2штуки
2. кавычки для кавычек - 2 штуки (строка) на каждую с тильдой
3. а третье? третьего не дано



4. совсем забыл - все числовые данные преобразованные к строкам (строка) - они БЕЗ кавычек

три строки объединенные через + составят запрос
ps
сегодня просто не ваш день

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Тема превращается в мой личный "дневник разработчика"
Нашел решение к предыдущему вопросу (комбинируя ', ~' и "). Однако теперь еще проблема
Из админки MS SQL все запросы выполняются, как надо, находя и возвращая нужные поля, и из Лоции - фиг. Не думаю, что это связано с учетной записью, т.к. сижу с аккаунта администратора БД.
PS По первому времени у всех столько проблем?


PS По первому времени у всех столько проблем?

- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 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), '' , '' )
tobj - число
ps
код в студию - разберемся как запускать из Лоции

pps
проблем? это еще не проблемы

с учетной записью связано только то что админ может выполнять запросы напрямую к данным а пользователь только к видам _view, так что если запрос по видам - то будет работать у всех
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
>_< Боже, еще новый вариант... ))) Он, кстати, тоже ошибку выдает.Александр писал(а):obj_desc - строкаКод: Выделить всё
f_execsqlselect ( 'SELECT min(id) FROM object_reference_view WHERE description= '+'~''+obj_desc+'~''+' AND type_id='+string(tobj), '' , '' )
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>' , '' , '') ) )
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как проверть наличие объекта в базе?
да ошибочка пропустил lsdbo
типа того
все работает отлично (здесь obj_id строковая переменная)
кстати вида lsdbo.project_reference_view как и самой таблицы у меня в базе например нет - может здесь собака порылась?
на самом деле все очевидно - нужно просто сделать перерыв - иначе здесь нельзя
типа того
Код: Выделить всё
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), '' , '' ) )
кстати вида lsdbo.project_reference_view как и самой таблицы у меня в базе например нет - может здесь собака порылась?

на самом деле все очевидно - нужно просто сделать перерыв - иначе здесь нельзя

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Участник
- Сообщения: 32
- Зарегистрирован: 06 фев 2008, 15:23
- Откуда: Москва
- Контактная информация:
Re: Как проверть наличие объекта в базе?
Ты прав, нужно идти отдыхать 
Промежуточный результат такой: все работает, если я сразу пишу предопределенное значение description`а (типа description='123456'). C переменной пока не получается. В твоем примере меня смутило то, что кавычки есть в первом действии ('участники'), а потом добавляется еще 2 пары в запросе. Итого в SQL приходит строка типа ''участники''. А еще, по-моему, нужна кавычка в type_id, чтобы было type_id='+string()+'.

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


понимаешь в чем дело - пример, 'вышеуказанный', - Рабочий

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

в MSSQL уходит строка вида
Код: Выделить всё
SELECT min(id) FROM lsdbo.object_reference_view WHERE description= 'Участники' AND type_id=100004049000000
без обид

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