2009-04-01 10 views

Trả lời

0

Trải nghiệm của tôi là với các phiên bản cũ hơn của Crystal (8,9) - Tôi không biết định dạng tệp trông như thế nào cho các phiên bản mới hơn. Tuy nhiên, nó có giá trị mở các tập tin trong một trình soạn thảo văn bản chỉ trong trường hợp, nhưng đối với các định dạng tập tin tôi đã nhìn thấy, văn bản truy vấn không thể truy cập theo cách này.

Nếu tôi nhớ chính xác, một số phiên bản của Visual Studio 2003 đi kèm với các công cụ để thao tác các tệp .rpt tinh thể (nhưng tôi đoán điều này không được sử dụng nhiều đối với bạn, vì nếu bạn đã có, bạn sẽ không hỏi!).

Đây không phải là một gợi ý rất giàu trí tưởng tượng, nhưng có lẽ tuyến đường nhanh nhất của bạn là tải xuống 30-day trial version of the current Crystal Reports và xem liệu có mở tệp cho bạn hay không.

4

Cách khác xung quanh đây là nếu bạn có thể chạy báo cáo, bạn có thể nối SQL Profiler với DB của bạn và nắm bắt SQL đến ở phía cơ sở dữ liệu.

5

Trong "Crystal Reports ActiveX Designer Design và Thư viện thời gian chạy" (craxddrt.dll), thuộc tính Report.SQLQueryString sẽ làm những gì bạn muốn.

Tôi dường như không thể tìm thấy thuộc tính tương đương trong SDK .Net và tin tôi đi, tôi đã tìm kiếm.

** chỉnh sửa **

Dường như người ta có thể tận dụng các In-Process RAS Server để có được thông tin này:

CrystalDecisions.ReportAppServer.DataDefModel.CommandTableClass.CommandText

+1

Tôi rất tiếc vì tôi có một phiếu bầu để cung cấp cho bạn. – quillbreaker

13

Dưới đây là một ví dụ điển Net mã mà grabs Bộ Tư lệnh Sql từ tất cả các báo cáo Crystal trong một thư mục nhất định. Nó đòi hỏi Crystal 2008 Net SDK được cài đặt (bạn có thể tải về dùng thử từ 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 
     } 
    } 
} 

Để có được SQL như pha lê sẽ xây dựng nó khi chạy một báo cáo, xem liên kết này: SAP Note 1280515 - How to extract SQL query from Crystal reports using RAS sdk.

Tôi tin rằng để làm điều này, bạn cần cung cấp các giá trị tham số báo cáo để Crystal có thể kết nối với cơ sở dữ liệu để xây dựng SQL. Trong ví dụ này, khi một điều khiển Report Viewer được sử dụng, Crystal có thể nhắc nhở người dùng về các tham số.

+0

điều này sẽ là câu trả lời, cảm ơn! – Zakos

+1

Bạn là một ninja. Chỉ để chỉ ra tôi đã cố gắng làm điều này cho subreports là tốt. Vâng, nó không được hỗ trợ. Tùy chọn duy nhất của bạn là lưu các subreports bên ngoài báo cáo chính và mở chúng dưới dạng 'ReportDocument's, theo cách này bạn có thể truy cập vào các lớp InterOp. Oh, và đừng quên thêm 'CrystalDecisions.ReportAppServer.ClientDoc',' CrystalDecisions.ReportAppServer.Controllers' và 'CrystalDecisions.ReportAppServer.DataDefModel', nếu không nó sẽ không biên dịch. – tfrascaroli

0

Trong phòng thu trực quan, chọn tệp .rpt và Đi tới trình khám phá trường, nhấp chuột phải vào DatabaseFields. Nhấp vào tùy chọn truy vấn SQL để xem truy vấn.