2009-04-01 6 views

Antwort

0

Meine Erfahrung ist mit älteren Versionen von Crystal (8,9) - Ich habe keine Ahnung, wie die Dateiformate für neuere Versionen aussehen. Es lohnt sich jedoch, die Dateien für alle Fälle in einem Texteditor zu öffnen, aber für die Dateiformate, die ich gesehen habe, ist der Abfragetext nicht auf diese Weise zugänglich.

Wenn ich mich richtig erinnere, kamen einige Versionen von Visual Studio 2003 mit Tools zur Manipulation von Crystal .rpt-Dateien (aber ich denke, das ist nicht von großem Nutzen für Sie, denn wenn Sie dies bereits hätten, wären Sie nicht fragend!).

Es ist keine sehr einfallsreiche Vorschlag, aber vielleicht Ihre schnellste Route wäre, die 30-day trial version of the current Crystal Reports herunterladen, und sehen, ob das die Dateien für Sie öffnen wird.

4

Umgekehrt können Sie, wenn Sie die Berichte ausführen können, SQL Profiler mit Ihrer DB verbinden und die eingehende SQL auf der Datenbankseite erfassen.

5

In "Crystal Reports ActiveX Designer Design und Laufzeitbibliothek" (craxddrt.dll) wird die Report.SQLQueryString-Eigenschaft tun, was Sie wollen.

Ich kann nicht scheinen, eine äquivalente Eigenschaft im .Net SDK zu finden, und glauben Sie mir, ich habe gesucht.

** bearbeiten **

Es scheint, dass eine Nutzung des In-Process RAS Server machen können diese Informationen zu erhalten:

CrystalDecisions.ReportAppServer.DataDefModel.CommandTableClass.CommandText

+1

Ich bedauere, dass ich nur eine Abstimmung habe, um Ihnen zu geben. – quillbreaker

13

Hier ist ein .NET-Beispiel von Code, der den Befehl Sql packt aus alle Crystal Reports in einem bestimmten Verzeichnis. Es erfordert der Kristall 2008 .NET SDK installiert werden (Sie eine Test von SAP herunterladen können):

foreach (string file in Directory.GetFiles("c:\\projects\\Reports", "*.rpt")) 
{ 
    Console.WriteLine(String.Format("Processing {0}...", file)); 
    var doc = new CrystalDecisions.CrystalReports.Engine.ReportDocument(); 
    doc.Load(file); 

    foreach (dynamic table in doc.ReportClientDocument.DatabaseController.Database.Tables) 
    { 
     if (table.ClassName == "CrystalReports.CommandTable") 
     { 
      string commandSql = table.CommandText; 

      //TODO: do something with commandSql 
     } 
    } 
} 

die SQL zu erhalten, wie Kristall wäre es zu bauen, wenn ein Bericht ausgeführt wird, diesen Link sehen: SAP Note 1280515 - How to extract SQL query from Crystal reports using RAS sdk.

Ich glaube, um dies zu tun, müssen Sie die Berichtsparameterwerte angeben, damit Crystal eine Verbindung zur Datenbank herstellen kann, um das SQL zu erstellen. Da im Beispiel ein Report Viewer-Steuerelement verwendet wird, kann Crystal den Benutzer zur Eingabe der Parameter auffordern.

+0

Dies sollte die Antwort sein, danke! – Zakos

+1

Sie sind ein Ninja. Nur um darauf hinzuweisen, dass ich das auch für Unterberichte versuchte. Nun, es wird nicht unterstützt. Die einzige Möglichkeit besteht darin, die Unterberichte außerhalb des Hauptberichts zu speichern und sie als 'ReportDocument' zu öffnen, damit Sie auf die InterOp-Klassen zugreifen können. Oh, und vergiss nicht, 'CrystalDecisions.ReportAppServer.ClientDoc',' CrystalDecisions.ReportAppServer.Controllers' und 'CrystalDecisions.ReportAppServer.DataDefModel' hinzuzufügen, ansonsten wird es nicht kompiliert. – tfrascaroli

0

Wählen Sie im Visual Studio die .rpt-Datei und Gehe zu Feld Explorer, klicken Sie mit der rechten Maustaste auf DatabaseFields. Klicken Sie auf die Option SQL-Abfrage, um die Abfrage anzuzeigen.