Страница 4 из 19

Re: Прямой SQL

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

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

select atl_nrec from X$USERS where XU$LOGINNAME='<имя пользователя>#1' AND XU$USEROFFICE = 1
Естественно, такого пользователя нет, нужно искать по имени без постфикса #1. Получается косяк DSQL или это можно вылечить?

Re: Прямой SQL

Добавлено: 11 май 2011, 13:58
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 ');

Re: Прямой SQL

Добавлено: 11 май 2011, 14:04
n0where
Вложенных запросов нет в випе))

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

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

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

LEFT JOIN Exclassval As Exclassval1 ON Npunkts.Nrec = Exclassval1.Crec

Re: Прямой SQL

Добавлено: 11 май 2011, 14:08
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)');
Но за ответ спасибо. Отработало ))

Re: Прямой SQL

Добавлено: 12 май 2011, 02:36
edward_K
насчет вложенных запросов почитайте vipprogr.chm
там есть типа такого - select from , (select sum() from where ) where ...
Правда в vip не пробовал, но в sql пашет. Но к теме это ест. не относится

Re: Прямой SQL

Добавлено: 16 май 2011, 11:51
Yuri
Имею часть из запроса
LEFT JOIN Npunkts ON Ttndoc.Cpunktr = Npunkts.Nrec

Все бы ничего, но в TtnDoc.Cpunktr нет NULL, а только 0, а в Npunkts.Nrec NULL встречается.
На MSSql ничего дополнительно добавлять не надо. Он прекрасно сам понимает, что если NULL то это как бы 0 и таблички объединяет правильно.
Как это объяснить "прямому" SQL?

Re: Прямой SQL

Добавлено: 16 май 2011, 12:39
Vik
Что-то не понял, о чем вы толкуете. Сами пишете левый джойн, естественно, там, где TtnDoc.Cpunktr = 0 не будет найдено соответствия в Npunkts, так как нулевых нреков нет, вот и получите Null справа. Отработает это в DSQL абсолютно так же, как и в MS SQL.
В общем, в чем проблема?) Конкретный пример с выборкой приведите, и постарайтесь на нем проблему пояснить.

Re: Прямой SQL

Добавлено: 16 май 2011, 12:52
Yuri
Да, но вместо NULL мне выдает вот такую картину.
Изображение
Возможно ли в джоине конвертировать NULL в 0 ?

Re: Прямой SQL

Добавлено: 16 май 2011, 12:56
Masygreen
IFNULL + еще одно вложение ??

Re: Прямой SQL

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

Придется забивать на ВИП и полностью делать отчет с окнами и запросами в FastReport :grin:

Re: Прямой SQL

Добавлено: 16 май 2011, 13:14
Masygreen
тогда уже сдайте его в Reporting...

Re: Прямой SQL

Добавлено: 16 май 2011, 13:21
Vik
COALESCE(FIELD,0) ?

Re: Прямой SQL

Добавлено: 17 май 2011, 01:06
Den
Ну да..isnull не заявлен в DSQL, судя по доке,в тока COALESCE

Re: Прямой SQL

Добавлено: 17 май 2011, 10:37
Vik
Coalesce прекрасно работает, без него никуда в случае Left Join.

Re: Прямой SQL

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