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

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 сумму счетов со знаком минус.

Нравится

21 комментарий

Николай, очень странно что под пользователями у вас работает, а не выдает ошибку доступа к объекту 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 я не забыл.. Проверю во вью.. Но вероятно все это из за недоступности данных для пользователя?

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

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

Показать все комментарии