Всем добрый день. Натолкнулся на такую проблему: при вставке записей в БД через DSQL неверно определяется пользователь (вернее он вообще не определяется). Профайлер показал, что поиск пользователя производится примерно так:
При выполнении запроса ошибка выпадает на любой из этих строк.
Почти уверен, что в ВИПе неверно истолковывается подстановка в скобках. Как победить это зло? ((
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 ');
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)');
насчет вложенных запросов почитайте vipprogr.chm
там есть типа такого - select from , (select sum() from where ) where ...
Правда в vip не пробовал, но в sql пашет. Но к теме это ест. не относится
Имею часть из запроса LEFT JOIN Npunkts ON Ttndoc.Cpunktr = Npunkts.Nrec
Все бы ничего, но в TtnDoc.Cpunktr нет NULL, а только 0, а в Npunkts.Nrec NULL встречается.
На MSSql ничего дополнительно добавлять не надо. Он прекрасно сам понимает, что если NULL то это как бы 0 и таблички объединяет правильно.
Как это объяснить "прямому" SQL?
Что-то не понял, о чем вы толкуете. Сами пишете левый джойн, естественно, там, где TtnDoc.Cpunktr = 0 не будет найдено соответствия в Npunkts, так как нулевых нреков нет, вот и получите Null справа. Отработает это в DSQL абсолютно так же, как и в MS SQL.
В общем, в чем проблема?) Конкретный пример с выборкой приведите, и постарайтесь на нем проблему пояснить.
Если применить IFNULL(field,0), ISNULL(field,0) то по всем записям подставляется 0.
Такое впечатление, что этот "прямой" SQL толком не обрабатывает эти функции. ((
Придется забивать на ВИП и полностью делать отчет с окнами и запросами в FastReport
Кто-нибудь работал с объектной реализацией DSQL ? Если да, то поделитесь, пожалуйста, ощущениями и мыслями на этот счет. Давно ждал, когда сделают что-то в этом направлении, и неожиданно для себя открыл, что уже сделали. Интересуют подводные камни и сюрпризы, которые ожидают при использовании объектного интерфейса к DSQL.