Различные инструменты для получения осмысленной информации

Различные инструменты для получения осмысленной информации

Snap Search BuilderК специальным инструментам получения осмысленной информации можно отнести запросы и отчёты. Используя функциональность «быстрый поиск» можно создавать запросы, подобные стандартным запросам, которые мы используем, например, при нажатии на клавишу «F4» в тех местах, где подразумевается выбор из списка. Также можно использовать дополнительные построители запросов и отчётов, например, Query Designer. Многие из подобных средств позиционируются как инструмент для конечного пользователя. Однако не всё можно сделать с помощью технологии drag and drop и рассмотренный нами пример с так называемыми проводками «разнесения» является подтверждением этому. Разумеется, если правильно организовать «маркировку» информации, тогда отфильтровать ненужное достаточно просто. Однако часто это не делается должным образом.

Рассмотрим пример, как правильнее было бы «пометить» проводки «разнесения» («увязки» авансовых платежей и счетов-фактур Книги Продаж). В модуле Главная Книга можно вносить проводки, задавая их нумерацию «вручную» с использованием счётчиков, начинающихся на латинские буквы. Если договориться, чтобы проводки «разнесения» делались исключительно через модуль Главная Книга с использованием выделенного счётчика на определённую букву, например, «U», тогда отфильтровать их не составило бы труда для обычного пользователя, умеющего пользоваться Query Designer’ом. А вот если об этом изначально не договориться, то Query Designer уже не поможет, потребуются более глубокие знания и функциональности iScala, и запросов Transact SQL. Знания эти состоят в том, что проводкой разнесения можно считать ту, где сумма значений поля SL21007 равна нулю для одного и того же покупателя (если платёж в локальной валюте или для поля SL21008, если в иностранной).

Ниже приводится пример функции, позволяющей определить, является ли запись в таблице SL21 «реальным» платежом или проводкой «разнесения». Откройте файл «07_create_function_IsRealPayment.sql»:

CREATE  FUNCTION [dbo].[IsRealPayment] (@Customer nvarchar(10), @TransactionNumber nvarchar(6))
/*
-----------------------------------------------
Это реальный платеж или проводка разнесения?
Определяется по сумме проводки: для проводки
разнесения сумма равна нулю, с учетом
комментариев приведенных ниже
-----------------------------------------------
	Алексей Васильев
	02.12.2005
-----------------------------------------------
*/
RETURNS int
AS
BEGIN
declare
@TrSum numeric(20,8),
@Result int
select @TrSum=case
	when sum(ungroupped.LinesQty)=1 then 1
	when count(*)>1 then sum(ungroupped.LC)
	else sum(ungroupped.OC) end
from
-- сначала группируем по покупателю, № проводки и коду валюты
	(select
	SL21001 as CustomerCode,
	SL21004 as TransactionNumber,
	sum(SL21007) as LC,
	sum(SL21008) as OC,
	SL21017 as CurrencyCode,
	count(*) as LinesQty
	from SL210100 (NOLOCK)
	where SL21001=@Customer and SL21004=@TransactionNumber
	group by SL21001, SL21004, SL21017)
	ungroupped
-- затем группируем сгруппированное. Если валюты разные, смотрим суммы в локальной валюте, если одинаковые - в оригинальной
group by ungroupped.CustomerCode, ungroupped.TransactionNumber
	if @TrSum<>0
	-- сумма по проводке не нулевая - это обычный платеж
	BEGIN
	set @Result=1
	END
	ELSE
	-- это проводка разнесения
	BEGIN
	set @Result=0
	END
RETURN @Result
END

Пример использования. Модифицируем ранее созданный запрос:

select
SL21001 as CustomerCode,
SL21002 as InvoiceNumber,
SL21003 as LineNumber,
SL21004 as TransactionNumber,
[dbo].[IsRealPayment](SL21001,SL21004) as IsRealPaymentOrNot,
SL21005 as TransactionDate,
[InvoiceAmount]=-SL21007,
SL21017 as [CurrencyCode],
rtrim(SUBSTRING(SL03017,1,6)) as AccountNo
from SL210100 (NOLOCK)
  inner join SL030100 (NOLOCK)
    on (SL03001=SL21001) and (SL03002=SL21002)
where SL21006 <'20100101'

Запустите его на выполнение и посмотрите результат.

Содержание: