本帖最后由 Bella.Yuan 于 2023-1-5 18:53 编辑
在设计报表时,对于复杂的数据查询逻辑,需要使用sql。很多时候,业务需要按条件来查询数据,此时就需要在sql中使用变量,局部变量用@标识。
在Wyn Enterprise中,报表的参数也是用@来标识。这样,就会出现sql变量和报表参数冲突的问题,此时,设计数据集时就需要特殊处理。
具体要分以下几种情况:
一、纯查询逻辑,sql变量作用时查询参数,查询有直接的返回表结构。
例如:
declare @area varchar(20)
declare @payway varchar(20)
set @area='西北'
set @payway='微信'
select * from Demo_销售明细 where 销售大区=@area and 支付方式=@payway
此类情况下,可以利用去除变量的完整语句,先创建并预览数据集,以获取结果结构。
1、获取结果结构
select * from Demo_销售明细
2、将语句改造为动态SQL(亦或直接将查询的变量直接替换为报表参数,注意是否可以直接替换,需要根据具体的语句来评估)
{declare @area varchar(20)
declare @payway varchar(20)
set @area='西北'
set @payway='微信'}+
{select * from Demo_销售明细 where 销售大区='} + @area + {' and 支付方式='} + @payway
二、纯查询逻辑,sql变量作为查询变量,在查询体内,被临时表、游标、动态sql等使用,不能直接返回查询结果结构。
例如:
select distinct 一级项目,一级行号,项目,行号,取值类型,取值公式,借贷 into #jichu2
from XHBI.dbo.利润表公式 order by 一级行号
update #jichu2 set 取值公式=REPLACE(取值公式,',',''',''')
select
t.iyear as iyear,t.iperiod as iperiod,
case when left(t.ccode,4) in ('6701') then left(t.ccode,6) else left(t.ccode,4) end as ccode,--t1.ccode_name as ccodename,
sum(md) as localjffs,sum(mc) as localdffs
into #vouch
from GL_accvouch t
left join code t1 on t.ccode=t1.ccode and t.iyear=t1.iyear
left join Department as c on t.cdept_id=c.cDepCode
left join Person as d on t.cperson_id=d.cPersonCode
left join Vendor as e on t.csup_id=e.cVenCode
left join Customer as f on t.ccus_id=f.cCusCode
left join foreigncurrency as h on t.cexch_name=h.cexch_name
left join fitem as g on t.citem_class =g.citem_class
where t.iyear=@年度 and t.iperiod =@月份
group by t.iyear ,t.iperiod ,
left(t.ccode,4),left(t.ccode,6) --,t1.ccode_name
--select * from #vouch where ccode like '6701%' or ccode like '5403%' drop table #vouch
--建表
CREATE TABLE #tempyypz(
fproname [varchar](255) NULL,
fprono [int] NULL,
proname [varchar](255) NULL,
prono [int] NULL,
dcsides [varchar](255) NULL,
iyear [int] NULL,
iperiod [int] NULL,
ccode [varchar](255) NULL,
--ccodename [varchar](255) NULL,
localjffs [decimal](38, 6) NULL,
localdffs [decimal](38, 6) NULL
) ON [PRIMARY]
begin
--声明变量
declare @fproname varchar(255)
declare @fprono int
declare @proname varchar(255)
declare @prono int
declare @formula varchar(255)
declare @dcsides varchar(255)
declare order_cursor cursor --声明游标
for (select 一级项目,一级行号,项目,行号,取值公式,借贷 from #jichu2)
open order_cursor
fetch next from order_cursor into @fproname,@fprono,@proname,@prono,@formula,@dcsides
while @@FETCH_STATUS = 0
begin
exec(' --向表中插入数据
insert into #tempyypz
select
'''+@fproname+ ''' as fproname,
'''+@fprono+ ''' as fprono,
'''+@proname+ ''' as proname,
'''+@prono+ ''' as prono,
'''+@dcsides+ ''' as dcsides,
iyear ,
iperiod ,
ccode ,
--ccodename ,
localjffs ,
localdffs
from #vouch
where left(ccode,4) in ('''+ @formula+ ''') or left(ccode,6) in ('''+ @formula+ ''')
')
fetch next from order_cursor into @fproname,@fprono,@proname,@prono,@formula,@dcsides
end
close order_cursor --关闭游标
deallocate order_cursor
select * from #tempyypz
drop table #jichu2
drop table #tempyypz
drop table #vouch
由于该种情况无法直接返回查询结果,因此无法像第一种情况一样,提前获取结构。此时,需要对查询逻辑进行改造。
复杂查询中含有变量,建议封装为存储过程,然后在数据集设计时调用存储过程。
1、将示例改造为存储过程。
USE [UFDATA_999_2014]
GO
/****** Object: StoredProcedure [dbo].[p_test] Script Date: 01/29/2021 14:08:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[p_test]
@年度 varchar(4),
@月份 varchar(2)
asbegin
/*****查询逻辑******/
end
2、调用存储过程创建数据集。
2.1 给定参数值。获取并验证结构。
2.2 设置报表查询,创建并保存数据集。
|
|