2010-06-30 8 views
4

Puisqu'il ne semble pas y avoir moyen de charger les anciens rapports VB6 (ActiveReports) dans .Net, j'ai besoin de recréer des dizaines de rapports dans .Net. Je voudrais le faire de la manière la moins douloureuse possible.Comment remplir Crystal Reports avec SQL

En VB6, les auteurs originaux tout simplement pas quelque chose comme ça pour tous les rapports:

adoConn.ConnectionString = globalConnectionObject.ConnectionString 
adoConn.Source = ReportFunctions.GetAllUsers() 

GetAllUsers() retourne une chaîne SQL qui sélectionne un tas de champs; ces champs sont ensuite utilisés dans le rapport.

maintenant:
Comment puis-je faire quelque chose de similaire dans .Net (soit en utilisant intégré dans Crystal Reports ou le intégré "Microsoft Technology rapports")?

Je ne peux pas obtenir "Expert de base de données" pour reconnaître globalConnectionObject (un objet ADODB.Connection); et si je remplir un ensemble de données et de faire

report.SetDataSource(dataSet) 

Il me dit « Le rapport n'a pas les tables. »

Comment renseigner un rapport Crystal Reports? (la chaîne de connexion/l'emplacement des données n'est pas connu au moment de la compilation)

+0

Voulez-vous dire que la chaîne de connexion/l'emplacement des données n'est pas connu au moment de la compilation? – sgriffinusa

Répondre

2

Création connexion:

/// <summary> 
/// Sets the connection. 
/// </summary> 
public void SetConnection() 
{ 
    _connection = new SqlConnection(Settings.Default.connectionString); 
    if (_connection.State == System.Data.ConnectionState.Open) 
    { 
     _connection.Close(); 
    } 
    _connection.Open(); 
} 

/// <summary> 
/// Closes the connection. 
/// </summary> 
public void CloseConnection() 
{ 
    if (_connection.State == System.Data.ConnectionState.Open) 
    { 
     _connection.Close(); 
     _connection.Dispose(); 
    } 
} 

utilisant au-dessus de jeu de données de connexion Populate manuellement ou Ajouter un jeu de données à votre solution pour obtenir des données sans écrire des codes de connexion. Dites que vous avez ajouté Employee.XSD. Ajoutez un tableadapter dans le XSD qui vous aidera à extraire les données de la base de données, en générant automatiquement des requêtes et des datatables. Après avoir fait toutes ces choses. Créer une méthode quelque part dans votre projet,

Public DataTable GetAllEmployees() 
{ 
    Employee.EmployeeTableAdapter adapt = New Employee.EmployeeTableAdapter(); 
    DataTable dt = New DataTable(); 
    dt = adapt.GetData(); // you can also use fill based on your criteria. 
    return dt; //your datatable with data 
} 

maintenant sur votre formulaire ajouter un contrôle ReportViewer.

ReportViewer1 rpt = New ReportViewer(); 
ReportDocument rptDoc = new ReportDocument(); 
rptDoc.Load("path of rpt file"); 
rptDoc.SetDataSource(GetAllEmployees()); 
rpt.Document = rptDoc; 
rpt.Refresh(); 

Avant cela À partir de Crystal Report, ajoutez les champs de la table sur le rapport selon vos besoins.

Une autre façon d'obtenir

Crystal Reports peuvent être utilisés sur divers objets.Si vous avez un scénario pour le lier dynamiquement, voir ma réponse ci-dessous. Ensuite, vous pouvez faire une chose, ajouter un nouveau jeu de données à la solution. Créez une colonne datatable et ajoutez les colonnes requises avec le type de données approprié. N'ajoutez pas de requête ou d'adaptateur de table. Maintenant, à partir de votre code, ajoutez un fichier de classe et créez des propriétés exactement similaires aux colonnes datatable. Maintenant, définissez le datatable comme source à signaler et ajoutez sa colonne sur le rapport.

For example , if you have columns 
ID - integer 
EmpName - string 
Salary - double 
Department - string 

Créer une classe

public class Employee 
{ 
    private SqlConnection _connection; 
    public int ID {get;set;} 
    public string EmpName {get;set;} 
    public double Salary {get;set;} 
    public string Department {get;set;} 



/// <summary> 
/// Sets the connection. 
/// </summary> 
public void SetConnection() 
{ 
    //assuming connection string is placed in settings file from Project Properties. 
    _connection = new SqlConnection(Settings.Default.connectionString); 
    if (_connection.State == System.Data.ConnectionState.Open) 
    { 
     _connection.Close(); 
    } 
    _connection.Open(); 
} 

/// <summary> 
/// Closes the connection. 
/// </summary> 
public void CloseConnection() 
{ 
    if (_connection.State == System.Data.ConnectionState.Open) 
    { 
     _connection.Close(); 
     _connection.Dispose(); 
    } 
} 


    public DataTable GetEmployees() 
    { 
     DataTable dt = new DataTable("Employee"); 
     // using above connection 
     SetConnection(); 
     using(SqlCommand command = new SqlCOmmand("commandText",_connection)) 
     { 
     using(SqlDataReader reader = command.ExecuteReader()) 
     { 
       dt.Load(reader); 
     } 
     } 
     return dt; 
    } 
} 

maintenant créer une autre fonction qui va peupler la table de données créée à l'intérieur du dtataset.

public void PopulateDataTable() 
{ 
     DataTable dt = GetEmployee(); 
     Employee dsEmployee = New DataSet(); 
     dsEmployee.EmployeeDataTable dtEmp = new dsEmployee.EmployeeDataTable(); 
     dtEmp = dt; 
} 
+0

Une chose que j'ai oublié, choisissez ADO.Net Dataset comme pont entre les rapports SQL et Crystal –

0

Nous faisons quelque chose de similaire à l'aide de Crystal Reports, et cela m'incite à ne pas aimer Crystal Reports. En utilisant l'expert de base de données, j'ai créé une nouvelle connexion à la base de données et une nouvelle commande avec le SQL que je veux utiliser. Cela définit les colonnes que Crystal Reports peut utiliser et vous permet de créer le rapport. Ensuite, lors de l'affichage du rapport que nous faisons:

ReportDocument rd = new ReportDocument(); 
rd.Load(MapPathSecure("NameOfMyReport.rpt")); 
rd.SetDataSource(dataSet.Tables[0]); 

Je n'ai fait avec une table, donc je ne sais pas comment avoir plusieurs tables dans le DataSet affecteraient il. Fondamentalement, vous définissez la structure du rapport avec l'expert de base de données et la commande. Ensuite, vous écrasez les données réelles lors de l'exécution. Je souhaite vraiment que Crystal Reports ait une manière plus robuste de le faire, ou que je l'ai comprise si elle existe.

+0

Mais comment créer une connexion si je ne connais pas la chaîne de connexion au moment de la compilation? –

+0

Vous le créez de la même manière que vous le faites normalement. Ma méthode vous oblige à tromper Crystal Reports. Vous devrez coder en dur la chaîne de connexion lorsque vous générez le rapport (création de la connexion à la base de données et à la commande dans Crystal Reports), mais vous l'écraserez à l'exécution avec les données réelles à l'aide de SetDataSource. – sgriffinusa