我正在尝试使用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 Update Pack 1
非常感谢任何帮助或想法!
THX, 莱因哈德
答案 0 :(得分:0)
你[i]的价值可能是罪魁祸首...我不记得肯定但是我相信第一张表将是Table [1]而不是Table [0]。我改变了我的循环使用:
CrTables:= CrDatabase.Tables;
对于crTables中的crTableObj
您可以尝试使用如上所示的for循环或以1而不是0开始逐步遍历表。
我希望这会有所帮助。
答案 1 :(得分:0)
在该行上设置一个断点并使用评估/修改 如果您尝试无效的操作,它将返回错误。
检查FRpt.Database.Tables[i]
并查看它是否对您认为i的最小值和最大值有效。
如果Tables
是一个数组,那么避免这种情况的一种方法是使用...Low(Tables) to High(Tables)
如果你的表格好了,检查FRpt.Database.Tables[i].ConnectionProperties.Item['User ID']
并查看它是否有效
可能是Item getter不喜欢“User ID”中嵌入的空格。某些产品需要使用“[User ID]”等特殊字符进行环绕,其他产品需要替换为“User_ID”这样的下划线
答案 2 :(得分:0)
您是否也设置了密码,服务器名称和数据库名称?
procedure TReports.LogonToDBTables(cReport: CrystalDecisions.CrystalReports.Engine.ReportDocument; ConnInfo: ConnectionInfo); var CrDataBase: Database; CrTables: Tables; CrTableObj: TObject; CrTable: Table; CrTableLogonInfo: TableLogonInfo; iSubReportIndex: smallint; begin CrDataBase := CReport.Database; CrTables := CrDatabase.Tables; cReport.DataSourceConnections[0].IntegratedSecurity := False; for crTableObj in crTables do begin crTable := CrystalDecisions.CrystalReports.Engine.Table(crTableObj); crTableLogonInfo := crTable.LogOnInfo; crTableLogonInfo.ConnectionInfo := ConnInfo; crTable.ApplyLogOnInfo(crTableLogonInfo); end; end; function TReports.GetConnectionInfo(): ConnectionInfo; var cTemp: ConnectionInfo; begin cTemp := ConnectionInfo.Create(); cTemp.AllowCustomConnection := True; cTemp.ServerName := GetServerName(); cTemp.DatabaseName := GetDBName(); cTemp.UserID := GetDBUserID(); cTemp.Password := GetDBPassword(); Result := cTemp; end;