Пишу вот такой простой запрос:
IF EXISTS (SELECT * from tempdb..sysobjects where id = object_id('tempdb..#TablOstVZ'))
DROP TABLE #TablOstVZ
Declare @PERIODR DateTime
Declare @PERIODN Char(8)
Declare @PERIODK Char(23)
Declare @PERIODE Char(23)
SET @PERIODR = Convert(DateTime,'20091101',112)
SET @PERIODN = '20091201'
SET @PERIODK = '20091201'
SET @PERIODE = '20091209Z'
Declare @Firma Char(9)
SET @Firma = ' 1 '
Declare @Val Char(9)
SET @Val = ' 1 '
SELECT
TMP2.Контрагент As [Контрагент],
TMP2.КредДокумент As [КредДокумент],
SUM(TMP2.Долг_НачОст) As [Долг_НачОст],
SUM(TMP2.Долг_Приход) As [Долг_Приход],
SUM(TMP2.Долг_Расход) As [Долг_Расход],
SUM(TMP2.Долг_НачОст + TMP2.Долг_Приход - TMP2.Долг_Расход) As [Долг_КонОст]
INTO #TablOstVZ
FROM (
SELECT
$TabR1.Контрагент AS Контрагент,
$TabR1.КредДокумент AS КредДокумент,
$TabR1.Долг AS Долг_НачОст,
0 AS Долг_Приход,
0 AS Долг_Расход
FROM
$РегистрИтоги.ВзаиморасчетыПокупателей AS TabR1 (NOLOCK)
WHERE
TabR1.PERIOD = @PERIODR
AND $TabR1.Фирма = @Firma
AND $TabR1.Валюта = @Val
UNION ALL
SELECT
$TabR2.Контрагент AS Контрагент,
$TabR2.КредДокумент AS КредДокумент,
CASE WHEN TabJ.DATE_TIME_IDDOC < @PERIODK THEN ($TabR2.Долг*((TabR2.DEBKRED+1)%2))- ($TabR2.Долг*TabR2.DEBKRED) ELSE 0 END AS Долг_НачОст,
CASE WHEN TabJ.DATE_TIME_IDDOC > @PERIODK THEN ($TabR2.Долг*((TabR2.DEBKRED+1)%2)) ELSE 0 END AS Долг_Приход,
CASE WHEN TabJ.DATE_TIME_IDDOC > @PERIODK THEN ($TabR2.Долг*TabR2.DEBKRED) ELSE 0 END AS Долг_Расход
FROM
$Регистр.ВзаиморасчетыПокупателей AS TabR2 (NOLOCK)
INNER JOIN _1SJOURN As TabJ (NOLOCK) ON (TabR2.IDDOC = TabJ.IDDOC)
WHERE
TabJ.DATE_TIME_IDDOC >= @PERIODN
AND TabJ.DATE_TIME_IDDOC < @PERIODE
AND $TabR2.Фирма = @Firma
AND $TabR2.Валюта = @Val
-- По поставщикам
UNION ALL
SELECT
$TabR1.Контрагент AS Контрагент,
$TabR1.КредДокумент AS КредДокумент,
-$TabR1.Долг AS Долг_НачОст,
0 AS Долг_Приход,
0 AS Долг_Расход
FROM
$РегистрИтоги.ВзаиморасчетыПоставщиков AS TabR1 (NOLOCK)
WHERE
TabR1.PERIOD = @PERIODR
AND $TabR1.Фирма = @Firma
AND $TabR1.Валюта = @Val
UNION ALL
SELECT
$TabR2.Контрагент AS Контрагент,
$TabR2.КредДокумент AS КредДокумент,
CASE WHEN TabJ.DATE_TIME_IDDOC < @PERIODK THEN -($TabR2.Долг*((TabR2.DEBKRED+1)%2))- ($TabR2.Долг*TabR2.DEBKRED) ELSE 0 END AS Долг_НачОст,
CASE WHEN TabJ.DATE_TIME_IDDOC > @PERIODK THEN -($TabR2.Долг*((TabR2.DEBKRED+1)%2)) ELSE 0 END AS Долг_Приход,
CASE WHEN TabJ.DATE_TIME_IDDOC > @PERIODK THEN -($TabR2.Долг*TabR2.DEBKRED) ELSE 0 END AS Долг_Расход
FROM
$Регистр.ВзаиморасчетыПоставщиков AS TabR2 (NOLOCK)
INNER JOIN _1SJOURN As TabJ (NOLOCK) ON (TabR2.IDDOC = TabJ.IDDOC)
WHERE
TabJ.DATE_TIME_IDDOC >= @PERIODN
AND TabJ.DATE_TIME_IDDOC < @PERIODE
AND $TabR2.Фирма = @Firma
AND $TabR2.Валюта = @Val
) AS TMP2
GROUP BY
TMP2.Контрагент,
TMP2.КредДокумент
HAVING
(
(SUM(TMP2.Долг_НачОст) <> 0)
OR (SUM(TMP2.Долг_Приход) <> 0)
OR (SUM(TMP2.Долг_Расход) <> 0))
В принципе запрос просто берет обороты и остатки по регистрам
"ВзаиморасчетыПокупателей" и "ВзаиморасчетыПоставщиков", все должно работать прекрасно (если этот запрос выполнить без типизации в QueryAnalis-ере), но вот с типизацией у метапарсера получаются проблемы, а именно вот такой запрос уходит на SQL-сервер (в следующем посте).