Thursday, July 28, 2011

ออกแบบรายงาน CrystalReport จาก Storeprocedure

บทความนี้เป็นตัวอย่าง การออกแบบรายงาน CrystalReport จาก Storeprocedure โดยการผ่าน Parameter  จาก CrystalReport ไปสู่ Storeprocedure
{ตอบปัญหาเพื่อนๆ ท่านหนึ่ง} 
ขั้นตอนการออกแบบรายงาน
  1. ออกแบบรายงานจาก Storeprocedure
  2. ใส่โด้ดดึงรายงานโดยผ่านพารามิเตอร์ทางเมธอด  SetParameterValue()
1.ออกแบบรายงานจาก Storeprocedure
ออกแบบตามขั้นตอนในรูปภาพเลยครับ
สร้างโปรเจ็กต์ ASP.Net และ Add Item CrystalReport เข้าใปในโปรเจ็กต์
1 2

ออกแบบโดยใช้โหมด Report Wizard และ Connect database โดยใช้ OLE DB
3 4

เลือก Provider แบบ SQL native Client
5

ระบุ ชื่อ Server DB  User DB และ Password  แล้ว Next, Next
6 7

ขยายจนถึง Stored Procedures และเข้าไปทำการเลือกชื่อ Stored Procedures ที่ต้องการ ในบทความนี้ขอใช้ SalesByCategory (รายงานการขายตามประเภทสินค้า) แล้วกดปุ่ม 10 เพื่อเลือก Stored Procedures
8 9 

OK, Next
11 12

เลือกฟิลด์ทั้งหมดโดยกดปุ่ม >> จากนั้น Next, Next
13 14

Next, Finish
15 16

ได้แบบรายงานมาเรียบร้อย ปรับเอาเองตามใจชอบ(User)
17

ทดสอบดูตัวอย่างรายงาน (Report Previe)
18 19

Report Previe
20 

Crystal Report จะสร้าง Parameter ให้อัตโนมัติ ตาม Stored Procedures SalesByCategory
21

ลากตัวคอนโทรล CrystalReportViewer ไปวางบน WebForm แล้วไปทำการใส่โด้ดดึงรายงาน กันเลยครับ
22
2. ใส่โด้ดดึงรายงานโดยผ่านพารามิเตอร์ทางเมธอด  SetParameterValue()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{
CrystalDecisions.CrystalReports.Engine.ReportDocument rpt = new 
CrystalDecisions.CrystalReports.Engine.ReportDocument();
rpt.Load(Server.MapPath("CrystalReport.rpt"));
rpt.SetDatabaseLogon("sa","1234");
rpt.SetParameterValue("@CategoryName", "Meat/Poultry");
rpt.SetParameterValue("@OrdYear", "1996");
CrystalReportViewer1.ReportSource = rpt;
}
}

ผลการรันแอพพลิเคชัน
23
 แหล่งข้อมูลดาวน์โหลด  ที่นี่


ตัวอย่างดึงพารามิเตอร์จาก app.config หรือ web.config
ต้อง ref: System.configuration เข้ามาใน Project ก่อนครับ
สมมุติ connectionStrings ชื่อ NorthwindConnectionString
string conn = System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;



จะได้ค่า: ประมาณนี้
//conn = Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=1234

แยกส่วนออกด้วยการ split

string[] _conn = conn.Split("=".ToCharArray());

จะได้ค่า: ประมาณนี้

/*

_conn[0] = "Data Source"
_conn[1] = ".\SQLEXPRESS;Initial Catalog"
_conn[2] = "Northwind;Persist Security Info"
_conn[3] = "True;User ID"
_conn[4] = "sa;Password"
_conn[5] = "1234"
*/
แยกส่วนครั้งแรกยังไม่จบ split ครั้งที่ 2 ด้วย ";" แล้วเอาค่าแรก [0]

string _serdb = _conn[1].Split (";".ToCharArray ())[0];

string _db = _conn[2].Split(";".ToCharArray())[0];

string _user = _conn[4].Split(";".ToCharArray())[0];

string _pwd = _conn[5];

แล้วส่งต่อให้ อ็อบเจ็กต์ ReportDocument
CrystalDecisions.CrystalReports.Engine.ReportDocument rpt = new CrystalDecisions.CrystalReports.Engine.ReportDocument();

rpt.SetDatabaseLogon(_user, _pwd, _serdb, _db);
หรือ
rpt.SetDatabaseLogon (_user, _pwd);
ปล.
    การ split connectionStrings ตามตัวอย่างดังกล่าง ต้องระวังเรื่องการแก้ไข connectionStrings แล้วสับตำแหน่งพารามิเตอร์ด้วยนะครับ
    เพราะทำให้ดึงค่าผิดได้ครับ
แหล่งข้อมูล Download https://skydrive.live.com/self.aspx/SourcesCode/PassParamFromCrystal2Storeprocedure.zip?cid=7d608959d854cb28&sc=documents

No comments:

Post a Comment