Прямой SQL

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: Прямой SQL

Сообщение Vik »

Всем добрый день. Натолкнулся на такую проблему: при вставке записей в БД через DSQL неверно определяется пользователь (вернее он вообще не определяется). Профайлер показал, что поиск пользователя производится примерно так:

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

select atl_nrec from X$USERS where XU$LOGINNAME='<имя пользователя>#1' AND XU$USEROFFICE = 1
Естественно, такого пользователя нет, нужно искать по имени без постфикса #1. Получается косяк DSQL или это можно вылечить?
Yuri
Посетитель
Сообщения: 43
Зарегистрирован: 18 ноя 2009, 02:56
Откуда: Гомель, Республика Беларусь

Re: Прямой SQL

Сообщение Yuri »

При выполнении запроса ошибка выпадает на любой из этих строк.
Почти уверен, что в ВИПе неверно истолковывается подстановка в скобках. Как победить это зло? ((

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

sqlAddStr(str_handle,'LEFT JOIN (SELECT * FROM Exclassval) As Exclassval1 ON Npunkts.Nrec = Exclassval1.Crec ');
sqlAddStr(str_handle,'LEFT JOIN (SELECT * FROM ExclassSeg) As ExclassSeg1 ON ExclassVal1.CclassSeg = ExclassSeg1.Nrec ');
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Прямой SQL

Сообщение n0where »

Вложенных запросов нет в випе))

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

LEFT JOIN (SELECT * FROM Exclassval) As Exclassval1 ON Npunkts.Nrec = Exclassval1.Crec
наверно так

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

LEFT JOIN Exclassval As Exclassval1 ON Npunkts.Nrec = Exclassval1.Crec
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Yuri
Посетитель
Сообщения: 43
Зарегистрирован: 18 ноя 2009, 02:56
Откуда: Гомель, Республика Беларусь

Re: Прямой SQL

Сообщение Yuri »

n0where писал(а):Вложенных запросов нет в випе))
Уверяю вас, что вот такой запрос отрабатывет на ура. А тут аж 2 вложения ))

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

sqlAddStr(str_handle,'SELECT Name, Summa FROM ( ');

         sqlAddStr(str_handle,'SELECT Min(Nrec) As Nrec, Result.Name, SUM(Result.Summa) As Summa FROM ( ');

         sqlAddStr(str_handle,'SELECT MIN(Katorg.Nrec) As Nrec, Katorg.Name, SUM(Basefin.Summa)*(-1) AS Summa  FROM Basefin ');
         sqlAddStr(str_handle,'INNER JOIN Katorg ON Basefin.Corg = Katorg.Nrec ');
         sqlAddStr(str_handle,'WHERE Katorg.Cstate = ? AND Katorg.Corpoin <>1 AND Direct = 1 AND Ddoc >=? AND Ddoc <= ? ');
         sqlAddStr(str_handle,'GROUP BY Katorg.Name ');

         sqlAddStr(str_handle,'UNION ');

         sqlAddStr(str_handle,'SELECT MIN(Katorg.Nrec) As Nrec, Katorg.Name, SUM(Katsopr.Summa) AS Summa FROM Katsopr ');
         sqlAddStr(str_handle,'INNER JOIN Katorg ON Katsopr.Corg = Katorg.Nrec ');
         sqlAddStr(str_handle,'WHERE Katorg.Cstate = ? AND Katorg.Corpoin <>1 AND Tipsopr = 2  AND Dsopr >=? AND Dsopr <= ? ');
         sqlAddStr(str_handle,'GROUP BY Katorg.Name ');

         sqlAddStr(str_handle,'UNION ');

         sqlAddStr(str_handle,'SELECT MIN(Katorg.Nrec) As Nrec, Katorg.Name, SUM(Katsopr.Summa)*(-1) AS Summa FROM Katsopr ');
         sqlAddStr(str_handle,'INNER JOIN Katorg ON Katsopr.Corg = Katorg.Nrec ');
         sqlAddStr(str_handle,'WHERE Katorg.Cstate = ? AND Katorg.Corpoin <>1 AND Tipsopr = 1 AND Katsopr.Vidsopr = 106 AND Katsopr.Vidsopr = 206 AND Dsopr >=? AND Dsopr <= ? ');
         sqlAddStr(str_handle,'GROUP BY Katorg.Name ');


         sqlAddStr(str_handle,') As Result GROUP BY Name ) As Itog ');
         sqlAddStr(str_handle,'WHERE Summa >= 100000 AND itog.Nrec NOT IN ( ');
         sqlAddStr(str_handle,'SELECT Crec FROM Attrval WHERE Attrval.Cattrnam = ? AND Attrval.Wtable = 1418 AND Attrval.Vdouble = 1)');
Но за ответ спасибо. Отработало ))
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прямой SQL

Сообщение edward_K »

насчет вложенных запросов почитайте vipprogr.chm
там есть типа такого - select from , (select sum() from where ) where ...
Правда в vip не пробовал, но в sql пашет. Но к теме это ест. не относится
Yuri
Посетитель
Сообщения: 43
Зарегистрирован: 18 ноя 2009, 02:56
Откуда: Гомель, Республика Беларусь

Re: Прямой SQL

Сообщение Yuri »

Имею часть из запроса
LEFT JOIN Npunkts ON Ttndoc.Cpunktr = Npunkts.Nrec

Все бы ничего, но в TtnDoc.Cpunktr нет NULL, а только 0, а в Npunkts.Nrec NULL встречается.
На MSSql ничего дополнительно добавлять не надо. Он прекрасно сам понимает, что если NULL то это как бы 0 и таблички объединяет правильно.
Как это объяснить "прямому" SQL?
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: Прямой SQL

Сообщение Vik »

Что-то не понял, о чем вы толкуете. Сами пишете левый джойн, естественно, там, где TtnDoc.Cpunktr = 0 не будет найдено соответствия в Npunkts, так как нулевых нреков нет, вот и получите Null справа. Отработает это в DSQL абсолютно так же, как и в MS SQL.
В общем, в чем проблема?) Конкретный пример с выборкой приведите, и постарайтесь на нем проблему пояснить.
Yuri
Посетитель
Сообщения: 43
Зарегистрирован: 18 ноя 2009, 02:56
Откуда: Гомель, Республика Беларусь

Re: Прямой SQL

Сообщение Yuri »

Да, но вместо NULL мне выдает вот такую картину.
Изображение
Возможно ли в джоине конвертировать NULL в 0 ?
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Прямой SQL

Сообщение Masygreen »

IFNULL + еще одно вложение ??
Время ведет!
Yuri
Посетитель
Сообщения: 43
Зарегистрирован: 18 ноя 2009, 02:56
Откуда: Гомель, Республика Беларусь

Re: Прямой SQL

Сообщение Yuri »

Masygreen писал(а):IFNULL + еще одно вложение ??
Если применить IFNULL(field,0), ISNULL(field,0) то по всем записям подставляется 0.
Такое впечатление, что этот "прямой" SQL толком не обрабатывает эти функции. ((

Придется забивать на ВИП и полностью делать отчет с окнами и запросами в FastReport :grin:
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Прямой SQL

Сообщение Masygreen »

тогда уже сдайте его в Reporting...
Время ведет!
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: Прямой SQL

Сообщение Vik »

COALESCE(FIELD,0) ?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Прямой SQL

Сообщение Den »

Ну да..isnull не заявлен в DSQL, судя по доке,в тока COALESCE
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: Прямой SQL

Сообщение Vik »

Coalesce прекрасно работает, без него никуда в случае Left Join.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Re: Прямой SQL

Сообщение Vik »

Кто-нибудь работал с объектной реализацией DSQL ? Если да, то поделитесь, пожалуйста, ощущениями и мыслями на этот счет. Давно ждал, когда сделают что-то в этом направлении, и неожиданно для себя открыл, что уже сделали. Интересуют подводные камни и сюрпризы, которые ожидают при использовании объектного интерфейса к DSQL.
Ответить