【问题标题】:Delphi 5 & Crystal XI Rel. 2 (RDC) how to?德尔福 5 和水晶 XI 相对。 2(RDC)怎么做?
【发布时间】:2020-01-13 15:35:14
【问题描述】:

我正在尝试使用 class from JosephStyons,但在应设置“用户 ID”的行上确实收到“无效索引”错误。

FRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := edUserName.Text;

这是我的环境:

WinXP Sp3、Crystal Reports Developer XI Rel.2 SP4、Delphi 5 更新包 1

非常感谢任何帮助或想法!

谢谢, 莱因哈德

【问题讨论】:

  • 你的目标是什么数据库引擎?

标签: delphi crystal-reports


【解决方案1】:

您的值for [i] 可能是罪魁祸首...我记不清了,但我相信第一张桌子将是Table[1],而不是预期的Table[0]

我改变了我的循环使用:

CrTables := CrDatabase.Tables;
for crTableObj in crTables do

您可以尝试使用如上所示的 for 循环或从 1 而不是 0 开始逐步遍历表格。

我希望这会有所帮助。

【讨论】:

  • 感谢您的提示 - 将循环更改为:for i := 1 to FRpt1.Database.Tables.Count 但现在我遇到了访问冲突
【解决方案2】:

在该行上放置一个断点并使用 Evaluate/Modify。
如果您尝试无效的内容,它将返回错误。

  1. 检查 FRpt.Database.Tables[i] 并查看它是否适用于您认为的 i 的最小值和最大值。
    如果Tables 是一个数组,避免这种情况的一种方法是使用...Low(Tables) to High(Tables)

  2. 如果您的表没问题,请检查 FRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] 并查看它是否有效。
    可能是 Item getter 不喜欢“用户 ID”中嵌入的空间。有些产品需要用“[User ID]”等特殊字符括起来,其他的需要用“User_ID”等下划线替换

【讨论】:

  • tanks for you input add 1: 只有一个表对象,它的索引从 1 而不是 0 开始,所以“无效索引”问题已经消失。 add2:如您所见,['User ID'] 已经是一个带单引号的字符串
【解决方案3】:

你是否也设置了密码、服务器名和数据库名?

过程 TReports.LogonToDBTables(cReport: CrystalDecisions.CrystalReports.Engine.ReportDocument; 连接信息:连接信息); 变量 CrDataBase:数据库; CrTables:表格; CrTableObj:TObject; CrTable:表格; CrTableLogonInfo:TableLogonInfo; iSubReportIndex:smallint; 开始 CrDataBase := CReport.Database; CrTables := CrDatabase.Tables; cReport.DataSourceConnections[0].IntegratedSecurity := False; 对于 crTables 中的 crTableObj 执行 开始 crTable := CrystalDecisions.CrystalReports.Engine.Table(crTableObj); crTableLogonInfo := crTable.LogOnInfo; crTableLogonInfo.ConnectionInfo := ConnInfo; crTable.ApplyLogOnInfo(crTableLogonInfo); 结尾; 结尾; 函数 TReports.GetConnectionInfo():连接信息; 变量 cTemp:连接信息; 开始 cTemp := ConnectionInfo.Create(); cTemp.AllowCustomConnection := True; cTemp.ServerName := GetServerName(); cTemp.DatabaseName := GetDBName(); cTemp.UserID := GetDBUserID(); cTemp.Password := GetDBPassword(); 结果:= cTemp; 结尾;

【讨论】:

  • 感谢您的输入:至于登录,我想我有一个可行的解决方案。我面临的下一个问题是,如果我设置一个作为存储过程参数的参数(显示为 parametername = '@P_'),AddCurrentValue 函数不会设置当前值,而是设置 DefaultValue。 Crystal-businessobjects-sap 怎么会因为这么糟糕的软件而获得报酬??
  • 如果你有时间请看stackoverflow.com/questions/1073636/…thx
  • 您是否在尝试设置参数值之前调用 ClearCurrentValueAndRange? CRReport.ParameterFields.GetItemByName('ExemplarFee', '').ClearCurrentValueAndRange; CRReport.ParameterFields.GetItemByName('ExemplarFee', '').AddCurrentValue (misVars.Reports.cExemplarFeeAmount);
  • 是的,因为我已经使用 CR XI 保存了报表,所以我可以使用 AddCurrentValue 但使用 CrystalReportsActiveXViewer 的报表预览不显示任何数据。我还尝试从报告对象中读取 SQLQueryString,但我看到的是所有存储过程参数都是“NULL”。我会再给它几天时间,但如果直到下周中旬我才能弄清楚,我会发疯并向我的经理推荐其他报告解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多