Различные инструменты для получения осмысленной информации
К специальным инструментам получения осмысленной информации можно отнести запросы и отчёты. Используя функциональность «быстрый поиск» можно создавать запросы, подобные стандартным запросам, которые мы используем, например, при нажатии на клавишу «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'
Запустите его на выполнение и посмотрите результат.
Содержание:
- Цели урока, Введение: Цикл продаж: Какие модули участвуют?
- Обзор структуры БД системы
- Знакомство с функциональностью iScala: Технические сведения для начала работы
- Типы заказов на продажу. Специальные типы заказов. Внутренние продажи
- Как устроены таблицы модуля «Заказы на Продажу»?
- Стандартная последовательность действий при работе с заказами на продажу
- Краткое знакомство с типами аналитических проводок модуля «Управление Запасами»
- Основные таблицы модуля «Управление Запасами»
- Практическое задание: Написание запроса для определения остатков по запасам на складах на конец периода
- Основные стандартные отчёты и документы iScala, применимые к «Циклу Продаж»
- Основные таблицы модулей «Статистика» (имеющие отношение к продажам) и Книга Продаж
- Практическое задание: Как вычислить вступительное сальдо по покупателю
- Различные инструменты для получения осмысленной информации