Merhabalar,
Bu yazımda FastReport.Net raporlama aracının Visual Studio IDE ile hazırlanan C# ve VB.NET projeleri içerisinde kullanımından bahsetmeye çalışacağım. Ancak bu yazı daha önceki FastReport .NET kullanımı hakkındaki yazılarla bağlantılı olduğu için öncelikle onları incelemeniz konuyu kavramanız açısından daha faydalı olacaktır.
Şimdi ilk olarak oluşturacağınız rapor dosyalarını görüntüleyebilmek için PreviewControl componentini form üzerinde istediğiniz biçimde yerleştirin ve kod sayfasının tepesine C#.NET için using FastReport; VB.NET için Imports FastReport satırlarını ekleyin.
Benim yaptığım örnekteki görüntü şu şekildeydi.
Şimdi de gerekli kodları yazalım ama öncesinde şunu belirtmeliyim. Kullandığım sistem 64 Bit olduğu için Access DB konusunda problem yaşadım. Bu yüzden kodlar içerisinde ODBC bağlantısını kullandım. Siz bu bağlantıyı istediğiniz gibi değiştirerek kendinize göre uyarlayabilirsiniz. Ancak kullanacağınız bağlantıya ait namespace'i eklemeyi unutmayın.
C#.NET
public partial class ReportPage : Form
{
Report report;
private void ReportPage_Load(object sender, EventArgs e)
{
CreateReport();
}
/// <summary>
/// Rapor içeriğini hazırlar.
/// </summary>
private void CreateReport()
{
// Yeni bir rapor dosyası oluşturuyoruz.
report = new Report();
// Resources içerisindeki string biçimindeki raporu
// yeni oluşturduğumuz rapor içerisine yüklüyoruz.
report.LoadFromString(Properties.Resources.ReportString);
// Veritabanına gerekli sorguyu gönderip verileri çekiyoruz.
DataTable dt = SQLProcesses.GetDataTable("SELECT T.Type, W.WriterName, B.BookName "
+ "FROM tblBooks B, tblBookTypes T, tblWriters W "
+ "WHERE B.BookTypeID = T.ID AND W.ID = B.BookWriterID "
+ "ORDER BY T.Type ASC, W.WriterName ASC");
// Çektiğimiz verileri daha önceden şablon olarak oluşturduğumuz
// rapor içerisinde ismi belirtilen tabloya register ediyoruz.
report.RegisterData(dt, "tblBooksWithTypes");
/* Rapor gösterilemezse olacakları burada belirliyoruz.
* Ancak bu kullanımın mecburi olmadığını yalnızca birden fazla rapor oluştururken
* kullanımı kolaylaştırmak gayesiyle böyle tasarlandığına dikkat edelim. */
if (!ShowReport(report))
{
Application.Exit();
}
}
/// <summary>
/// Gönderilen raporun görüntülenmesini sağlar ve işlemin başarı durumunu geriye döndürür.
/// </summary>
/// <param name="report"></param>
/// <returns></returns>
private bool ShowReport(Report report)
{
bool rV = false;
try
{
// Gönderilen rapor dosyasının form üzerindeki
// PreviewControl de gösterileceğini belirtiyoruz.
report.Preview = pCReports;
// Eğer rapor arkapkanda hazırlanmışsa sonraki adıma geçiyoruz.
if (report.Prepare())
{
// Hazırlanmış olan raporun gösterilmesini sağlıyoruz.
report.ShowPrepared();
// Rapor üzerinde scroll işlemlerini doğrudan gerçekleştirebilmek için
// PreviewControl üzerine odaklanıyoruz.
pCReports.Focus();
rV = true;
}
}
catch
{
rV = false;
}
// Eğer rapor başarılı bir şekilde oluşturulduysa geriye true değeri döndürüyoruz.
return rV;
}
}
public class SQLProcesses
{
/// <summary>
/// Rapor içeriğini veritabanından çekerek DataTable içerisinde geri döndürür.
/// </summary>
/// <param name="cmd">Veritabanına gönderilecek olan sorgu</param>
/// <returns></returns>
public static DataTable GetDataTable(string cmd)
{
DataTable returnTable = new DataTable();
try
{
OdbcConnection ODBCConn = new OdbcConnection (@"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
+ "dbq=C:\FASTREPORT .NET SAMPLE\data.mdb;defaultdir=C:\FASTREPORT .NET SAMPLE;"
+ "driverid=25;fil=MS Access;filedsn=C:\FastReport .NET Sample\FR.NETConn.dsn;"
+ "maxbuffersize=2048;maxscanrows=8;pagetimeout=5;safetransactions=0;threads=3;"
+ "usercommitsync=Yes;uid=admin");
OdbcDataAdapter oda = new OdbcDataAdapter(cmd, ODBCConn);
oda.Fill(returnTable);
}
catch(Exception ex)
{
MessageBox.Show(string.Format("Hata Oluştu. Hata İçeriğini Aşağıda Görebilirsiniz.\n\n{0}", ex.Message));
}
return returnTable;
}
}
VB.NET
Imports FastReport
Imports System.Data.Odbc
Partial Public Class ReportPage
Inherits Form
Private report As Report
Private Sub ReportPage_Load_1(ByVal sender As System.Object,
ByVal e As System.EventArgs)
Handles MyBase.Load
CreateReport()
End Sub
''' <summary>
''' Rapor içeriğini hazırlar.
''' </summary>
Private Sub CreateReport()
' Yeni bir rapor dosyası oluşturuyoruz.
report = New Report()
' Resources içerisindeki string biçimindeki raporu
' yeni oluşturduğumuz rapor içerisine yüklüyoruz.
report.LoadFromString(My.Resources.MyResources.ReportString)
' Veritabanına gerekli sorguyu gönderip verileri çekiyoruz.
Dim dt As DataTable = SQLProcesses.GetDataTable("SELECT T.Type, W.WriterName, B.BookName "
& "FROM tblBooks B, tblBookTypes T, tblWriters W "
& "WHERE B.BookTypeID = T.ID AND W.ID = B.BookWriterID "
& "ORDER BY T.Type ASC, W.WriterName ASC")
' Çektiğimiz verileri daha önceden şablon olarak oluşturduğumuz
' rapor içerisinde ismi belirtilen tabloya register ediyoruz.
report.RegisterData(dt, "tblBooksWithTypes")
' Rapor gösterilemezse olacakları burada belirliyoruz.
' Ancak bu kullanımın zorunlu olmadığını yalnızca birden fazla rapor oluştururken
' kullanımı kolaylaştırmak amacıyla böyle tasarlandığına dikkat edelim.
If Not ShowReport(report) Then
Application.[Exit]()
End If
End Sub
''' <summary>
''' Gönderilen raporun görüntülenmesini sağlar ve işlemin başarı durumunu geriye döndürür.
''' </summary>
''' <param name="report"></param>
''' <returns></returns>
Private Function ShowReport(ByVal report As Report) As Boolean
Dim rV As Boolean = False
Try
' Gönderilen rapor dosyasının form üzerindeki
' PreviewControl de gösterileceğini belirtiyoruz.
report.Preview = pCReports
' Eğer rapor arkapkanda hazırlanmışsa sonraki adıma geçiyoruz.
If report.Prepare() Then
' Hazırlanmış olan raporun gösterilmesini sağlıyoruz.
report.ShowPrepared()
' Rapor üzerinde scroll işlemlerini doğrudan gerçekleştirebilmek için
' PreviewControl üzerine odaklanıyoruz.
pCReports.Focus()
rV = True
End If
Catch
rV = False
End Try
' Eğer rapor başarılı bir şekilde oluşturulduysa geriye true değeri döndürüyoruz.
Return rV
End Function
End Class
Public Class SQLProcesses
''' <summary>
''' Rapor içeriğini veritabanından çekerek DataTable içerisinde geri döndürür.
''' </summary>
''' <param name="cmd">Veritabanına gönderilecek olan sorgu</param>
''' <returns></returns>
Public Shared Function GetDataTable(ByVal cmd As String) As DataTable
Dim ReturnTable As New DataTable()
Try
Dim ODBCConn As New OdbcConnection("Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
& "dbq=C:\FASTREPORT .NET SAMPLE\data.mdb;"
& "defaultdir=C:\FASTREPORT .NET SAMPLE;driverid=25;"
& "fil=MS Access;filedsn=C:\FastReport .NET Sample\FR.NETConn.dsn;"
& "maxbuffersize=2048;maxscanrows=8;pagetimeout=5;safetransactions=0;"
& "threads=3;usercommitsync=Yes;uid=admin")
Dim oda As New OdbcDataAdapter(cmd, ODBCConn)
oda.Fill(ReturnTable)
Catch ex As Exception
MessageBox.Show(String.Format("Hata Oluştu. Hata İçeriğini Aşağıda Görebilirsiniz."
& vbLf & vbLf & "{0}", ex.Message))
End Try
Return ReturnTable
End Function
End Class
Yapmamız gereken işlemler bu kadar. Bunların yanısıra farklı kodlarla doğrudan VS IDE içerisinde rapor içeriği oluşturulabiliyor olmasına rağmen buradaki gibi şablon oluşturup içerisindeki tablolara verileri yüklemek daha kolay ve kullanışlı olduğu için diğer kodlara girmiyorum.
Ayrıca şunu da belirtmeliyim. FastReport.Net Designer üzerinde oluşturup kaydettiğiniz dosyalar metin tabanlı dosyalardır. Basit düzeyde herhangi bir metin editörü (notepad, emeditor, notepad++, vs.) ile açıp içerisindeki metni alıp resources içerisinde depolayabilirsiniz. Bizim burada yaptığımız da buydu zaten.
Yaptığımız örnekle ilgili örnek kodları buradan indirebilirsiniz Örnek kodlar hem C# .NET hem de VB .NET üzerinde oluşturulmuştur.
Not1: Örnek kodun doğru bir şekilde çalışması için zip dosyasının içeriğini C:\ adresine çıkartın.
Not2: Kullandığım FastReport.Net sürümü 1.2.47, Visual Studio sürümü 2008'dir.
Not3: VB.NET kodları http://www.developerfusion.com/tools/convert/csharp-to-vb/ üzerinden otomatik olarak oluşturulmuştur ancak sonrasında gerekli düzeltmeler yapılmış ve çalıştığı test edilmiştir.
Not4: Kod içerisinde kullandığım veritabanı bağlantısı ODBC üzerinden gerçekleştiği için resources içerisine gömdüğüm string de Report_Sample[ODBCConn].frx isimli dosyaya ait. Bu yüzden kodları doğrudan çalıştırmak istediğinizde ODBC hatası alabilirsiniz. Bu problemi çözmek için ya Denetim Masası üzerinden bir tane ODBC bağlantısı tanımlayın ya da Report_Sample.frx isimli dosyaya ait stringi resources içine gömüp gerekli değişiklikleri yaparak kullanın.
Herhangi bir problemle karşılaşırsanız yardımcı olmaya çalışırım.
Tekrar görüşünceye kadar hoşçakalın...