0
Голосовать

Проблема с запросом

Создано:

Здравствуйте, есть запрос для подсчета дебиторской задолжности, но возникла необходимость сделать фильтрацию по дате. Вот изначальный запрос

SELECT
        [c].[ContractNumber] AS [ContractNumber],
        [tbl_Account].[Name] AS [OfficialAccountName],
        (SELECT
                SUM([AllInvoiceAmount2].[Amount]) AS [AllInvoiceAmount2]
        FROM
                [dbo].[tbl_Invoice] AS [AllInvoiceAmount2]
        WHERE([c].[ID] = [AllInvoiceAmount2].[ContractID])) AS [AllInvoiceAmount],
        (SELECT
                SUM([AllCashflowAmount].[Amount]) AS [AllCashflowAmount2]
        FROM
                [dbo].[tbl_Cashflow] AS [AllCashflowAmount]
        WHERE([c].[ID] = [AllCashflowAmount].[ContractID])) AS [AllCashflowAmount],
        (ISNULL((SELECT SUM(IsNULL(Amount,0)) FROM vw_Cashflow cs  WHERE c.ID = cs.ContractID  GROUP BY cs.ContractID),0)
-ISNULL((SELECT SUM(IsNull(Amount,0)) FROM vw_Invoice   i WHERE c.ID = i.ContractID GROUP BY i.ContractID),0)) AS [Ostatok],
        (SELECT SUM(Amount) FROM vw_Invoice i2
WHERE
InvoiceDate = (SELECT top 1 Max(InvoiceDate) FROM vw_Invoice) AND i2.ContractID = c.ID) AS [LastInvoice],
        [tbl_Kladrs].[Name] AS [SubjectName],
        [tbl_Account].[Communication1] AS [Communication1],
        [tbl_Account].[Communication2] AS [Communication2],
        [SubAgent].[Name] AS [SubAgentName],
        [c].[CentrIncomeID] AS [CentrIncomeID],
        [tbl_CentrIncome].[Name] AS [CentrIncomeName]
FROM
        [dbo].[tbl_Contract] AS [c]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [c].[CustomerID]
LEFT OUTER JOIN
        [dbo].[tbl_Kladrs] AS [tbl_Kladrs] ON [tbl_Kladrs].[ID] = [tbl_Account].[SubjectsID]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [SubAgent] ON [SubAgent].[ID] = [c].[SubAgentID]
LEFT OUTER JOIN
        [dbo].[tbl_Kladrs] AS [tbl_CentrIncome] ON [tbl_CentrIncome].[ID] = [c].[CentrIncomeID]
WHERE(ContractTypeID = 'ED7FD7B2-46A7-4583-8FB4-37356272EB8A')

он работает на всех логинах. А при фильтрации
SELECT
        [c].[ContractNumber] AS [ContractNumber],
        [tbl_Account].[Name] AS [OfficialAccountName],
        (SELECT
                SUM([AllInvoiceAmount2].[Amount]) AS [AllInvoiceAmount2]
        FROM
                [dbo].[tbl_Invoice] AS [AllInvoiceAmount2]
        WHERE([c].[ID] = [AllInvoiceAmount2].[ContractID] AND
                [AllInvoiceAmount2].[InvoiceDate] <= :DateInvoice)) AS [AllInvoiceAmount],
        (SELECT
                SUM([AllCashflowAmount].[Amount]) AS [AllCashflowAmount2]
        FROM
                [dbo].[tbl_Cashflow] AS [AllCashflowAmount]
        WHERE([c].[ID] = [AllCashflowAmount].[ContractID] AND
                [AllCashflowAmount].[ActualDate] <= :DateInvoice)) AS [AllCashflowAmount],
        (ISNULL((SELECT SUM(IsNULL(Amount,0)) FROM vw_Cashflow cs  WHERE c.ID = cs.ContractID AND ActualDate <= :DateInvioce GROUP BY cs.ContractID),0)
-ISNULL((SELECT SUM(IsNull(Amount,0)) FROM vw_Invoice   i WHERE InvoiceDate <= :DateInvoice AND c.ID = i.ContractID GROUP BY i.ContractID),0)) AS [Ostatok],
        (SELECT SUM(Amount) FROM vw_Invoice i2
WHERE
InvoiceDate = (SELECT top 1 Max(InvoiceDate) FROM vw_Invoice) AND i2.ContractID = c.ID) AS [LastInvoice],
        [tbl_Kladrs].[Name] AS [SubjectName],
        [tbl_Account].[Communication1] AS [Communication1],
        [tbl_Account].[Communication2] AS [Communication2],
        [SubAgent].[Name] AS [SubAgentName]
FROM
        [dbo].[tbl_Contract] AS [c]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [c].[CustomerID]
LEFT OUTER JOIN
        [dbo].[tbl_Kladrs] AS [tbl_Kladrs] ON [tbl_Kladrs].[ID] = [tbl_Account].[SubjectsID]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [SubAgent] ON [SubAgent].[ID] = [c].[SubAgentID]
WHERE(ContractTypeID = 'ED7FD7B2-46A7-4583-8FB4-37356272EB8A')

работает только при входе от имени администратора. Не работает именно подсчет разницы
(ISNULL((SELECT SUM(IsNULL(Amount,0)) FROM vw_Cashflow cs  WHERE c.ID = cs.ContractID AND ActualDate <= :DateInvioce GROUP BY cs.ContractID),0)
-ISNULL((SELECT SUM(IsNull(Amount,0)) FROM vw_Invoice   i WHERE InvoiceDate <= :DateInvoice AND c.ID = i.ContractID GROUP BY i.ContractID),0)) AS [Ostatok]

не могу понять в чем тут может быть проблема.. Он вставляет в колонку Ostatok сумму счетов со знаком минус.

Комментарии

Осауленко Александр

Николай, очень странно что под пользователями у вас работает, а не выдает ошибку доступа к объекту tbl_Invoice - у вас роздан непосредственно группе public доступ на чтение из таблицы?
А выдает отрицательный остаток под пользователями, потому как они не могут прочитать часть записей, которые "видит" администратор. Хотя конечно странно, что под администратором, считает все корректно. Вы администраторам раздаете дополнительно доступ на чтение всех записей?
Общее замечание к запросу:

(ISNULL((SELECT SUM(IsNULL(Amount,0)) FROM vw_Cashflow cs  WHERE c.ID = cs.ContractID AND ActualDate <= :DateInvioce GROUP BY cs.ContractID),0)
-ISNULL((SELECT SUM(IsNull(Amount,0)) FROM vw_Invoice   i WHERE InvoiceDate <= :DateInvoice AND c.ID = i.ContractID GROUP BY i.ContractID),0)) AS [Ostatok

GROUP BY лишний.

Мещеринов Николай Владимирович

Может я не правильно понял, но как понял. В базе данных, в разрешении таблицы стоит один из пользователей, но по нему тоже не работает.. Разрешение на выборку у пользователя есть. И у этого пользователя есть доступ ко всем записям таблицы tbl_Invoice. Да, много странного) Странно, что при фильтрации по дате не хочет считаться, а если фильтрацию отключить, то все отлично..

Осауленко Александр

Николай, доступ на таблицу вы раздавали специально для этого пользователя? У вас по запросу в одном месте идет обращение к таблицам, в других - к вью. Почему?

Мещеринов Николай Владимирович

Точно сказать не могу, т.к. запрос писал не я, но сейчас попробовал поменять вьшки на таблицы, в таком случае даже под администратором не считается разница.

Осауленко Александр
Мещеринов Николай Владимирович пишет:
попробовал поменять вьшки на таблицы, в таком случае даже под администратором не считается разница.

В этом и заключается ответ на ваш вопрос.

Мещеринов Николай Владимирович

Т.е. что то с правами доступа?

Осауленко Александр

Да, я думаю это основная причина того, что данные считаются не так как вы хотите под пользователем, если конечно вы уверены что сам запрос написан корректно.

Мещеринов Николай Владимирович

Запрос выполняется корректно, если отключить все фильтры.. Кстати, сейчас заметил, что под администратором считается не корректно.. Но если отключить фильтры по дате, сделать выборку из вьюшек, то под остальными логинами все отлично считается.)

Мещеринов Николай Владимирович

А как можно так раздать права на какой нибудь логин?) Что то я даю права на таблицу определенному пользователю базы данных, но ничего не меняется..

Осауленко Александр

Николай, вам необходимо настраивать весь доступ через раздел Администрирование, и очень-очень редких случаях непосредственно на сервере в БД.

Мещеринов Николай Владимирович

Александр, права на доступ к этим таблицам настроен в разделе Администрирование. Логины на которых проверяется имеют доступ ко всем записям этих таблиц..

Осауленко Александр

Как вы проверили, что логины имеют доступ ко всем записям?

Мещеринов Николай Владимирович

Выборкой из Right таблицы, по количеству)

Осауленко Александр

Николай, это хорошо :) Но там еще есть поле AdminUnitID - вы его учитывали?

Мещеринов Николай Владимирович

Ну это же колонка в которой содержится ID пользователя на которого права раздаются! Я по нему выборку и делал)

Осауленко Александр

Приведите примеры запросов, которыми вы проверяли.

Мещеринов Николай Владимирович

select COUNT(*) from tbl_InvoiceRight where AdminUnit = IDAdminUnit - проверил на сколько записей есть доступ у пользователя. Потом проверил количество счетов)

Осауленко Александр

Николай, я бы так не проверял, а проверял кол-во записей в таблице и вью. И у вас не только Invoice у вас еще и Cashflow есть.

Мещеринов Николай Владимирович

Про Cashflow я не забыл.. Проверю во вью.. Но вероятно все это из за недоступности данных для пользователя?

Осауленко Александр

Необходимо проверять еще тот запрос, который уходит с клиента. В этом вам поможет профайлер.

Мещеринов Николай Владимирович

Я уже проверял профайлером, с обоих логинов запрос уходит одинаковый.