Добрый день.
Стоит задача разработать отчет-ведомость, в которой строки это ученики, а столбцы предметы. На пересечении соответственно оценки. Перечни учеников и предметов переменные, т.е. для одной ведомости могут быть одни предметы, для другой совсем другие и их может быть больше или меньше.
Имеем таблицу с полями:
AccountID, SchoolYearID,ClassID, ContactID, CourseID, Mark (оценка).
С Cross-Tab такой отчет сформировать достаточно легко, но он формируется для всех данных одной таблицей. Но данные необходимо группировать по контрагентам, годам обучения и прочим параметрам. С Cross-Tab такой номер не проходит.
Видел информацию, что такой отчет можно сделать с использованием вертикальных бэндов, но к сожалению примеров реализации не нашел.
Прошу подсказать как правильно решить такую задачу.

Нравится

7 комментариев

Виктор Викторович, поставленную задачу можно реализовать с использованием вертикальных бэндов. Ознакомиться с принципом и примерами построения отчета с вертикальными бэндами можно по ссылке http://www.delphiplus.org/articles/components/fastreport_vertical_band/index.html

Спасибо, Наталия. Я видел эту ссылку. К сожалению в Terrasoft мне пока не удалось повторить даже эти примеры. Описание для Delphi, а у нас похоже своя специфика FastReport. Поэтому и спрашивал о примере именно применительно к Terrasoft.

К сожалению, готовых примеров нет. Я создам для Вас небольшой пример отчета с использованием вертикальных бэндов и по результату напишу.

Огромное спасибо. Вчера кое что уже получилось, но пока не то. Особенно непонятна тема правильной организации данных. Если можно сделать с одним датасетом, то замечательно.
Если же делать два связанных датасета, то здесь была бы полезной информация об их правильной структуре и связях.
Я видел тему о связи датасетов: http://www.community.terrasoft.ru/forum/topic/5579 и у меня все получилось, но только с горизонтальными бэндами. В этом случае используются MasterData и DatailData, но мне надо связать получается горизонтальный и вертикальный MasterData, как в примере с delphiplus.org.
Как это правильно сделать?

Здравствуйте Виктор,
В качестве примера рассмотрим такой отчет:
1
Выведем в название продажуи, доход продажи и задачи связанные с ней.
Переменными колонками у нас будут задачи, так как с одной продажей могут быть связаны несколько задач.
Пусть у нас есть 2 датасета:
ds_Opport
2
и ds_TaskMain
3
Для того, что бы FastReport смог построить связь по вертикальному MasterData, необходима колонка подчененной записи (в данном случае в sq_MainTask колонка [tbl_Task].[OpportunityID], а в sq_Opport колонка [tbl_Opportunity].[ID] с алиасом (AS) [OpportunityID]) и соответствующий включенный compare фильтр OpportunityID в sq_MainTask с параметром OpportunityID
5
6
В самом дизайнере отчета для построения переменных колонок, следует добавить
вертикальный Header
7
и вертикальный MasterData
8
В дизайнере FastReport, также важно добавить DetailData,
4
который будет прикреплен к ds_TaskMain, в противном случае, мы будем получать постоянно одно значение задачи, с первой продажи

Все сервисы отчета в прикрепленных файлах

Добрый день Алексей.
Спасибо. Сейчас буду пробовать.

Спасибо огромное. Все получилось. :)

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

Подскажите, пожалуйста, нужную "галочку" для преобразования отчета, созданного с помощью cross-tab object в желаемый вид - убрать объединение ячеек.

Суть вопроса в прикрепленных картинках.
Основа отчета - таблица Продажи. Client, Owner и пр. - реквизиты продажи.
Клиент желает, чтобы не было объединения ячеек, каждая строка заполнялась полностью. Реально ли это получить в существующем cross-tab?

Нравится

6 комментариев

Здравствуйте Александр,
Предлагаю вам воспользоваться свойством JoinEquilCells
1
и обратить внимание на тему (внешний ресурс, Форум fast-report):
http://www.fast-report.com/ru/forum/index.php?showtopic=4816&mode=linear

JoinEqualCells уже установлено false. Все равно объединяет "по-вертикали"
JoinEqualCells = true повлияло на появление еще и "горизонтального" слияния ячеек:smile:

Здравствуйте, Александр!

Обратите внимание на свойство таблицы ManualBuildAutoSpans - чтобы убрать автоматическое объединение ячеек с одинаковыми значениями, оно должно быть выставлено в false.

Кроме того, возможно объединение ячеек скриптом. В случае, если это сторонний отчет, рекомендую также проверить скрипт на наличие одного из свойств объединения ячеек (ManualBuildAutoSpans либо JoinEquilCells).

"Alimova Anna" написал:Обратите внимание на свойство таблицы ManualBuildAutoSpans - чтобы убрать автоматическое объединение ячеек с одинаковыми значениями, оно должно быть выставлено в false

Спасибо, только найти такое свойство не сумел:confused:

Преедлагаю обходное решение, сделать аналогиную табцицу через Memo

Таблицу простую без CrossTab я бы сделал, да вот незадача - мне надо разворачивать данные и по вертикали - продажи в произвольном количестве, и по горизонтали - суммы по месяцу/году, по заданному произвольному диапазону дат.
На сегодня бросил возится с FastReport, сделал напрямую построение нужной структуры на лист Excel. Получилось очень красиво и аккуратно:smile:
Тему можно считать неактуальной

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

Здравствуйте!

Вчера заметил очень странное поведение компоненты cross-tab в Fast Report. Есть отчет (немного измененный стандартный отчет – суммы выполненных операций по кассах в разрезе дней). Под Supervisor все работает идеально, а вот под обычным пользователем – какие-то чудеса!
Вы, наверное как и я, первое на что подумали – права доступа! Но не тут то было! Смотрим на картинки (Все действия под обычным пользователем):

Рис.1 выборка из реестра (настроено фильтрами)

Рис.2 отчет

Рис.3 запрос отчета в профайлере

exec sp_executesql N'SELECT TOP 120
    [tbl_Cashflow].[CashAccountID] AS [CashAccountID],
    [tbl_Cashflow].[ActualDate] AS [ActualDate],
    [tbl_Cashflow].[TypeID] AS [TypeID],
    [tbl_Cashflow].[Amount] AS [Amount],
    [tbl_Cashflow].[BasicAmount] AS [BasicAmount],
    [tbl_CashAccount].[Name] AS [CashAccountName],
    [tbl_Cashflow].[ID] AS [GeneralColumn]
FROM
    [dbo].[vw_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
    [dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
    ([tbl_Cashflow].[ActualDate] >= @P2 AND
    [tbl_Cashflow].[ActualDate] = @P3))'
,N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 00:00:00:000'',''2009-07-13
23:59:59:000''

Рис.4 результат выполнения запроса из профайлера (добавил только группировку)

Какие будут идеи?

Нравится

64 комментария

Тот же отчет по Supervisor:

--
www.it-sfera.com.ua
Terrasoft Solution Partner

попробуйте запустить запрос со всеми полями
(может есть наловские или что)

и может у Вас разные поля считаются
[Amount] или [BasicAmount]

[tbl_Cashflow].[ID] AS [GeneralColumn]
добавляется поле под пользователем
если основная таблица администрируется

"Денис М" написал:может у Вас разные поля считаются
[Amount] или [BasicAmount]

Нет

"Денис М" написал:попробуйте запустить запрос со всеми полями

Пробовал... Все гуд!

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Денис М" написал:[tbl_Cashflow].[ID] AS [GeneralColumn]
добавляется поле под пользователем

Она, кажется всегда добавляется. И под админом тоже. Или я ошибаюсь?

Посмотрите запросы

Из админки SQ для отчета:

SELECT
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	[tbl_Cashflow].[Amount] AS [Amount],
	[tbl_Cashflow].[BasicAmount] AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[tbl_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE([tbl_Cashflow].[StatusID] = :StatusID)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Уточняю: TS CRM 3.3.0.56 MS SQL 2005

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Ну так в админке это поле первым идет. Только алиас другой.

Это я его только-что добавиль... Думал что-то изменит... Не-а!
Все то же!
--
www.it-sfera.com.ua
Terrasoft Solution Partner

Из профайлера:
АДМИН

exec sp_executesql N'SELECT TOP 40
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	[tbl_Cashflow].[Amount] AS [Amount],
	[tbl_Cashflow].[BasicAmount] AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[tbl_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''
 
exec sp_executesql N'SELECT TOP 80
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	[tbl_Cashflow].[Amount] AS [Amount],
	[tbl_Cashflow].[BasicAmount] AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[tbl_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''
 
exec sp_executesql N'SELECT TOP 120
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	[tbl_Cashflow].[Amount] AS [Amount],
	[tbl_Cashflow].[BasicAmount] AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[tbl_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''

ПОЛЬЗОВАТЕЛЬ (автор всех операций):

exec sp_executesql N'SELECT TOP 40
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	[tbl_Cashflow].[Amount] AS [Amount],
	[tbl_Cashflow].[BasicAmount] AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[vw_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''
 
exec sp_executesql N'SELECT TOP 80
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	[tbl_Cashflow].[Amount] AS [Amount],
	[tbl_Cashflow].[BasicAmount] AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[vw_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''
 
exec sp_executesql N'SELECT TOP 120
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	[tbl_Cashflow].[Amount] AS [Amount],
	[tbl_Cashflow].[BasicAmount] AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[vw_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Зпросы одинаковые(если заменить vw_ на tbl_). Т.е. если они возвращают разные результаты, то разные данные у нас во вьюхе и таблице. Что впринципе и логично - администратор видит больше записей. Значит и сумма должна быть больше. Нужно сравнивать запросы в отчете и в гриде под пользователем. Или у пользователя есть права на все записи?

Виталий, добрый день.

Underscore a.k.a. прав: дело в доступе на записи. Вот запрос для представления vw_Cashflow:

SELECT P.*
FROM dbo.tbl_Cashflow WITH (nolock) P
WHERE EXISTS
(SELECT *
FROM [dbo].[tbl_CashflowRight] AS [R] WITH (nolock)
WHERE (([R].[RecordID] = [P].[ID]) AND EXISTS
(SELECT *
FROM [dbo].[tbl_UserAdminUnit] AS [U] WITH (nolock)
WHERE ([R].[AdminUnitID] = [U].[AdminUnitID]) AND ([U].[UserName] = SYSTEM_USER))))

Отсюда видим, что в представление попадают только те записи, у которых на детали "Доступ" есть текущий пользователь либо группа, в которую он входит. Группа "Все пользователи" в данном случае не учитывается, поскольку любой из пользователей входит в неё по умолчанию, и запись в таблицу прав при этом не добавляется.

Попробуйте раздать доступ на записи для текущего пользователя или группы, в которую он входит (кроме "Все пользователи"). Достаточно доступа на чтение. В итоге отчёт должен сформироваться корректно.

Как вы объясните одинаковые:

  1. Правилные итоги в гриде?
  2. Правилные результат в SMS запроса из профайлера?

Как я и уточнял - пользователь САМ создал все операции.
PS: Я прокликал каждую запись - с правами все ок!

--
www.it-sfera.com.ua
Terrasoft Solution Partner

На 4 рисунке первого поста, я вошёл в SQL Server Manager Studio под учётной записью пользователя и выполнил запрос! Как видно из рисунка, результат ПРАВИЛЬНЫЙ! Значит у пользователя есть права на записи...

Какие будут еще идеи?

--
www.it-sfera.com.ua
Terrasoft Solution Partner

переписать запрос так чтобы он уже возвращал сгрупированные данные

Тогда нужно отчет переделывать :)

Так в чем бяка?

PS: попробую добавить группировку...

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Просто добавил группирование:

SELECT
	[tbl_Cashflow].[ID] AS [ID],
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	SUM([tbl_Cashflow].[Amount]) AS [Amount],
	SUM([tbl_Cashflow].[BasicAmount]) AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[tbl_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE([tbl_Cashflow].[StatusID] = :StatusID)
GROUP BY
	[tbl_Cashflow].[ID],
	[tbl_Cashflow].[CashAccountID],
	[tbl_Cashflow].[ActualDate],
	[tbl_Cashflow].[TypeID],
	[tbl_CashAccount].[Name]

Отчет под пользователем - смотри рис.2 :)

Какие будут еще идеи?

--
www.it-sfera.com.ua
Terrasoft Solution Partner

а смысл такой групировки если есть
[tbl_Cashflow].[ID] AS [ID]

Ну разве что SUM([tbl_Cashflow].[Amount]) может вернуть 0, если в одном из Ammount null. Или в MSSQL нет такой фичи?

Знаете, что самое интересное?!

Расход за выбраный день под админом: 967,56
под пользователем: 16,72

Сейчас под пользователем в реестре за указаный день вижу 2 операции с типом расход: -959.2 и -8.36

:) Не могу понять!? Уже з 2 разных компов в сети проверял...

--
www.it-sfera.com.ua
Terrasoft Solution Partner

перепешите запрос
SELECT
[tbl_Cashflow].[CashAccountID],
[tbl_Cashflow].[ActualDate] AS [ActualDate],
[tbl_Cashflow].[TypeID] AS [TypeID],
SUM([tbl_Cashflow].[Amount]) AS [Amount],
SUM([tbl_Cashflow].[BasicAmount]) AS [BasicAmount],
[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
[dbo].[tbl_CashAccount] AS [tbl_CashAccount]
LEFT OUTER JOIN
[dbo].[tbl_Cashflow] AS [tbl_Cashflow]
ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE([tbl_Cashflow].[StatusID] = :StatusID)
GROUP BY
[tbl_Cashflow].[CashAccountID],
[tbl_Cashflow].[ActualDate],
[tbl_Cashflow].[TypeID],
[tbl_CashAccount].[Name]

С [ID] согласен, убрал. Вот новый запрос из профайлера:

exec sp_executesql N'SELECT TOP 40
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	SUM([tbl_Cashflow].[Amount]) AS [Amount],
	SUM([tbl_Cashflow].[BasicAmount]) AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[vw_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))
GROUP BY
	[tbl_Cashflow].[CashAccountID],
	[tbl_Cashflow].[ActualDate],
	[tbl_Cashflow].[TypeID],
	[tbl_CashAccount].[Name]',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''

А вот новый результат в отчете :)

Расходы - сошлись! :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Изменил запрос:

exec sp_executesql N'SELECT TOP 40
	[tbl_Cashflow].[CashAccountID] AS [CashAccountID],
	[tbl_Cashflow].[ActualDate] AS [ActualDate],
	[tbl_Cashflow].[TypeID] AS [TypeID],
	SUM([tbl_Cashflow].[Amount]) AS [Amount],
	SUM([tbl_Cashflow].[BasicAmount]) AS [BasicAmount],
	[tbl_CashAccount].[Name] AS [CashAccountName]
FROM
	[dbo].[tbl_CashAccount] AS [tbl_CashAccount]
LEFT OUTER JOIN
	[dbo].[vw_Cashflow] AS [tbl_Cashflow] ON [tbl_Cashflow].[CashAccountID] = [tbl_CashAccount].[ID]
WHERE(([tbl_Cashflow].[StatusID] = @P1) AND
	([tbl_Cashflow].[ActualDate] >= @P2 AND
	[tbl_Cashflow].[ActualDate] <= @P3))
GROUP BY
	[tbl_Cashflow].[CashAccountID],
	[tbl_Cashflow].[ActualDate],
	[tbl_Cashflow].[TypeID],
	[tbl_CashAccount].[Name]',N'@P1 nvarchar(38),@P2 datetime,@P3 datetime',N'{FDEA47BE-53FE-4730-BF4F-4F44C3B5D61A}',''2009-07-13 
00:00:00:000'',''2009-07-13 23:59:59:000''

Результат, как на рисунке в предыдущем посте!

--
www.it-sfera.com.ua
Terrasoft Solution Partner

запустите запросы из профайлера под админом и под пользователем

У Вас только top 40 в запросе? Раньше до 120 доходило.

Они одинаковы!

86F5FC17-471A-4AAF-92A8-4BDE47381FA5 2009-07-13 00:00:00.000 {358DA0CD-9EA6-43B8-A099-CD77DA3C6114} 27738.02 27738.02 Магазин г.Львов

86F5FC17-471A-4AAF-92A8-4BDE47381FA5 2009-07-13 00:00:00.000 {484C8429-DABF-482A-BC7B-4C75D1436A1B} -967.56 -967.56 Магазин г.Львов

PS: Предварительный результат без 6000 - это была моя ошибка, уже в посте подправил.

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Мда-а, очень интересно!

Ясли перестроить запрос - то он под всеми пользователями выводит одинаковый результат.

А почему так?

--
www.it-sfera.com.ua
Terrasoft Solution Partner

21738.02 27738.02
значения разные

Я ж в PS написал, что моя ошибка! После изменения запроса на тот, что Вы предложили... я... случайно... убил одну операцию на 6000 :) хорошо, что сразу же это заметил! Пост тоже подправил :)

Сейчас (с новым запросом) значения совпадают и под пользователем и под админом!

Так почему придедущий запрос в cross-tab выводил такой результат?

--
www.it-sfera.com.ua
Terrasoft Solution Partner

На моей практике: если результаты разные под пользователем и админом - дело, в 99% случаев, именно в правах!

"Попов Александр" написал:дело, в 99% случаев, именно в правах!

:) Вот он! Ваш 1%

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Виталий Ковалишин aka samael" написал:Вот он! Ваш 1%

Пока не понятно. Вот как выясните причину - тогда будет 1% :)))

Если запрос:

SELECT
        [tbl_Cashflow].[CashAccountID] AS [CashAccountID],
        [tbl_Cashflow].[ActualDate] AS [ActualDate],
        [tbl_Cashflow].[TypeID] AS [TypeID],
        [tbl_Cashflow].[Amount] AS [Amount],
        [tbl_Cashflow].[BasicAmount] AS [BasicAmount],
        [tbl_CashAccount].[Name] AS [CashAccountName]
FROM
        [dbo].[tbl_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
        [dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE([tbl_Cashflow].[StatusID] = :StatusID)

Компонента cross-tab в отчете FastReport выводит разные суммы!

Если добавить группировку, вот так:

SELECT
        [tbl_Cashflow].[CashAccountID] AS [CashAccountID],
        [tbl_Cashflow].[ActualDate] AS [ActualDate],
        [tbl_Cashflow].[TypeID] AS [TypeID],
        SUM([tbl_Cashflow].[Amount]) AS [Amount],
        SUM([tbl_Cashflow].[BasicAmount]) AS [BasicAmount],
        [tbl_CashAccount].[Name] AS [CashAccountName]
FROM
        [dbo].[tbl_Cashflow] AS [tbl_Cashflow]
LEFT OUTER JOIN
        [dbo].[tbl_CashAccount] AS [tbl_CashAccount] ON [tbl_CashAccount].[ID] = [tbl_Cashflow].[CashAccountID]
WHERE([tbl_Cashflow].[StatusID] = :StatusID)
GROUP BY
        [tbl_Cashflow].[CashAccountID],
        [tbl_Cashflow].[ActualDate],
        [tbl_Cashflow].[TypeID],
        [tbl_CashAccount].[Name]

Компонента cross-tab в отчете FastReport выводит одинаковые суммы!

Не права доступа - 100%!

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Александр, я не поленился и создал отдельный отчет с приведенными выше запросами. Создал 2 cross-tab к каждому подключил один из запросов. Под админом результаты двух таблиц совпадают! Под обычным пользователем - смотрим атач (база тестовая, дату фильтрации выбрал произвольно).

К чему относим такое поведение компоненты??? :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

PS: В перекрепленном отчете суммы (итого) совпали! А вот за 13 число (смтр. первый пост) - так там даже суммы разные :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Виталий, к сожалению, проблему не удалось воспроизвести. Как Вы и описывали, сделал два отчёта с кросс-табами, в каждом из которых используется один из предложенных Вами запросов, и оба работают идентично, как под пользователем, так и под админом. Более того, экспериментировал с записями, созданными разными пользователями, - в результат попадают ровно те записи, на которые у пользователя есть права. Об этом я уже писал выше.

Кстати, не вижу разницы в таблицах, продемонстрированных Вами на скриншоте (если не считать того, что во второй таблице нет разбивки по приходу/расходу). Итоговые данные, а так же все промежуточные суммы в любом направлении, на мой взгляд, корректны.

Я же это сам не нарисовал :)

Если Вам интересно, могу поднять копию базы до внесения изменений с группировкой, установить базу с Visual Studio на тестовой машине и дать Вам на некоторое время доступ - поиграть :) Возможно, Вы мне объясните, где наш программист, в этом задание, ошибся ;)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Я Вам видео запишу сейчас - и выложу :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Можно попробовать.

Вышлите, пожалуйста, параметры удалённого доступа на o.labyak@tscrm.com

Видео здесь: ФАЙЛ (1,6 Мб)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Видео записал, доступ предоставил для Лабьяк Олег Игоревич...

Ждем-с комментариев :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Попов Александр" написал:Пока не понятно. Вот как выясните причину - тогда будет 1% :)))

Александр, Вы уже с 1% определились :)))

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Пока нет. Причина же, не найдена! :)

Ну, как Вам сказать... :)

Можете уточнить у Вашего сотрудника, которому вчера был предоставлен доступ к базе... Он сам все увидел 8-)

Могу подготовить фрагмент базы и сервисы отчета!

В общем, для себя я вопрос решил и знаю, как НЕЛЬЗЯ писать запросы для cross-tab, если не хочешь увидеть вот такие "сюрпризы" в отчетности под разными пользователями :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Так в чем проблема, в FastReport?

Да, я подключался и проверял формирование отчёта под пользователем и администратором, используя по очереди оба запроса.

Жду фрагмент базы, попытаюсь определить, чем же некоторые записи "лучше" других, что не отображаются в отчёте :).

To Underscore a.k.a.:
Пока окончательно не определили, сегодня попытаемся решить.

Ещё одна идея появилась... Виталий, проверьте, пожалуйста, свойство FetchRecordsCount в датасете FastReport. Может, оно осталось 40, как по умолчанию? Надо 0 поставить.

"Лабьяк Олег Игоревич" написал: Надо 0 поставить.

Зачем? FastReport же сам меняет это значение, судя по запросам, которые валятся в базу при построении отчета.

А чтобы определить виноват ли FastReport, нужно просто на бумажке самому построить отчет по тем данным, которые вернет запрос в QueryAnalizer.

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