求助:又一个水晶报表“加载报表失败”问题

alang_ping 2009-12-24 02:57:27
vs2005(vb)+cr10.2,开发调式都正常,正式应用后预览报表也没问题,但是点击“导出、打印”经常会报错“加载报表失败”;后来发现在报表预览时会在系统临时文件夹中产生四个临时文件:3个*.tmp,一个类似“报表文件名{xxxxx-xxxx-xxxxx-xxxxx-xxxxx}.rpt”报表文件,奇怪的问题是即使报表打开着不做任何动作,这四个文件在70秒后会自动删除,删除之后在点报表上的“导出、打印”就出错了。不知何故???

...全文
1025 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
BigMouth• 2011-05-06
  • 打赏
  • 举报
回复
来吼吼
阿泰 2009-12-25
  • 打赏
  • 举报
回复
参考本文,第2点。注意仔细看下,主要是原因和思路

http://topic.csdn.net/u/20090713/18/6e14bf28-1979-4ade-9c60-aaf09284553d.html
alang_ping 2009-12-25
  • 打赏
  • 举报
回复
泰兄,我用的是vb.net敬请指教,删除部分应该对这个问题没有影响.
alang_ping 2009-12-25
  • 打赏
  • 举报
回复
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim txtSQL As String
Try
If Not IsPostBack Then
txtSQL = "SELECT SRP_GROUP,SRP_NAME,SRP_CODE FROM TBSYSREPORT WHERE SRP_ACTIVE=1 AND SRP_GROUP='报表' UNION SELECT SRP_GROUP,SRP_NAME,SRP_CODE FROM TBSYSREPORT WHERE SRP_ACTIVE=1 AND SRP_CODE IN(SELECT RPT_CODE FROM RPTUSER WHERE USR_CODE='" & User.Identity.Name.ToUpper & "') ORDER BY SRP_GROUP,SRP_CODE"
InitTree(mf.rsRead("WebRpt", txtSQL)) '初始化报表列表
trvRptList.ExpandAll()
Select1.Visible = False

ViewState.Add("TYPE", "") '预览控件:水晶报表CRV,网格GridView1
ViewState.Add("SQL", "") '数据源SQL语句
ViewState.Add("WHERE", "") '数据源SQL语句
ViewState.Add("CONN", "") '数据源连接字符串
ViewState.Add("PATH", "") '报表模板存放路径
ViewState.Add("sSQL", "") '数据源SQL语句
End If
If ViewState("TYPE").ToString = "CRV" Then ConfigureCrystalReports()
Catch ex As Exception
Response.Write(Err.Description)
End Try
End Sub

'初始化报表列表
Private Function InitTree(ByVal rs As SqlClient.SqlDataReader) As Boolean
'内容太多了,将这部分删掉了
End Function


Protected Sub trvRptList_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles trvRptList.SelectedNodeChanged
Dim sSQL As String
Dim rs As SqlClient.SqlDataReader

Try
crvReport.Dispose()
With trvRptList
If .SelectedValue <> "no" Then
lblList.Visible = False
lblParam.Visible = False
lblDate.Visible = False
txtParam.Visible = False
txtFrmDate.Visible = False
txtToDate.Visible = False
GridView1.Visible = False
crvReport.Visible = False

ViewState("TYPE") = "GDV"
Select1.Visible = False

lblRptTitle.Text = .SelectedNode.Text
'加载选中的报表信息
sSQL = "SELECT SRP_SQL,DBF_NAME,SRP_FILENAME,SRP_REPORTFILE,SRP_TYPE,SRP_WHERE FROM TBSYSREPORT WHERE SRP_CODE='" & .SelectedValue & "'"
rs = mf.rsRead("WebRpt", sSQL)
If rs.HasRows Then
rs.Read()
If rs.GetBoolean(4) Then ViewState("TYPE") = "CRV"
ViewState("SQL") = rs.GetString(0)
ViewState("WHERE") = rs.GetString(5)
ViewState("CONN") = rs.GetString(1)
If rs.GetBoolean(4) Then
'在服务器上使用绝对路径,可能对无法加载的错误有效
ViewState("PATH") = Request.PhysicalApplicationPath & "WebRpt\Reports\" & rs.GetString(2)
myRpt.ShowReport(rs, 3, ViewState("PATH")) '从数据库中下载报表模板到目录ViewState("PATH")
End If
rs.Close()
'加载报表筛选条件
sSQL = "SELECT * FROM TBSYSREPORTDT WHERE SRP_CODE='" & .SelectedValue & "' ORDER BY SRD_SEQNO"
rs = mf.rsRead("WebRpt", sSQL)
While rs.Read
If rs.GetString(7) = "TEXT-VALUE" Then
lblParam.Text = rs.GetString(4) '显示的字段名
lblParam.ToolTip = rs.GetString(2) & "." & rs.GetString(3) '实际字段名
lblParam.Enabled = Not rs.GetBoolean(9) '是否必选条件
lblParam.Visible = True
txtParam.Value = ""
txtParam.Visible = True
End If
If rs.GetString(7) = "TEXT-LIST" Then
lblList.Text = rs.GetString(4)
lblList.ToolTip = rs.GetString(2) & "." & rs.GetString(3)
lblList.Enabled = Not rs.GetBoolean(9)
lblList.Visible = True
Dim s() As String
Dim s1 As Object

Select1.Items.Clear()
Select1.Items.Add("")
s = Split(rs.GetString(5), ",")
For Each s1 In s
Select1.Items.Add(s1.ToString)
Next
Select1.Visible = True

End If
If rs.GetString(7) = "TIME-VALUE" Then
lblDate.Text = rs.GetString(4)
lblDate.ToolTip = rs.GetString(2) & "." & rs.GetString(3)
lblDate.Enabled = Not rs.GetBoolean(9)
lblDate.Visible = True
txtFrmDate.Visible = True
txtFrmDate.Value = ""
End If
If rs.GetString(7) = "TIME-RANGE" Then
lblDate.Text = rs.GetString(4)
lblDate.ToolTip = rs.GetString(2) & "." & rs.GetString(3)
lblDate.Enabled = Not rs.GetBoolean(9)
lblDate.Visible = True
txtFrmDate.Visible = True
txtToDate.Visible = True
txtFrmDate.Value = ""
txtToDate.Value = ""
End If
End While
rs.Close()
btnView.Enabled = True
btnExt.Enabled = True
End If
End If

End With
Catch ex As Exception

End Try
End Sub

'报表或者GridView1预览
Protected Sub btnView_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnView.Click
Try
If Not initSQL() Then
Exit Sub
End If
If ViewState("TYPE") = "GDV" Then
'用GridView1预览
crvReport.Dispose()
GridView1.DataSource = mf.rsDataSet(ViewState("CONN"), ViewState("sSQL"))
GridView1.DataBind()
GridView1.Visible = True

Else
'用水晶报表预览
GridView1.Dispose()
crsReport.ReportDocument.FileName = ViewState("PATH")
If ViewState("CONN").ToString = "DEFAULT" Then
'需要用户登录
crvReport.EnableDatabaseLogonPrompt = True
crsReport.ReportDocument.DataDefinition.RecordSelectionFormula = ViewState("sSQL")
Else
'无需用户登录
crsReport.ReportDocument.SetDataSource(mf.rsDataSet(ViewState("CONN"), ViewState("sSQL")).Tables(0))
crvReport.EnableDatabaseLogonPrompt = False
End If

ConfigureCrystalReports()
End If
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub

Private Sub ConfigureCrystalReports()
crvReport.ReportSource = crsReport
crvReport.Visible = True
End Sub

'GridView1翻页
Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging
'内容过长,将这部分删除
End Sub

'根据用户选择条件,产生数据源的SQL语句
Protected Function initSQL() As Boolean
'内容过长,将这部分删除
End Function

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
'内容过长,将这部分删除
End Sub

Protected Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Unload
crvReport.Dispose()
crsReport.Dispose()
End Sub

End Class
阿泰 2009-12-25
  • 打赏
  • 举报
回复
把这个页面后的整个cs贴出来看看。

打印、导出是重新触发页面事件的,也就是说,按下去按钮的时候,已经触发了Unload,导致tmp文件被销毁
load rpt的代码将代码放在Page_Load里,这样才能保证打印、导出正常进行。
雷肿么了 2009-12-25
  • 打赏
  • 举报
回复
踩踩..
alang_ping 2009-12-25
  • 打赏
  • 举报
回复
5楼6楼的,可以看一下是不是报表模板文件的访问权限问题,比如我曾用FileOpen方式把从数据库中的模板保存在目录中,其中有个OpenShare(只读、共享等等)的参数好像有点关系。
kangbinoopp 2009-12-25
  • 打赏
  • 举报
回复
唉~~ 我被这个水晶报表搞郁闷了~~ 烦死. 我的程序点导出、打印”经常会报错“拒绝访问"~~~~~

帮你顶下~~~
zhangzhaohui1980 2009-12-25
  • 打赏
  • 举报
回复
帮顶一下 也遇到过类似的问题。 比如显示报表的页面刷新多次以后 出现“加载报表失败”的问题。
alang_ping 2009-12-25
  • 打赏
  • 举报
回复
还是贴一下代码吧:
'crsReport、crsReport分别是vs2005自带的部件CrystalReportViewer和CrystalReportSource
crsReport.ReportDocument.FileName = ViewState("PATH")'报表模板路径和文件名
crsReport.ReportDocument.SetDataSource(mf.rsDataSet(ViewState("CONN"), ViewState("sSQL")).Tables(0))'mf.rsDataSet是数据源DataSet
crvReport.ReportSource = crsReport
crvReport.Visible = True

很简单的代码,在Page_unload里还有:
crvReport.Dispose()
crsReport.Dispose()
alang_ping 2009-12-25
  • 打赏
  • 举报
回复
我用的是vs2005自带的水晶报表,不会是试用版的原故吧?
alang_ping 2009-12-25
  • 打赏
  • 举报
回复
不是Winform,是Web。我在想是不是水晶报表本身有时间上的限制,所以找到注册表HKEY_LOCAL_MACHINE-SOFTWARE-Crystal Decisions-10.2-Report Application
Server-InprocServer下有一项PrintJobsCacheLifeTime(min)值为20,但这是20分钟啊,而实际上70秒它就被卸了。
alang_ping 2009-12-25
  • 打赏
  • 举报
回复
参考泰兄的建议,可能原因是page_load中没有重新加载报表,crvReport.ReportSource = crsReport 是没有意义的,需要重新设置模板和数据源,----好像解决了,验证两天再结贴.多谢泰兄!
阿泰 2009-12-24
  • 打赏
  • 举报
回复
按理说tmp文件只会爱reportdocument对象释放后才删除掉。
你的是Winform程序吗

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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