2017-04-15 274 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语句。有任何想法吗?约翰 –