2008-09-24 12 views
1

Je travaille sur un rapport existant et je voudrais le tester avec la base de données. Le problème est que le jeu de catalogue lors de la création du rapport initial n'existe plus. J'ai juste besoin de changer le paramètre de catalogue à une nouvelle base de données. Le rapport utilise un proc stocké pour ses données. Il semble que si vous essayez de retirer le proc pour le rajouter, tous les champs du rapport disparaîtront et je devrai recommencer.Modifier la propriété de catalogue d'un rapport Crystal dans VS 2005

Je travaille dans le concepteur dans Studio et j'ai juste besoin de modifier la propriété du catalogue pour obtenir un aperçu. J'ai du code qui fonctionne pour gérer correctement les choses du programme.

Répondre

0

EDIT: J'ai vu votre montage, donc je vais garder mon message original mais je dois dire .. Je n'ai jamais eu de rapport de cristal en mode design en VS donc je ne peux pas être d'une grande aide désolé.

report.SetDatabaseLogon(UserID, Password, ServerName, DatabaseName); 

Après cela, vous devez rouler à travers toutes les tables référencées dans le rapport et récursif par des sous-rapports et réinitialiser leur logoninfo à un système basé sur les rapports connectioninfo.

private void FixDatabase(ReportDocument report) 
    { 
     ConnectionInfo crystalConnectionInfo = someConnectionInfo; 

     foreach (Table table in report.Database.Tables) 
     { 
      TableLogOnInfo logOnInfo = table.LogOnInfo; 

      if (logOnInfo != null) 
      { 
       logOnInfo.ConnectionInfo = crystalConnectionInfo; 

       table.LogOnInfo.TableName = table.Name; 
       table.LogOnInfo.ConnectionInfo.UserID = someConnectionInfo.UserID; 
       table.LogOnInfo.ConnectionInfo.Password = someConnectionInfo.Password; 
       table.LogOnInfo.ConnectionInfo.DatabaseName = someConnectionInfo.DatabaseName; 
       table.LogOnInfo.ConnectionInfo.ServerName = someConnectionInfo.ServerName; 
       table.ApplyLogOnInfo(table.LogOnInfo); 

       table.Location = someConnectionInfo.DatabaseName + ".dbo." + table.Name; 
      } 
     } 

     //call this method recursively for each subreport 
     foreach (ReportObject reportObject in report.ReportDefinition.ReportObjects) 
     { 
      if (reportObject.Kind == ReportObjectKind.SubreportObject) 
      { 
       this.FixDatabase(report.OpenSubreport(((SubreportObject)reportObject).SubreportName)); 
      } 
     } 
    } 
2

Si vous avez juste besoin de le faire dans le concepteur puis clic droit dans quelques espaces et cliquez sur Database-> Définir l'emplacement de la source de données. De là, vous pouvez utiliser une connexion en cours ou ajouter une nouvelle connexion. Définissez une nouvelle connexion en utilisant le nouveau catalogue. Puis cliquez sur votre connexion actuelle dans la section supérieure et cliquez sur mettre à jour. Votre source de données va changer. Mais si vous avez besoin de le faire au moment de l'exécution, le code suivant est le meilleur.

#'SET REPORT CONNECTION INFO 
     For i = 0 To rsource.ReportDocument.DataSourceConnections.Count - 1 
      rsource.ReportDocument.DataSourceConnections(i).SetConnection(crystalServer, crystalDB, crystalUser, crystalPassword) 
     Next