2014-02-05 2 views
2

Я пытаюсь создать хранимую процедуру для создания отчета о пробном балансе в 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 недоступен грипп ..

+0

Вам не хватает концевого кронштейна? – Milen

ответ

0

Вы объявили @Currency, как два times..Remove один

добавить еще один кронштейн в конце

+0

Привет, Я прокомментировал детали в разделе «Добавить параметры для хранимой процедуры здесь», и теперь он проходит до строки 294, где он помещает неправильный синтаксис рядом с «)». Не могли бы вы бросить на него глаз? (Подумайте, это случай, когда вы не увидите дерево для деревьев!) – Dyonysus

+0

@Dyonysus может видеть мой обновленный ответ –

0

изменить ваш последний WHERE к

WHERE 
((a.el3 BETWEEN b.el3incfrom AND b.el3incto) 
AND((b.el3excfrom is NULL) OR (a.el3 NOT BETWEEN b.el3excfrom AND B.el3excto)) -- one to many here (removed) 
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) -- closing bracket here added 
GROUP BY a.cmpcode ,g.grpcode , substring(a.el1,1,2) 
+0

Пробовал это и все еще не нравится - то же сообщение, с или без закрывающей скобки. – Dyonysus

+0

Я становлюсь довольно смущенным этим сейчас, но я искренне ценю ваше терпение! Я скопировал ваши рекомендуемые поправки в соответствии с инструкциями (после удаления пропущенных битов), но я боюсь, что он все еще дает то же сообщение (относится к строке 291). – Dyonysus

+1

Проблема решена. После добавления в скобки, как описано выше, я добавил «конец», и запрос был выполнен правильно. большое спасибо тем, кто помог #unsungheroes – Dyonysus

Смежные вопросы