求不能将存储过程做数据源的解决方法!

winstar66 2004-10-23 08:36:19
求解决方法:后台已可以用存储过程解决,但直接用该存储过程做数据源,创建数据窗口失败!
请教有没有解决方案,(注:下面的例子数据比较简单,用交叉表也能生成最后的报表,
实际数据比例子数据复杂,不能用交叉表生成结果,因而需要先在sql后台处理)

表结构如下:
销售表
销售日期 柜台号 金额
2004-10-10 aaa 20000
2004-10-10 bbb 35000
2004-10-10 ccc 40000
2004-10-11 aaa 38000
2004-10-11 bbb 46000
2004-10-11 ccc 50000
柜台表
编号 名称
aaa 食品柜
bbb 服装柜
ccc 家电柜
ddd 文化柜
... ......
用户输入柜台编号及销售起止日期构建成下面的表
如上输入柜台编号为aaa,bbb,ccc销售日期起止日期2004-10-10,2004-10-11
结果表如下:
销售日期 食品柜 服装柜 家电柜 合计金额
2004-10-10 20000 35000 40000 95000
2004-10-11 38000 46000 50000 134000

后台解决方法:
--用存储过程

--示例

--示例数据
create table 销售表(销售日期 datetime,柜台号 varchar(10),金额 int)
insert 销售表 select '2004-10-10','aaa',20000
union all select '2004-10-10','bbb',35000
union all select '2004-10-10','ccc',40000
union all select '2004-10-11','aaa',38000
union all select '2004-10-11','bbb',46000
union all select '2004-10-11','ccc',50000

create table 柜台表(编号 varchar(10),名称 varchar(10))
insert 柜台表 select 'aaa','食品柜'
union all select 'bbb','服装柜'
union all select 'ccc','家电柜'
union all select 'ddd','文化柜'
go

--查询的存储过程
create proc p_qry
@编号 varchar(8000),
@开始日期 datetime,
@结束日期 datetime
as
declare @s varchar(8000),@tj varchar(100)
select @s=''
,@tj=' where 销售日期 between '''
+convert(char(10),@开始日期,120)
+''' and '''
+convert(char(10),@结束日期,120)
+''''
select @s=@s+',['+名称+']=sum(case 柜台号 when '''+编号+''' then 金额 else 0 end)'
from 柜台表 where charindex(','+编号+',',','+@编号+',')>0
exec('
select 销售日期=convert(char(10),销售日期,120)'+@s+'
from 销售表 '+@tj+'
group by convert(char(10),销售日期,120)')
go

--调用
exec p_qry 'aaa,bbb,ccc','2004-10-10','2004-10-11'
go

--删除测试
drop table 销售表,柜台表
drop proc p_qry

/*--测试结果

销售日期 食品柜 服装柜 家电柜
---------- ----------- ----------- -----------
2004-10-10 20000 35000 40000
2004-10-11 38000 46000 50000

(所影响的行数为 2 行)
--*/
...全文
134 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
handycyw 2004-10-25
  • 打赏
  • 举报
回复
创建好datawindow,甚至可以先构建sql(select)语句,用syntaxfromsql()取得dw语法,再creat():(dw.creat(sqlca,ls_sql,style(type=grid),ls_err)),声明datastore lds_1,lds_1.create(ls_sql);或者lds_1.dataobject='';lds_1.settransobject(sqlca),lds_1.retrieve();
其它的操作与datawindow类似
winstar66 2004-10-24
  • 打赏
  • 举报
回复
可能是因为字段不固定的原因,用另一存储过程生成结果也出问题,因为无法提前定义#temp1的表结构
create proc p_p1
as
insert into #temp1
exec p_qry 'aaa,bbb,ccc','2004-10-10','2004-10-11'
select * from #temp1

服务器: 消息 208,级别 16,状态 1,过程 p_p1,行 3
对象名 '#temp1' 无效。
winstar66 2004-10-24
  • 打赏
  • 举报
回复
楼上的朋友,可以说得清楚点吗?用datastore,数据源如何定义?
handycyw 2004-10-24
  • 打赏
  • 举报
回复
我觉得像这种东西可以不要使用存储过程,使用两个datastore来取数据,将取得数据填入构造好的datawindow就可以了。你创建的存储过程好像也是死的,并不灵活,这样的存储过程我个人以为还是少建的好。
winstar66 2004-10-24
  • 打赏
  • 举报
回复
用存储过程应该是没问题的,当然,你可以将结果集插入到临时表,然后在数据窗口中直接写数据窗口的源,比如select * from ##tb_temp就可以了,前提是存储过程已经执行。
-------------------------------------------------------------------------
或者说,数据窗口的数据源是不是支持表结构不固定的临时表,由于传入的参数不同,
select * from ##tb_temp的表结构是不能提前建立,这样是否可以建立数据窗口并检索数据?
winstar66 2004-10-24
  • 打赏
  • 举报
回复
基于1楼的存储过程,再建3楼的存储过程是成功的,
但在查询分析器执行出现3楼所描述的错误
估计原因是没有定义#temp1的表结构,问题是存储过程p_qry因输入参数不同,而返回的结果集的字段是不固定的,没有办法先定义#temp1的表结构,
如将insert into #temp1改为select into #temp1将无法建立存储过程p_p1
luotitan 2004-10-24
  • 打赏
  • 举报
回复
INTO 子句
创建新表并将结果行从查询插入新表中。

luotitan 2004-10-24
  • 打赏
  • 举报
回复
用select into #temp1
luotitan 2004-10-23
  • 打赏
  • 举报
回复
用存储过程应该是没问题的,当然,你可以将结果集插入到临时表,然后在数据窗口中直接写数据窗口的源,比如select * from ##tb_temp就可以了,前提是存储过程已经执行。
发帖
DataWindow

603

社区成员

PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
帖子事件
创建了帖子
2004-10-23 08:36
社区公告
暂无公告