2017-04-15 255 views
1

下面的存儲過程起作用。但是,它不顯示SQL Reporting Services報告(SSRS報告)中的數據。SSRS報告不從存儲過程中提取數據

它必須是不顯示數據的臨時表。

如何獲取SSRS報告以提取數據?

原始存儲過程是當前存儲過程的上半部分。

我們修改了存儲過程,通過複製「頂部到底部」並向上半部分select語句的「where」子句添加代碼來說明以單詞「CUSTOM」或「SPECIAL」結尾的庫存料品號(ITEMNMBR) 」。

我們希望存儲過程的兩個部分都運行 - 循環或無循環 - 從某種意義上說,如果該項目是「CUSTOM」或「SPECIAL」,則運行存儲過程的上半部分。如果項目編號不是這些,則運行底部。

它類似於「if-then」語句。

起初,我嘗試在兩者之間插入一個「UNION ALL」子句。但是,SQL給了我一個語法錯誤,直到我刪除它。

請讓我知道您的想法。

謝謝!

約翰

ALTER procedure [dbo].[SRS_TransferBackOrdersToWareHouseBatch] 
as 
declare @sourceBatchRecordCount int 
declare @destBatchRecordCount int 
declare @destBatch varchar(30) 
declare @sourceBatch varchar(30) 

set @sourceBatch = 'BACKORDER' 
set @destBatch = 'WAREHOUSE' 

select @sourceBatchRecordCount = COUNT(*) from SOP10100 where bachnumb = @sourceBatch 
select @destBatchRecordCount = COUNT(*) from SOP10100 where BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
(ITEMNMBR LIKE '%CUSTOM' AND 
ATYALLOC > 0) OR (ITEMNMBR LIKE '%SPECIAL' AND 
ATYALLOC > 0)) 
select sopnumbe into #movedBO from SOP10100 where BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
(ITEMNMBR LIKE '%CUSTOM' AND 
ATYALLOC > 0) OR (ITEMNMBR LIKE '%SPECIAL' AND 
ATYALLOC > 0)) 

--print @sourceBatchRecordCount 
--print @destBatchRecordCount 

if @destBatchRecordCount > 0 
begin 

     declare @p30 int 
     set @p30=0 
     declare @p31 varchar(255) 
     set @p31='' 
     exec taCreateUpdateBatchHeaderRcd @[email protected],@I_vBCHCOMNT=default,@I_vSERIES=3,@I_vGLPOSTDT=default,@I_vBCHSOURC='Sales Entry ', 
@I_vDOCAMT=0,@I_vORIGIN=1,@I_vNUMOFTRX=0,@I_vCHEKBKID=default,@I_vCNTRLTOT=default,@I_vCNTRLTRX=default,@I_vPOSTTOGL=0,@I_vPmtMethod=default, 
@I_vEFTFileFormat=default,@I_vRequesterTrx=default,@I_vBRKDNALL=default,@I_vUSERID=default,@I_vBACHFREQ=default,@I_vRECPSTGS=default, 
@I_vMSCBDINC=default,@I_vAPPROVL=default,@I_vAPPRVLDT=default,@I_vAPRVLUSERID=default,@I_vTRXSOURC=default,@I_vUSRDEFND1=default, 
@I_vUSRDEFND2=default,@I_vUSRDEFND3=default,@I_vUSRDEFND4=default,@I_vUSRDEFND5=default,@[email protected] output,@[email protected] output 

     --EMOIS 9/2/2105 Change update to single update statement for each row, this will cause trigger to fire correctly 
     DECLARE @sopNumber CHAR(21) 
     DECLARE updateSOP CURSOR FOR 
       SELECT RTRIM(SOPNUMBE) FROM SOP10100 WHERE BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
         (ITEMNMBR LIKE '%CUSTOM' AND 
ATYALLOC > 0) OR (ITEMNMBR LIKE '%SPECIAL' AND 
ATYALLOC > 0)) 

     OPEN updateSOP FETCH NEXT FROM updateSOP INTO @sopNumber 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 
       UPDATE SOP10100 
        SET BACHNUMB = @destBatch --ReqShipDate = CONVERT(date, getDate()) Removed to keep original ReqShipDate 
        FROM SOP10100 WHERE SOPNUMBE = @sopNumber 

       FETCH NEXT FROM updateSOP INTO @sopNumber 
     END 
     CLOSE updateSOP DEALLOCATE updateSOP 

     select rtrim(sopnumbe) as 'BackOrderNo' from #movedBO 

     -- reconcile batch headers 

     set nocount on 
     DECLARE @bachnumb char(25) 
     , @numtrx int 
     , @batchamount numeric(19,5) 

     DECLARE c_sop CURSOR FOR 
     SELECT rtrim(BACHNUMB) FROM SY00500 WHERE (SERIES = 3) AND (BCHSOURC = 'Sales Entry') order by 1 

     OPEN c_sop FETCH NEXT FROM c_sop INTO @bachnumb 

     WHILE @@FETCH_STATUS = 0 
     BEGIN SELECT @numtrx = ISNULL(COUNT(SOPNUMBE),0) 
     , @batchamount = ISNULL(SUM(DOCAMNT),0) 
     FROM SOP10100 WHERE BACHNUMB = @bachnumb 

     UPDATE SY00500 SET NUMOFTRX = @numtrx, BCHTOTAL = @batchamount WHERE BACHNUMB = @bachnumb 
     --Print rtrim(@bachnumb) +' ,Transactions = '+COnvert(varchar(100),@numtrx) +' ,BatchTotal = '+COnvert(varchar(100),@batchamount) 
     FETCH NEXT FROM c_sop INTO @bachnumb 
     END 
     CLOSE c_sop DEALLOCATE c_sop 
end 
else 
     select 'No documents.' as 'BackOrderNo' 

--declare @sourceBatchRecordCount int 
--declare @destBatchRecordCount int 
--declare @destBatch varchar(30) 
--declare @sourceBatch varchar(30) 

--set @sourceBatch = 'BACKORDER' 
--set @destBatch = 'WAREHOUSE' 


select @sourceBatchRecordCount = COUNT(*) from SOP10100 where bachnumb = @sourceBatch 
select @destBatchRecordCount = COUNT(*) from SOP10100 where BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
ATYALLOC > 0) 

select sopnumbe into #movedBO2 from SOP10100 where BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
ATYALLOC > 0) 

--print @sourceBatchRecordCount 
--print @destBatchRecordCount 

if @destBatchRecordCount > 0 
begin 


     set @p30=0 
     set @p31='' 
     exec taCreateUpdateBatchHeaderRcd @[email protected],@I_vBCHCOMNT=default,@I_vSERIES=3,@I_vGLPOSTDT=default,@I_vBCHSOURC='Sales Entry ', 
@I_vDOCAMT=0,@I_vORIGIN=1,@I_vNUMOFTRX=0,@I_vCHEKBKID=default,@I_vCNTRLTOT=default,@I_vCNTRLTRX=default,@I_vPOSTTOGL=0,@I_vPmtMethod=default, 
@I_vEFTFileFormat=default,@I_vRequesterTrx=default,@I_vBRKDNALL=default,@I_vUSERID=default,@I_vBACHFREQ=default,@I_vRECPSTGS=default, 
@I_vMSCBDINC=default,@I_vAPPROVL=default,@I_vAPPRVLDT=default,@I_vAPRVLUSERID=default,@I_vTRXSOURC=default,@I_vUSRDEFND1=default, 
@I_vUSRDEFND2=default,@I_vUSRDEFND3=default,@I_vUSRDEFND4=default,@I_vUSRDEFND5=default,@[email protected] output,@[email protected] output 

     --EMOIS 9/2/2105 Change update to single update statement for each row, this will cause trigger to fire correctly 
     DECLARE updateSOP CURSOR FOR 
       SELECT RTRIM(SOPNUMBE) FROM SOP10100 WHERE BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
ATYALLOC > 0) 

     OPEN updateSOP FETCH NEXT FROM updateSOP INTO @sopNumber 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 
       UPDATE SOP10100 
        SET BACHNUMB = @destBatch, ReqShipDate = getDate() --Removed to keep original ReqShipDate 
        FROM SOP10100 WHERE SOPNUMBE = @sopNumber 

        --UPDATE SOP10100   SET ReqShipDate = CONVERT(date, getDate()) 
        --   FROM SOP10100 WHERE SOPNUMBE = @sopNumber 

       FETCH NEXT FROM updateSOP INTO @sopNumber 
     END 
     CLOSE updateSOP DEALLOCATE updateSOP 

     select rtrim(sopnumbe) as 'BackOrderNo' from #movedBO 

     -- reconcile batch headers 

     set nocount on 

     DECLARE c_sop CURSOR FOR 
     SELECT rtrim(BACHNUMB) FROM SY00500 WHERE (SERIES = 3) AND (BCHSOURC = 'Sales Entry') order by 1 

     OPEN c_sop FETCH NEXT FROM c_sop INTO @bachnumb 

     WHILE @@FETCH_STATUS = 0 
     BEGIN SELECT @numtrx = ISNULL(COUNT(SOPNUMBE),0) 
     , @batchamount = ISNULL(SUM(DOCAMNT),0) 
     FROM SOP10100 WHERE BACHNUMB = @bachnumb 

     UPDATE SY00500 SET NUMOFTRX = @numtrx, BCHTOTAL = @batchamount WHERE BACHNUMB = @bachnumb 
     --Print rtrim(@bachnumb) +' ,Transactions = '+COnvert(varchar(100),@numtrx) +' ,BatchTotal = '+COnvert(varchar(100),@batchamount) 
     FETCH NEXT FROM c_sop INTO @bachnumb 
     END 
     CLOSE c_sop DEALLOCATE c_sop 
end 
else 
     select 'No documents.' as 'BackOrderNo' 

回答

0

如果要使用此存儲過程與SSRS報告,那麼你將不得不改變一些事情,要工作。你有一些optons。

第一個選項:將存儲過程分解爲2個存儲過程。 SSRS報告可以有多個數據集。有一個用於原始程序,另一個用於新部分。報告中最終會顯示2個數據表,但最終用戶可能會對此表示滿意。

第二個選項:將過程中的select語句移到代碼的末尾,並在那裏執行聯合。你提到嘗試類似的東西,但如果我正確理解你描述的內容,它就不會奏效。

select rtrim(sopnumbe) as 'BackOrderNo' from #movedBO 
UNION ALL 
select rtrim(sopnumbe) as 'BackOrderNo' from #movedBO2 -- See BTW below 

然後,通過檢查被退回,並顯示/隱藏了消息的文本框的記錄數處理在RDL「無文件」一片。您也可以根據行數顯示/隱藏表格。您可以在控件的隱藏屬性中使用以下表達式。

=IIf(CountRows("DataSet1") > 0, False, True) ' Show me 
=IIf(CountRows("DataSet1") = 0, True, False) ' Hide me 

順便說一句,你創建一個名爲#movedBO2在程序表,但你永遠不從它以後選擇。所以,仔細檢查代碼。

編輯:

更新存儲過程:

CREATE PROCEDURE [dbo].[SRS_TransferBackOrdersToWareHouseBatch] 
as 
declare @sourceBatchRecordCount int 
declare @destBatchRecordCount int 
declare @destBatch varchar(30) 
declare @sourceBatch varchar(30) 

set @sourceBatch = 'BACKORDER' 
set @destBatch = 'WAREHOUSE' 

select @sourceBatchRecordCount = COUNT(*) from SOP10100 where bachnumb = @sourceBatch 
select @destBatchRecordCount = COUNT(*) from SOP10100 where BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
(ITEMNMBR LIKE '%CUSTOM' AND 
ATYALLOC > 0) OR (ITEMNMBR LIKE '%SPECIAL' AND 
ATYALLOC > 0)) 
select sopnumbe into #movedBO from SOP10100 where BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
(ITEMNMBR LIKE '%CUSTOM' AND 
ATYALLOC > 0) OR (ITEMNMBR LIKE '%SPECIAL' AND 
ATYALLOC > 0)) 

if @destBatchRecordCount > 0 
begin 

     declare @p30 int 
     set @p30=0 
     declare @p31 varchar(255) 
     set @p31='' 
     exec taCreateUpdateBatchHeaderRcd @[email protected],@I_vBCHCOMNT=default,@I_vSERIES=3,@I_vGLPOSTDT=default,@I_vBCHSOURC='Sales Entry ', 
     @I_vDOCAMT=0,@I_vORIGIN=1,@I_vNUMOFTRX=0,@I_vCHEKBKID=default,@I_vCNTRLTOT=default,@I_vCNTRLTRX=default,@I_vPOSTTOGL=0,@I_vPmtMethod=default, 
     @I_vEFTFileFormat=default,@I_vRequesterTrx=default,@I_vBRKDNALL=default,@I_vUSERID=default,@I_vBACHFREQ=default,@I_vRECPSTGS=default, 
     @I_vMSCBDINC=default,@I_vAPPROVL=default,@I_vAPPRVLDT=default,@I_vAPRVLUSERID=default,@I_vTRXSOURC=default,@I_vUSRDEFND1=default, 
     @I_vUSRDEFND2=default,@I_vUSRDEFND3=default,@I_vUSRDEFND4=default,@I_vUSRDEFND5=default,@[email protected] output,@[email protected] output 

     --EMOIS 9/2/2105 Change update to single update statement for each row, this will cause trigger to fire correctly 
     DECLARE @sopNumber CHAR(21) 
     DECLARE updateSOP CURSOR FOR 
       SELECT RTRIM(SOPNUMBE) FROM SOP10100 WHERE BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where 
         (ITEMNMBR LIKE '%CUSTOM' AND 
       ATYALLOC > 0) OR (ITEMNMBR LIKE '%SPECIAL' AND 
       ATYALLOC > 0)) 

     OPEN updateSOP FETCH NEXT FROM updateSOP INTO @sopNumber 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 
       UPDATE SOP10100 
        SET BACHNUMB = @destBatch --ReqShipDate = CONVERT(date, getDate()) Removed to keep original ReqShipDate 
        FROM SOP10100 WHERE SOPNUMBE = @sopNumber 

       FETCH NEXT FROM updateSOP INTO @sopNumber 
     END 
     CLOSE updateSOP DEALLOCATE updateSOP 

     -- select rtrim(sopnumbe) as 'BackOrderNo' from #movedBO 

     -- reconcile batch headers 

     set nocount on 
     DECLARE @bachnumb char(25) 
     , @numtrx int 
     , @batchamount numeric(19,5) 

     DECLARE c_sop CURSOR FOR 
     SELECT rtrim(BACHNUMB) FROM SY00500 WHERE (SERIES = 3) AND (BCHSOURC = 'Sales Entry') order by 1 

     OPEN c_sop FETCH NEXT FROM c_sop INTO @bachnumb 

     WHILE @@FETCH_STATUS = 0 
     BEGIN SELECT @numtrx = ISNULL(COUNT(SOPNUMBE),0) 
     , @batchamount = ISNULL(SUM(DOCAMNT),0) 
     FROM SOP10100 WHERE BACHNUMB = @bachnumb 

     UPDATE SY00500 SET NUMOFTRX = @numtrx, BCHTOTAL = @batchamount WHERE BACHNUMB = @bachnumb 
     --Print rtrim(@bachnumb) +' ,Transactions = '+COnvert(varchar(100),@numtrx) +' ,BatchTotal = '+COnvert(varchar(100),@batchamount) 
     FETCH NEXT FROM c_sop INTO @bachnumb 
     END 
     CLOSE c_sop DEALLOCATE c_sop 
end 

select @sourceBatchRecordCount = COUNT(*) from SOP10100 where bachnumb = @sourceBatch 
select @destBatchRecordCount = COUNT(*) from SOP10100 where BACHNUMB = @sourceBatch 
and SOPNUMBE in (select SOPNUMBE from SOP10200 where ATYALLOC > 0) 

select sopnumbe into #movedBO2 from SOP10100 where BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where ATYALLOC > 0) 


if @destBatchRecordCount > 0 
begin 


     set @p30=0 
     set @p31='' 
     exec taCreateUpdateBatchHeaderRcd @[email protected],@I_vBCHCOMNT=default,@I_vSERIES=3,@I_vGLPOSTDT=default,@I_vBCHSOURC='Sales Entry ', 
      @I_vDOCAMT=0,@I_vORIGIN=1,@I_vNUMOFTRX=0,@I_vCHEKBKID=default,@I_vCNTRLTOT=default,@I_vCNTRLTRX=default,@I_vPOSTTOGL=0,@I_vPmtMethod=default, 
      @I_vEFTFileFormat=default,@I_vRequesterTrx=default,@I_vBRKDNALL=default,@I_vUSERID=default,@I_vBACHFREQ=default,@I_vRECPSTGS=default, 
      @I_vMSCBDINC=default,@I_vAPPROVL=default,@I_vAPPRVLDT=default,@I_vAPRVLUSERID=default,@I_vTRXSOURC=default,@I_vUSRDEFND1=default, 
      @I_vUSRDEFND2=default,@I_vUSRDEFND3=default,@I_vUSRDEFND4=default,@I_vUSRDEFND5=default,@[email protected] output,@[email protected] output 

     --EMOIS 9/2/2105 Change update to single update statement for each row, this will cause trigger to fire correctly 
     DECLARE updateSOP CURSOR FOR 
       SELECT RTRIM(SOPNUMBE) FROM SOP10100 WHERE BACHNUMB = @sourceBatch and SOPNUMBE in (select SOPNUMBE from SOP10200 where ATYALLOC > 0) 

     OPEN updateSOP FETCH NEXT FROM updateSOP INTO @sopNumber 
     WHILE @@FETCH_STATUS = 0 
     BEGIN 
       UPDATE SOP10100 
        SET BACHNUMB = @destBatch, ReqShipDate = getDate() --Removed to keep original ReqShipDate 
        FROM SOP10100 WHERE SOPNUMBE = @sopNumber 

        --UPDATE SOP10100   SET ReqShipDate = CONVERT(date, getDate()) 
        --   FROM SOP10100 WHERE SOPNUMBE = @sopNumber 

       FETCH NEXT FROM updateSOP INTO @sopNumber 
     END 
     CLOSE updateSOP DEALLOCATE updateSOP 

     -- select rtrim(sopnumbe) as 'BackOrderNo' from #movedBO2 

     -- reconcile batch headers 

     set nocount on 

     DECLARE c_sop CURSOR FOR 
     SELECT rtrim(BACHNUMB) FROM SY00500 WHERE (SERIES = 3) AND (BCHSOURC = 'Sales Entry') order by 1 

     OPEN c_sop FETCH NEXT FROM c_sop INTO @bachnumb 

     WHILE @@FETCH_STATUS = 0 
     BEGIN SELECT @numtrx = ISNULL(COUNT(SOPNUMBE),0) 
     , @batchamount = ISNULL(SUM(DOCAMNT),0) 
     FROM SOP10100 WHERE BACHNUMB = @bachnumb 

     UPDATE SY00500 SET NUMOFTRX = @numtrx, BCHTOTAL = @batchamount WHERE BACHNUMB = @bachnumb 
     --Print rtrim(@bachnumb) +' ,Transactions = '+COnvert(varchar(100),@numtrx) +' ,BatchTotal = '+COnvert(varchar(100),@batchamount) 
     FETCH NEXT FROM c_sop INTO @bachnumb 
     END 
     CLOSE c_sop DEALLOCATE c_sop 
end 

SELECT RTRIM(sopnumbe) AS 'BackOrderNo' 
INTO #movedBO3 
FROM #movedBO 
UNION ALL 
SELECT RTRIM(sopnumbe) AS 'BackOrderNo' 
FROM #movedBO2 

IF EXISTS (SELECT * FROM #movedBO3) 
    SELECT * FROM #movedBO3 
ELSE 
    select 'No documents.' as 'BackOrderNo' 

DROP TABLE #movedBO 
DROP TABLE #movedBO2 
DROP TABLE #movedBO3 

這應該工作。由於我沒有你的數據,我不能肯定你沒有問題,但是這應該給你一個關於如何做到這一點的好主意。RDL(報告)不應該改變,我不認爲。

希望這會有所幫助!

+0

謝謝你的快速回應,理查茲先生!你提到我不會從#movedBO2中選擇,「稍後」。我的確在以下語句中:從#movedBO2中選擇rtrim(sopnumbe)作爲'BackOrderNo'。你能否澄清你的意思? :) –

+0

嗨理查茲先生:你說得對!我認爲,當我第一次將代碼「粘貼」到這篇文章中時,我很難過,並且意外地切斷了最後幾行。非常感謝,我對此感到抱歉!我希望明天能嘗試你的步驟。我會讓你知道它是怎麼回事。 :)約翰 –

+0

你好:我得到的代碼工作。但是,這份報告並沒有顯示兩件「碎片」。我使用了上面的兩個IIF語句。有任何想法嗎?約翰 –