找回密码
 立即注册

QQ登录

只需一步,快速开始

MatrixTian 讲师达人认证 悬赏达人认证

高级会员

141

主题

211

帖子

1380

积分

高级会员

积分
1380

微信认证勋章讲师达人元老葡萄悬赏达人

MatrixTian 讲师达人认证 悬赏达人认证
高级会员   /  发表于:2021-1-29 14:34  /   查看:3313  /  回复:0
本帖最后由 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_销售明细
image.png329133605.png
2、将语句改造为动态SQL(亦或直接将查询的变量直接替换为报表参数,注意是否可以直接替换,需要根据具体的语句来评估)
{declare @area varchar(20)
declare @payway varchar(20)
set @area='西北'
set @payway='微信'}+
{select * from Demo_销售明细 where 销售大区='} + @area + {' and 支付方式='} + @payway
image.png355509032.png

二、纯查询逻辑,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 给定参数值。获取并验证结构。
image.png915707397.png
2.2 设置报表查询,创建并保存数据集。
image.png794857787.png






0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部