我想从Crystal Report .rpt文件中提取SQL查询,有没有办法做到这一点?

时间:2009-04-01 15:44:45

标签: sql crystal-reports report

我想从Crystal Report .rpt文件中提取SQL查询,有没有办法做到这一点?

我没有任何Crystal Reports产品,只有.rpt文件。

6 个答案:

答案 0 :(得分:14)

这是一个.Net示例代码,它从给定目录中的所有Crystal Reports中获取Command Sql。它需要安装Crystal 2008 .Net SDK(您可以从SAP下载试用版):

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
        }
    }
}

要在运行报表时将Crystal构建为SQL,请参阅以下链接:SAP Note 1280515 - How to extract SQL query from Crystal reports using RAS sdk.

我相信这样做,您需要提供报表参数值,以便Crystal可以连接到数据库以构建SQL。在该示例中,由于使用了Report Viewer控件,Crystal可以提示用户输入参数。

答案 1 :(得分:6)

在“Crystal Reports ActiveX Designer设计和运行时库”(craxddrt.dll)中,Report.SQLQueryString属性将执行您想要的操作。

我似乎无法在.Net SDK中找到等效的属性,相信我,我一直在寻找。

**编辑**

似乎可以使用In-Process RAS Server来获取此信息:

CrystalDecisions.ReportAppServer.DataDefModel.CommandTableClass.CommandText

答案 2 :(得分:4)

另一种方法是,如果您可以运行报告,则可以将SQL事件探查器连接到数据库并捕获数据库端的传入SQL。

答案 3 :(得分:1)

JoshL的答案适用于我的一些报告,但不是全部。使用<ListView ItemsSource="{Binding RightPanelViewModels}"> <ListView.ItemTemplate> <DataTemplate> <DockPanel> <Label Content="{Binding Name}"/> </DockPanel> </DataTemplate> </ListView.ItemTemplate> </ListView> 的以下方法能够提取另一种方法错过的一些查询。

            import time
            def countdown(p,q):
                k = 0
                a = ""

                while True:

                    if(q == -1):                                                              
                        q = 59 #default seconds for countdown
                        p -= 1 #decremental value for minutes

                    if(q > 9):
                       a = str(k) + str(p) + ":" + str(q) + "\n"
                    else:
                       a = str(k) + str(p) + ":" + str(k) + str(q) + "\n"
                    print (a)

                    time.sleep(1)
                    q -= 1
                    if(p == 0 and q == -1):
                        break

                if(p == 0 and q == -1):
                    print("Goodbye!") #print goodbye
                    time.sleep(10)    #timer before going to sleep (seconds)
            countdown(1,0) #format (minutes, seconds)

答案 4 :(得分:-1)

我的经验是旧版本的Crystal(8,9) - 我不知道更新版本的文件格式是什么样的。但是,为了以防万一,值得在文本编辑器中打开文件,但对于我看过的文件格式,查询文本无法通过这种方式访问​​。

如果我没记错的话,某些版本的Visual Studio 2003附带了用于操作Crystal .rpt文件的工具(但我想这对你来说没什么用处,因为如果你已经有了这个,你就不会问了!)。

这不是一个非常富有想象力的建议,但也许您最快的路线是下载30-day trial version of the current Crystal Reports,看看是否会为您打开文件。

答案 5 :(得分:-1)

在Visual Studio中,选择.rpt文件并转到字段资源管理器,右键单击DatabaseFields。单击SQL查询选项以查看查询。