Я пытаюсь создать хранимую процедуру для создания отчета о пробном балансе в Microsoft SSRS в первый раз (да, его тоже пугает!), И я испытываю некоторые трудности. Раньше я использовал Business Objects или MS Access для облегчения требований к отчетности из исходной базы данных.Создание хранимой процедуры в первый раз
SQL-запрос в ниже CREATE заявление SP работает правильно, но я получаю проблемы при попытке преобразовать его в новую хранимую процедуру:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[GDM_TrialBalanceEL3_DEV_CVB]
-- Add the parameters for the stored procedure here
@grpcode varchar(12),
@company varchar(12),
@currency varchar(12),
@begperiod int,
@startperiod int,
@endperiod int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--- DECLARE VARIABLES ----
DECLARE @NominalLevel int,
@Currency varchar(3),
@cmpcode varchar (12),
@FromYear int,
@FromPeriod int,
@FromPeriodMMMM int,
@ToYear int,
@ToPeriod int,
@ToPeriodMMMM int,
@BookingType varchar (2)
--- SET PARAMETERS (enter values) ---
SET @NominalLevel = 3
SET @Currency = 'EUR'
SET @cmpcode = 'BEC001'
SET @FromYear = 2013
SET @FromPeriod = 1
SET @ToYear = 2013
SET @ToPeriod = 12
SET @BookingType = 'STCO'
--- COMBINE PARAMETERS ----
SET @FromPeriodMMMM = @FromYear * 10000 + @FromPeriod
SET @ToPeriodMMMM = @ToYear * 10000 + @ToPeriod
------OPENING BALANCE ----
SELECT a.cmpcode
,g.grpcode
, SUBSTRING(a.el1,1,2) AS 'ST/CO'
, a.el2
, a.el3
, CASE WHEN @NominalLevel=2 THEN a.el2 ELSE a.el3 END AS 'Account'
, el.sname AS AccountName
,'Opening Balance' AS Movement
, CASE WHEN @Currency='EUR' THEN SUM(a.valuehome) ELSE SUM(a.valuedual) END AS 'Amount'
, CASE WHEN @Currency='EUR' AND a.deb_cred_ind=160 THEN SUM(a.valuehome)WHEN @Currency<>'EUR' AND a.deb_cred_ind=160 THEN SUM(a.valuedual)ELSE 0 END AS 'Credit'
, CASE WHEN @Currency='EUR' AND a.deb_cred_ind=161 THEN SUM(a.valuehome)WHEN @Currency<>'EUR' AND a.deb_cred_ind=161 THEN SUM(a.valuedual)ELSE 0 END AS 'Debit'
, c.l1hdrtxt
, c.l2hdrtxt
, c.l3hdrtxt
, c.leafhdrtxt
FROM CODATEST_EU1.dbo.oas_agmlist b,
CODATEST_EU1.dbo.oas_docline a,
CODATEST_EU1.dbo.oas_himlist c,
CODATEST_EU1.dbo.oas_dochead d,
CODATEST_EU1.dbo.oas_perlist e,
CODATEST_EU1.dbo.oas_company f,
CODATEST_EU1.dbo.oas_grplist g,
CODATEST_EU1.dbo.oas_element el
WHERE
((a.el3 BETWEEN b.el3incfrom AND b.el3incto)
AND((b.el3excfrom is NULL) OR (a.el3 NOT BETWEEN b.el3excfrom AND b.el3excto)))
AND c.code='TRIALBALANCE'
AND c.grpcode=b.code
AND a.cmpcode = d.cmpcode
AND a.doccode = d.doccode
AND a.docnum = d.docnum
AND d.yr = e.yr
AND d.period = e.period
AND d.cmpcode = e.cmpcode
AND d.cmpcode = f.code
AND a.el1 = g.code
AND a.cmpcode= g.cmpcode
AND g.elmlevel = 1
AND d.cmpcode = el.cmpcode
AND el.code = CASE WHEN @NominalLevel=2 THEN a.el2 ELSE a.el3 END
AND el.elmlevel= @NominalLevel
AND a.cmpcode = @cmpcode
AND d.yr*10000+d.Period BETWEEN f.yrmin*10000 AND (@FromPeriodMMMM-1)
AND g.grpcode = @BookingType
AND a.el3 < '60000000'
GROUP BY a.cmpcode
,g.grpcode
, SUBSTRING(a.el1,1,2)
, a.el2
, a.el3
, CASE WHEN @NominalLevel=2 THEN a.el2 ELSE a.el3 END
, EL.sname
, a.deb_cred_ind
, c.l1hdrtxt
, c.l2hdrtxt
, c.l3hdrtxt
, c.leafhdrtxt
UNION ALL
----MOVEMENT ----
SELECT a.cmpcode
,g.grpcode
, SUBSTRING(a.el1,1,2) AS 'ST/CO'
, a.el2
, a.el3
, CASE WHEN @NominalLevel=2 THEN a.el2 ELSE a.el3 END AS Account
, el.sname as AccountName
,'Movement' AS Movement
, CASE WHEN @Currency='EUR' THEN SUM(a.valuehome) ELSE SUM(a.valuedual) END AS 'Amount'
, CASE WHEN @Currency='EUR' AND a.deb_cred_ind=160 THEN SUM(a.valuehome)WHEN @Currency<>'EUR' AND a.deb_cred_ind=160 THEN SUM(a.valuedual)ELSE 0 END AS 'Credit'
, CASE WHEN @Currency='EUR' AND a.deb_cred_ind=161 THEN SUM(a.valuehome)WHEN @Currency<>'EUR' AND a.deb_cred_ind=161 THEN SUM(a.valuedual)ELSE 0 END AS 'Debit'
, c.l1hdrtxt
, c.l2hdrtxt
, c.l3hdrtxt
, c.leafhdrtxt
FROM CODATEST_EU1.dbo.oas_agmlist b,
CODATEST_EU1.dbo.oas_docline a,
CODATEST_EU1.dbo.Oas_himlist c,
CODATEST_EU1.dbo.oas_dochead d,
CODATEST_EU1.dbo.oas_perlist e,
CODATEST_EU1.dbo.oas_company f,
CODATEST_EU1.dbo.oas_grplist g,
CODATEST_EU1.dbo.oas_element el
WHERE
((a.el3 BETWEEN b.el3incfrom AND b.el3incto)
AND((b.el3excfrom is NULL) OR (a.el3 NOT BETWEEN b.el3excfrom AND B.el3excto)))
AND c.code='TRIALBALANCE'
AND c.grpcode=b.code
AND a.cmpcode = d.cmpcode
AND a.doccode = d.doccode
AND a.docnum = d.docnum
AND d.yr = e.yr
AND d.period = e.period
AND d.cmpcode = e.cmpcode
AND d.cmpcode = f.code
AND a.el1 = g.code
AND a.cmpcode= g.cmpcode
AND g.elmlevel = 1
AND d.cmpcode = el.cmpcode
AND el.code = Case When @NominalLevel=2 Then a.el2 else a.el3 end
AND el.elmlevel= @NominalLevel
AND a.cmpcode = @cmpcode
AND d.yr*10000+d.Period between @FromPeriodMMMM and @ToPeriodMMMM
AND g.grpcode = @BookingType
GROUP BY a.cmpcode
,g.grpcode
, SUBSTRING(a.el1,1,2)
, a.el2
, a.el3
, CASE WHEN @NominalLevel=2 THEN a.el2 ELSE a.el3 END
, EL.sname
, a.deb_cred_ind
, c.l1hdrtxt
, c.l2hdrtxt
, c.l3hdrtxt
, c.leafhdrtxt
UNION ALL
---- RETAINED EARNINGS ---
SELECT a.cmpcode
,g.grpcode
,SUBSTRING(a.el1,1,2) as 'ST/CO'
,(SELECT el1.subselm from oas_element AS el1 WHERE el1.elmlevel=3 AND el1.cmpcode = @cmpcode AND el1.code='53100000')
,'53100000'
, CASE WHEN @NominalLevel=2 THEN (SELECT el1.subselm from oas_element AS el1 WHERE el1.elmlevel=3 AND el1.cmpcode = @cmpcode AND el1.code='53100000') ELSE '53100000' END AS Account
, CASE WHEN @NominalLevel=2 THEN (SELECT el2.sname FROM oas_element AS el1 ,oas_element AS el2 WHERE el1.elmlevel=3 AND el2.elmlevel=2 AND el1.cmpcode = @cmpcode AND el1.code='53100000' AND el2.code=el1.subselm AND el2.cmpcode = el1.cmpcode)
ELSE (SELECT el1.sname from oas_element AS el1 WHERE el1.elmlevel=3 AND el1.cmpcode = @cmpcode AND el1.code='53100000')END AS 'AccountName'
, 'Opening Balance'
, CASE WHEN @Currency='EUR' THEN SUM(a.valuehome) ELSE SUM(a.valuedual) END AS 'Amount'
, CASE WHEN @Currency='EUR' AND SUM(a.valuehome)<0 THEN SUM(a.valuehome) WHEN @Currency<>'EUR' AND SUM(a.valuedual)<0 THEN SUM(a.valuedual)ELSE 0 END AS 'Credit'
, CASE WHEN @Currency='EUR' AND SUM(a.valuehome)>0 THEN SUM(a.valuehome) WHEN @Currency<>'EUR' AND SUM(a.valuedual)<0 THEN SUM(a.valuedual)ELSE 0 END AS 'Debit'
, 'BALANCE SHEET'
, 'EQUITY'
, 'TOTAL RETAINED EARNINGS'
, 'RETAINED EARNINGS'
FROM CODATEST_EU1.dbo.oas_agmlist b,
CODATEST_EU1.dbo.oas_docline a,
CODATEST_EU1.dbo.Oas_himlist c,
CODATEST_EU1.dbo.oas_dochead d,
CODATEST_EU1.dbo.oas_perlist e,
CODATEST_EU1.dbo.oas_company f,
CODATEST_EU1.dbo.oas_grplist g,
CODATEST_EU1.dbo.oas_element el
WHERE
((a.el3 BETWEEN b.el3incfrom AND b.el3incto)
AND((b.el3excfrom is NULL) OR (a.el3 NOT BETWEEN b.el3excfrom AND B.el3excto)))
AND c.code='TRIALBALANCE'
AND c.grpcode=b.code
AND a.cmpcode = d.cmpcode
AND a.doccode = d.doccode
AND a.docnum = d.docnum
AND d.yr = e.yr
AND d.period = e.period
AND d.cmpcode = e.cmpcode
AND d.cmpcode = f.code
AND a.el1 = g.code
AND a.cmpcode= g.cmpcode
AND g.elmlevel = 1
AND d.cmpcode = el.cmpcode
AND el.code = CASE WHEN @NominalLevel=2 THEN a.el2 ELSE a.el3 END
AND el.elmlevel= @NominalLevel
AND a.cmpcode = @cmpcode
AND d.yr*10000+d.Period between f.yrmin*10000 and (@FromPeriodMMMM-1)
AND g.grpcode = @BookingType
AND a.el3 > '60000000'
GROUP BY a.cmpcode,g.grpcode,substring(a.el1,1,2)
UNION ALL
---- CY PROFIT/LOSS ---
SELECT a.cmpcode
, g.grpcode
, substring(a.el1,1,2) as 'ST/CO'
, (SELECT el1.subselm from oas_element AS el1 WHERE el1.elmlevel=3 AND el1.cmpcode = @cmpcode AND el1.code='53100001')
, '53100001'
, CASE WHEN @NominalLevel=2 THEN(SELECT el1.subselm from oas_element AS el1 WHERE el1.elmlevel=3 AND el1.cmpcode = @cmpcode AND el1.code='53100001')
ELSE '53100001'
END AS Account
, CASE WHEN @NominalLevel=2 THEN (SELECT el2.sname FROM oas_element AS el1 ,oas_element AS el2 WHERE el1.elmlevel=3 AND el2.elmlevel=2 AND el1.cmpcode = @cmpcode AND el1.code='53100001' AND el2.code=el1.subselm AND el2.cmpcode = el1.cmpcode)
ELSE (SELECT el1.sname from oas_element AS el1 WHERE el1.elmlevel=3 AND el1.cmpcode = @cmpcode AND el1.code='53100001')END AS 'AccountName'
, 'Movement'
, CASE WHEN @Currency='EUR' THEN SUM(a.valuehome) ELSE SUM(a.valuedual) END AS 'Amount'
, CASE WHEN @Currency='EUR' AND SUM(a.valuehome)<0 THEN SUM(a.valuehome) WHEN @Currency<>'EUR' AND SUM(a.valuedual)<0 THEN SUM(a.valuedual)ELSE 0 END AS 'Credit'
, CASE WHEN @Currency='EUR' AND SUM(a.valuehome)>0 THEN SUM(a.valuehome) WHEN @Currency<>'EUR' AND SUM(a.valuedual)<0 THEN SUM(a.valuedual)ELSE 0 END AS 'Debit'
, 'BALANCE SHEET'
, 'EQUITY'
, 'TOTAL RETAINED EARNINGS'
, 'RETAINED EARNINGS'
FROM CODATEST_EU1.dbo.oas_agmlist b,
CODATEST_EU1.dbo.oas_docline a,
CODATEST_EU1.dbo.Oas_himlist c,
CODATEST_EU1.dbo.oas_dochead d,
CODATEST_EU1.dbo.oas_perlist e,
CODATEST_EU1.dbo.oas_company f,
CODATEST_EU1.dbo.oas_grplist g,
CODATEST_EU1.dbo.oas_element el
WHERE
((a.el3 BETWEEN b.el3incfrom AND b.el3incto)
AND((b.el3excfrom is NULL) OR (a.el3 NOT BETWEEN b.el3excfrom AND B.el3excto)))
AND c.code='TRIALBALANCE'
AND c.grpcode=b.code
AND a.cmpcode = d.cmpcode
AND a.doccode = d.doccode
AND a.docnum = d.docnum
AND d.yr = e.yr
AND d.period = e.period
AND d.cmpcode = e.cmpcode
AND d.cmpcode = f.code
AND a.el1 = g.code
AND a.cmpcode= g.cmpcode
AND g.elmlevel = 1
AND d.cmpcode = el.cmpcode
AND a.el3 >= '60000000'
AND el.code = CASE WHEN @NominalLevel=2 THEN a.el2 ELSE a.el3 END
AND el.elmlevel= @NominalLevel
AND a.cmpcode = @cmpcode
AND d.yr*10000+d.Period between @FromPeriodMMMM and @ToPeriodMMMM
AND g.grpcode = @BookingType
GROUP BY a.cmpcode ,g.grpcode , substring(a.el1,1,2)
При попытке запустить SQL, чтобы создать хранимую процедуру, я Получение сообщения:
Msg 134, уровень 15, состояние 1, процедура GDM_TrialBalanceEL3_DEV_CVB, строка 26 Имя переменной '@Currency' уже объявлено. Имена переменных должны быть уникальными в рамках пакета запросов или хранимой процедуры. Msg 137, уровень 15, состояние 1, процедура GDM_TrialBalanceEL3_DEV_CVB, строка 40 Должен объявить скалярную переменную «@cmpcode».
N.B. Есть около 10 дополнительных примеров Msg 137 для разных переменных, но я полагаю, что если я пойму логику для 1, я смогу решить остальные 9?
Из моего исследования google до сих пор это могло быть связано с множеством проблем (скалярная переменная = инструкция Go, заставляющая re объявлять переменную и т. Д.), Но при проверке нет GO-операторов, только UNION и JOIN, m не уверен, где он вписывается в то, что может быть вероятной причиной.
Я был бы очень признателен, если бы кто-то мог помочь (и объяснить, почему, поскольку я не делаю ту же ошибку снова), поскольку мне срочно нужно создать этот SP сегодня, и кажется, что ресурс DBA недоступен грипп ..
Вам не хватает концевого кронштейна? – Milen