如何用存储过程生成的交叉查询结果做一动态报表?(VB+SQL)

coolerr 2002-01-26 01:38:58
下面存储过程怎样做一动态报表?
CREATE procedure MyResult
@strTabName as varchar(50) = 'Q_MyResult', --此处放表名
@strCol as varchar(50) = 'SubjectName', --表头分组依据字段
@strGroup as varchar(50) = 'StudentID',--分组字段
@strNumber as varchar(50) = 'MyResult', --被统计的字段
@strSum as varchar(10) = 'Sum' --运算方式
AS

DECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ')
begin
SET nocount ON
SET @strsql ='select ' + @strGroup

OPEN corss_cursor
while (0=0)
BEGIN
FETCH NEXT FROM corss_cursor
INTO @strTmpCol
if (@@fetch_status<>0) break
SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS ' + @strTmpCol
END
SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup

EXECUTE(@strsql)

IF @@error <>0 RETURN @@error
CLOSE corss_cursor
DEALLOCATE corss_cursor RETURN 0

end

谢谢!!
...全文
194 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolerr 2002-01-27
  • 打赏
  • 举报
回复
fuxc(Michael),谢谢你,万分感谢!
我用了tdbgrid1,这个问题现在基本上解决了。
谢谢!
coolerr 2002-01-26
  • 打赏
  • 举报
回复
如果一定要生成报表打印出来呢?
fuxc 2002-01-26
  • 打赏
  • 举报
回复
sorry !
for each ofield in record.fields
改为
for each ofield in recordset.fields
fuxc 2002-01-26
  • 打赏
  • 举报
回复
首先,这样生成的报表不适合防灾textbox里一条一条地浏览,应为它是只读的,放到grid中比较好,无论是datagrid,还是其他网格,只要不在编程的时候设置固定列,把数据源绑定以后就可以根据实际的列数来显示。
如果一定要用textbox,参考以下的方法:
首先,再form上放一个textbox假设就叫text1,设置index属性为0,使它变成一个控件数组。
通过以下语句遍历recordset的所有字段,来动态添加text1的成员

dim oField as adodb.field
dim intIndex as integer
for each ofield in record.fields
intIndex = text1.ubound + 1
load text1(intIndex)
text1.(intindex).datafield = ofield.name
set text1(intindex).recordset = recordset
text1(intindex).left = ..... '定义位置,根据需要来
text1(intindex).top = ..... '实际还要加label,方法同textbox
text1.visible = true
next ofield

随手写写,主要思想就是这样,你自己在验证一下吧。
coolerr 2002-01-26
  • 打赏
  • 举报
回复
fuxc(Michael) ,你好!谢谢你!
由于 SubjectName 的数目不定,所以我不知道怎样控制报表中 TXT 的数目及位置,而且这完全由用户来决定的。能再帮一次吗?
HR0019 2002-01-26
  • 打赏
  • 举报
回复
太深奥了,没看懂!
fuxc 2002-01-26
  • 打赏
  • 举报
回复
我推荐你使用true dbgrid,用法根datagrid差不多,但功能更强,可以直接打印
tdbgrid1.printinfo.pringdata 打印
tdbgrid1.printinfo.pringview 预览
tdbgrid1.printinfo.pagesetup 打印设置
下载:
http://www.vckbase.com/ocx/ocx_report/index.html
fuxc 2002-01-26
  • 打赏
  • 举报
回复
总之,一句话,平时你怎么用select的,那么就把存储过程的名字(MyResult)代进去就行了
fuxc 2002-01-26
  • 打赏
  • 举报
回复
存储过程都已经做好了,其实使用是非常简单的啦!
首先,我做他的时候就考虑是个通用的,你不必要每个报表都修改存储过程。
调用方法:
MyResult @strTabName = 'Q_MyResult', @strCol = 'SubjectName', @strGroup = 'StudentID', @strNumber = 'MyResult', @strSum = 'Sum'

但引号内的都是变量,上次帖子里讲的传参数就是这个意思,存储过程中可以把='...'去掉,我设默认值是为了方便调试验证

至于在vb里调用,就很简单了:

如果你用ado控件,在属性里首先设定连接字串,选择正确的数据库,连接服务器成功后,在记录源里选4 - adCmdStoredProc,就能选择到所创建的存储过程了,假如你按照我上面说的该掉了存储过程,需要传参的话,则选8 - adCmdUnknown,输入上面所书带参数的命令,然后就可以设置绑定了

如果你用数据环境,那就先建好连接,在增加命令,选择存储过程就行了。

如果你用代码,则在recordset的open语句直接运行上面的命令就行了,也可以用command对象的Execut方法。
fuxc 2002-01-26
  • 打赏
  • 举报
回复
嘿嘿!我的代码。

807

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧