点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
我有一个Powershell脚本,该脚本执行一个带有三个参数的Crystal Report(没有子报告),从SQL Server检索它的数据,并将报告写入/保存到网络共享中。
我能够成功执行powershell脚本。
另一个用户无法成功执行脚本。
该用户:
1。 能够UNC到网络共享,并且
2.能够读写网络共享
3。 能够成功地将错误写入报告获取数据的同一SQL Server(请参见下面的代码中的Try ... Catch语句)。
该用户遇到的错误如下:使用" 2"参数调用" ExportToDisk"的异常:"无法打开连接。[报告名称] {16D21D5B-3494-5B3E- B3D9-3DFF7D467GDB} .rpt"
以下是与ExportToDisk错误有关的powershell代码:
$ BeginDate =读取主机'使用格式MM/DD/YYYY输入开始日期'
$ date = $ BeginDate
$ EndDate = $ BeginDate
$ BeginDate = $ BeginDate +" 02:00:00"
$ EndDate = $ EndDate +" 01:59:59"
$ EndDate =([datetime] $ EndDate).AddDays(1)#获取日期时间戳以YYYYMMDD_YYYYMMDD_HHMMSS的形式附加到文件名
$ CurrentDate =获取日期
$ CurrentDate = $ CurrentDate.ToString(" yyyyMMdd")
$ date = $ date.Replace("/","")
$ time =获取日期-格式HH:mm:ss
$ time = $ time.Replace(":","")
$ datetime = $ date +" _" + $ CurrentDate +" _" + $ time #YYYYMMDD_YYYYMMDD_HHMMSS
[字符串] $ UserName = $ env:UserName
$ Property =" SiteName"
$ SqlConnection =新对象System.Data.SqlClient.SqlConnection
$ SqlConnection.ConnectionString ="服务器=服务器名称;数据库=报告;集成安全性=真" $ SqlConnection.Open()
$ SqlCmd =新对象System.Data.SqlClient.SqlCommand
$ SqlCmd.Connection = $ SqlConnection
[reflection.assembly] :: LoadWithPartialName('CrystalDecisions.Shared')| 空出[reflection.assembly] :: LoadWithPartialName('CrystalDecisions.CrystalReports.Engine')| 空空
$ report =新对象CrystalDecisions.CrystalReports.Engine.ReportDocument
[string] $ LocalReportPath =" C:\ Users \ $ UserName \ Documents \ CrystalReports \ [报告名称] .rpt"
$ ReportPath =" S:\ Reporting \ SiteName \"#这用于保存到SQL表中以进行历史记录或发生错误。 $ FileLoc =" \\ ServerName \ Reporting \ SiteName \"#这是保存到网络服务器的路径,等同于ServerName上的S驱动器。
$ ReportNameLive =" TableGames_XX_" + $ datetime +" .pdf"
$ FileName = $ FileLoc + $ ReportNameLive
$ ReportFullPath = $ ReportPath + $ ReportNameLive
$ report.SetParameterValue(" @ Property",$ Property)
$ report.SetParameterValue(" @ BeginDate",$ BeginDate)
$ report.SetParameterValue(" @ EndDate",$ EndDate)
$ SqlCmd.CommandText =" INSERT dbo.ReportTracker(UserName,ReportNameLive,[FileName],ReportFullPath,BeginDateParam,EndDateParam)VALUES('$ UserName','$ ReportNameLive','$ FileName','$ ReportFullPath', '$ BeginDate','$ EndDate')"
尝试{
$ report.ExportToDisk(" PortableDocFormat",$ FileName)
$ SqlCmd.ExecuteNonQuery()| 空空
写主机"成功创建" $ ReportNameLive -ForegroundColor绿色}
抓住{
$ ErrorMessage =" [XX]" + $ _。Exception.Message
写主机-ForegroundColor红色$ ErrorMessage
$ SqlCmd.CommandText =" INSERT dbo.ReportErrorTracker(UserName,ReportNameLive,[FileName],ReportFullPath,BeginDateParam,EndDateParam,ErrorMessage)VALUES('$ UserName','$ ReportNameLive','$ FileName','$ ReportFullPath ','$ BeginDate','$ EndDate','$ ErrorMessage')"
$ SqlCmd.ExecuteNonQuery()| 空空
$ SqlConnection.Close()
$ report.close()
出口1}
如果您使用的是ODBC连接,此其他用户是否具有与您配置的相同的连接? 我的意思是说,连接不仅以相同的名称存在,而且与计算机上配置的"位-位"(32或64)相同?
此外,错误提示 仅向程序提供了两个参数,但是您指出它需要三个参数。 我会验证其他用户是否正在正确运行它。
-Dell
感谢戴尔。 我将检查ODBC的"位"。 按照您的陈述:"错误表明仅向程序提供了两个参数,但您表明它需要三个参数"
我可能没有弄清楚,报告后面的存储过程需要三个参数,但是错误出在ExportToDisk上,而ExportToDisk需要两个参数。 在调用之前执行Write-Host时,存储过程和ExportToDisk都显示参数有效且不丢失。 这意味着,ExportToDisk执行不是参数问题。 因此,我将研究ODBC的"位"。
谢谢。
我仍然遇到相同的ExportToDisk错误。 ODBC位是相同的。 我可以执行某种类型的简单测试来确定这种导出到磁盘的连接错误的原因吗?
嗨罗伯特,
在Crystal Reports中打开报表并转到 到文件菜单。 如果在"将数据与报表一起保存"旁边有一个复选框,请将其删除。 保存报告并尝试在您的帐户下运行。
我希望它对您来说失败。 我之所以这样说,是因为很长一段时间以来,Crystal Save Data with Report一直是一个有趣的难题。 该选项的作用是保存自上次在Crystal中运行报表以来的结果集的副本。 因此,它实际上并没有登录数据库以获取数据,它已经存在于RPT文件中。 因此它将忽略您的LogonInfo,而仅使用报表中存储的数据。
现在,您已将其关闭,它应该始终尝试登录数据库,从而使用不正确的凭据失败。 用正确的密码设置它,然后用手指交叉。 如果有效,那么您会知道为什么我讨厌使用报表保存数据。 您可以在"设置"中关闭该选项。
祝你好运,
Brian
感谢Brian。 我试图了解正在发生的事情,您可能会带我朝正确的方向前进。 但是事情仍然不是我所理解的。
由于(如我的原始帖子所述),我能够成功执行powershell脚本。 因此,根据您的建议,"报告需要使用LogonServer或LogonInfo自行连接到数据库。" ,我在脚本中添加了以下报告连接信息(就在$ report之前)。 加载,$ report.SetParameterValue和$ report.ExportToDisk函数),目的是输入错误的密码,并且脚本和报告都像以前一样成功执行。
foreach($ report.Database.Tables中的$ Table){
$ table
$ tli = $ Table.LogonInfo
$ li = $ tli.ConnectionInfo
写主机"位置:$($ table.location)"
$ li.ServerName =" MyServer"
$ li.DatabaseName =" MyDB"
$ li.UserID =" MyUserName"
$ li.Password ="密码错误"
$ Table.ApplyLogOnInfo($ tli)
$ table.location
}
所以,我想知道:为什么使用错误的密码仍然可以为我成功执行报告? 我希望它不要使用错误的密码,从而可以确保EXPORTTODISK问题与您有关建立LogonInfo凭据的建议有关。
Robert,您好,
I 只是注意到您的SQL连接的IntegratedSecurity为true。 在这种情况下,您传递给报告的密码将被忽略。
如果您的SQL Server未使用集成安全性,则必须传递用户名和密码。
https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/sql/authentication-in-sql-server
请告诉我这是否有意义。
谢谢,
Brian
一周热门 更多>