สร้างรายงานย่อย(Subreport) บน Crystal Reports Basic for Visual Studio 2008


Download:
http://cid-7d608959d854cb28.skydrive.live.com/embedrowdetail.aspx/SourcesCode/WebAppCrystalSubReport.zip

 

การพัฒนาแอพพลิเคชันในปัจจุบัน ส่วนใหญ่จะเกี่ยวข้องกับข้อมูลเสียเป็นส่วนใหญ่ และสิ่งหนึ่งที่นักพัฒนาหลีหนีไม่พ้นนั่นคือ การนำเอาข้อมูลที่เก็บไว้ในระบบกลับไปใช้งานต่อในรูปแบบ ของรายงานต่างๆ และหนึ่งในเครื่องมือที่ใช้ในการออกแบบรายงาน ที่เหล่านักพัฒนามือเก๋าทั้งหลายต่างต้องเคยสัมผัสกันมาบ้างบนถนนแห่งความเป็นกรรมกรซอฟต์แวร์ นั่นคือ Crystal Report ซึ่งเป็นแอพพลิเคชันที่ช่วยให้นักพัฒนาสามารถออกแบบรายงานได้อย่างง่ายๆ เพียงเรากำหนดแหล่งข้อมูล(DataSource)ให้มัน จากนั้นเราเพียงนำ DatabaseFields ไปวางบนฟอร์มรายงาน และจัดรูปแบบฟอร์มตามความต้องการ  

และเป็นโชคดีของเหล่านักพัฒนาที่ใช้เครื่องมือ VS2008 เช่นกัน ที่ไม่จำเป็นต้องติดตั้งโปรแกรม Crystal Report เพิ่มเติมลงบนเครื่องเนื่องจากไมโครซอฟท์ได้ใส่ไว้ในเครื่องมือดังกล่าวให้เรียบร้อยแล้ว ซึ่งเป็น Crystal Report ตัวเล็กที่ไมโครซอฟท์ใส่ไว้ในชุดเครื่อง Visual Studio ซึ่งเวอร์ชั่นปัจจุบันใน VS2008 เป็นเวอร์ชั่น Crystal Reports 10.5 ซึ่งมีชื่อเรียกว่า Crystal Reports Basic for Visual Studio 2008 แม้จะเป็นเพียง Crystal Reports แบบพื้นๆ (Basic) แต่เราก็สามารถใช้ออกแบบรายงานได้ดีในระดับมืออาชีพ เรียกได้ว่ารายงานพื้นฐานทั่วไป เช่นรายงานในรูปแบบ รายการ, กราฟ, CrossTab หรือ รายงาน MstaterDetail แบบ ใช้ SubReport ก็สามารถใช้งานได้เช่นกัน ท่านผู้อ่านสามารถเทียบเคียงฟีเจอร์ระหว่าง Crystal Reports 2008 และ Crystal Reports Basic for Visual Studio 2008  ได้ที่นี่ครับ: {Crystal Reports for Visual Studio Comparison} 

 

และในบทความนี้เราลองไปใช้งานเจ้า Crystal Reports Basic for Visual Studio 2008 ในการออกแบบรายงาน SubReport ผ่าน DataSet กันครับ และรูปที่ 1 จะเป็นหน้าจอรายงานเป้าประสงค์ของเราในครั้งนี้ครับ

1

รูปที่ 1  หน้าจอรายงาน SubReport

 

เมื่อเราได้ทราบเป้าประสงค์แล้ว เราไปดูขั้นตอนการพัฒนาแอพพลิเคชันกันเลยครับ

 

ขั้นตอนการพัฒนาแอพพลิเคชัน

  • ขั้นตอนที่ หนึ่ง: สร้างโปรเจ็กต์
  • ขั้นตอนที่ สอง: สร้าง DataSet
  • ขั้นตอนที่ สาม: สร้างรายงานจาก Crystal Report
  • ขั้นตอนที่ สี่: สร้างรายงานย่อย
  • ขั้นตอนที่ ห้า: สร้าง Parameter Fields
  • ขั้นตอนที่ หก: ออกแบบหน้าจอดูรายงาน (ReportViewer)
  • ขั้นตอนที่ เจ็ด: ใส่โค้ดดึงรายงาน
  • ขั้นตอนที่ แปด: ทดสอบพิมพ์รายงาน

 

ขั้นตอนที่ หนึ่ง: สร้างโปรเจ็กต์

  1. หยิบเครื่องมือ VS2008 ขึ้นมา
  2. คลิกเมาส์ลงบน File => New Project…
  3. ในหน้าจอ New Project เลือกภาษา C# เทมเพลตเป็น ASP.NET Web Application

จากนั้นเราไปเพิ่มไอเทม DataSet เพื่อใช้ในการออกแบบรายงาน

 

ขั้นตอนที่ สอง: สร้าง DataSet

คลิกขวาบนโปรเจ็กต์ => เลือกเมนู Add New Item…

ในหน้าต่าง Add New Item => เลือกไอเทม DataSet ดังรูป

3

รูปที่ 2 ไอเทม DataSet

 

ในหน้าจอออกแบบ DataSet คลิก Server Explorer จะแสดงหน้าต่าง Server Explorer ให้คลิก Connect to DataBase

4

รูปที่ 3 หน้าจอ Server Explorer                                                               

 

ในหน้าต่าง Add Connection

ช่อง Data source: เลือกเป็น Microsoft SQL Server (SqlClient)

Server name:=ใส่ชื่อ Server ในที่นี้ชื่อ Server ผมใช้เป็น .SQLEXPRESS2008

Log on to the server: ให้เลือก Use SQL Serevr Authentication จากนั้นให้ป้อน User name และ Password ลงไป และติ๊กเลือก Save my password เพื่อระบบบันทึก password ไว้ในไฟล์ web.config

Connect to database: ให้เลือกชื่อ Database ในที่นี้ผมใช้ Northwind  จากนั้นคลิกปุ่ม OK

5

รูปที่ 4 หน้าต่าง Add Connection

 

เมื่อเราทำการเชื่อมต่อ Server เรียบร้อยแล้วในหน้าต่าง Server Explorer ให้คลิกไปที่ชื่อ Connection ที่เราได้ไปเมื่อสักครู่ จากนั้นคลิกไปที่โหนด Table แล้วทำการลาก Table Categories และ Products ไปวางบน พื้นที่ออกแบ DataSet ดังรูป ขั้นตอนการสร้าง DataSet เป็นอันเรียบร้อย

6

รูปที่ 5

 

ขั้นตอนที่ สาม: สร้างรายงานจาก Crystal Report

คลิกขวาบนโปรเจ็กต์ => เลือกเมนู Add New Item…

ในหน้าต่าง Add New Item => เลือกไอเทม Crystal Report ดังรูป

7

รูปที่ 6 ไอเทม Crystal Report

 

เลือก Using the Report Wizard

DataSource ให้เลือก Project Data > ADO.NET DataSets > Categories

เลือก Field ที่ต้องการ แล้วคลิก Next > Next > Next > Finish การผูกแหล่งข้อมูลให้ Main report เป็นอันเรียบร้อย

8

รูปที่ 7  Report Wizard

 

ขั้นตอนที่ สี่: สร้างรายงานย่อย

คลิกเมาส์ขวาบน Section3(Detail a)=> Insert Section Below เราจะได้ DetailSection(Detail b)
คลกเมาส์ขวาใน DetailSection(Detail b) เลือกเมนู Insert => Subreport และวาง Subreport ลงไป

9

รูปที่ 8 สร้างรายงานย่อย

ในหน้าต่าง Insert Sub report ให้เลือก Create a subreport with the Report Wizard ในช่อง New report name: ให้ป้อนชื่อ subreport
ในบทความนี้ใช้ชื่อ product จากนั้นคลิกปุ่ม Report Wizard
DataSource ให้เลือก Products > Next  จากนั้นเลือก Field ที่ต้องการ => Next > Next > Next > Finish การผูกแหล่งข้อมูลให้ Subreport เป็นอันเรียบร้อย

 

10

รูปที่ 9 SubReport with the Report Wizard

 

เมื่อเราทำการผูกข้อมูลให้ Subreport เป็นที่เรียบร้อยแล้ว ต่อไปเป็นการใส่ Link ให้กับ Subreport โดย MainReport และ SubReport Link กันโดยใช้ Field ที่เป็น FK (Foreign Key Relationships) ให้คลิกที่แทบ LINK

หมายเลข 1 ให้เลือก Field CategoryID
หมายเลข 2 คลิกปุ่ม OK การใส่ LINK ให้ Subreport เป็นอันเรียบร้อย

หมายเลข 3 ให้เพิ่ม Text Object เพื่อใส่ป้ายชื่อใน MainReport ว่า Main Report
หมายเลข 4 เราไม่ต้องแสดงพื้อนที่ในส่วนของ ReportFooterSetion2(Report Footer b) ให้คลิกเมาส์ขวาบน Section ดังกล่าวแล้วเลือก Suppress(No Drill-Down) จากนั้นเราใส่ Text Object เพื่อแสดงป้ายชื่อ ว่า Sub Report

11

รูปที่ 10 สร้าง LINK ให้ SubReport

 

หน้าจอเมื่อเราทำการออกแบบรายงานเรียบร้อย MainReport จะอยู่ใน Section3 (Detail a) และ Subreport จะอยู่ใน DetailSection1(Detail b) ดังรูป

12

รูปที่ 11 หน้าจอรายงานที่ออกแบบเรียบร้อย

 

ขั้นตอนที่ ห้า: สร้าง Parameter Fields

ให้เราทำการเพิ่ม Parameter Fields เข้าไปบน MainReport และ Subreport เราจะใช้เป็นส่วนของหัวรายงาน เช่น

parameter ใน Main report เราจะผ่านค่าไปแสดงเป็น รายงานสินค้าตาม ประเภทเภทสินค้า
parameter ใน Subreport เราจะผ่านค่าไปแสดงเป็น รายงานสินค้า โดยเราผ่าค่าจากการใส่โค้ด ซึ่งจะกล่าวในหัวข้อถัดไป

พูดถึงการสร้าง Parameter Fields ทำได้ง่ายเพียงคลิกเมาส์ไปที่ หน้าต่าง Field Explorer คลิกเมาส์ขวาบน Parameter Fields=>New

จากนั้นตั้งชื่อ Paramter เลือกประเภทข้อมูลที่เราจะส่งให้ Parameter ดังรูป

13 

รูปที่ 12 สร้าง Parameter Fields

 

จากนั้นการนำเอา Parameter ไปแสดงในรายงาน โดยการคลิก แล้วลากไปวางในรายงาน

14

รูปที่ 13 วาง Parameter Fields ใน MainReport

 

ให้ทำการเพิ่ม Parameter ใน Subreport

15

รูปที่ 14 วาง Parameter Fields ใน SubReport

 

การปรับ Format ของ Parameter field หรือ Database fields ทำโดยการคลิกเมาส์ขวาบน Field obj ดังกล่าว จากนั้นเลือกเมนู Format Object ในหน้าต่าง Format Editor ให้ไปที่แทบ Font เราก็สามารถปรับ font , Style, หรือ Color ได้ และมีตัวอย่างในขณะเรากำลังแก้ไขในช่อง  Sample cและเรายังสามารถ ใส่ Script formula เพื่อให้ปรับ font ตามเงื่อไขของเราจาก ปุ่ม X*2 

16

รูปที่ 15 ปรับ Format ของ Parameter field

 

จากที่กล่าวมาขั้นต้นเป็นการกล่าวถึงขั้นตอนการออกแบบรายงาน ซึ่งเมื่อเราออกแบบรายงานเรียบร้อยแล้วเรายังไม่สามารถนำไปใช้งานได้ทันที เราต้องไปสร้างหน้าจอสำหรับแสดงรายงานให้ผู้ใช้งานด้วย และด้วยขั้นตอนการออกแบบรายงานมีหลายขั้นตอนดังกล่าว จึงเป็นเรื่องน่าเบื่อสำหรับนักพัฒนาหลายๆ ท่าน

 

ขั้นตอนที่ หก: ออกแบบหน้าจอดูรายงาน (ReportViewer)

การแสดงรายงานของ Crystal Report จะใช้คอนโทรลที่ชื่อว่า CrsyatlReportViewer ให้เราทำการลากคอนโทรลดังกล่าวไปวางในบนDefault.aspx แล้วทำการลาก TextBox 2 อัน ปุ่ม Button 1 ปุ่ม วางดังรูป จากนั้นไปใส่โค้ดเพื่อดึงข้อมูลไปพิมมพ์ออกรายงานเลยครับ

17

รูปที่ 16 ออกแบบหน้าจอดูรายงาน

 

 

ขั้นตอนที่ เจ็ด: ใส่โค้ดดึงรายงาน

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;


public partial class _Default : System.Web.UI.Page 
{


    protected override void OnInitComplete(EventArgs e)
    {
        if (this.Session["ReportSource"] != null)
            CrystalReportViewer1.ReportSource =  this.Session["ReportSource"];
  
        base.OnInitComplete(e);
    }



    protected void Page_Load(object sender, EventArgs e)
    {

    }

  
    protected void btFind_Click(object sender, EventArgs e)
    {
        string strConn = WebConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
        string sql = "";
        
        if (txtCategory.Text != "" && txtProducts.Text != "")
            sql = " SELECT * FROM Categories Where CategoryName Like '%" + txtCategory.Text.Trim() + "%'; " +
                  " SELECT * FROM Products  Where ProductName like '%" + txtProducts.Text.Trim() + "%';";

        else if (txtCategory.Text != "")
            sql = " SELECT * FROM Categories Where CategoryName Like '%" + txtCategory.Text.Trim() + "%'; " +
                  " SELECT * FROM Products  Where CategoryID in (SELECT CategoryID FROM Categories "+
                  " Where CategoryName Like '%" + txtCategory.Text.Trim() + "%');";

        else if (txtProducts.Text != "")
            sql = " SELECT * FROM Categories Where CategoryID in (SELECT CategoryID FROM Products "+
                " Where ProductName like '%" + txtProducts.Text.Trim() + "%'); " +
                  " SELECT * FROM Products  Where ProductName like '%" + txtProducts.Text.Trim() + "%'";
        else
            sql = " SELECT * FROM Categories; " +
                  " SELECT * FROM Products; ";

        System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(strConn);
        conn.Open();

        System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sql, conn);
        DataSet ds = new DataSet();
        da.Fill(ds);

        if (ds.Tables[0].Rows.Count > 0)
        {

            CrystalDecisions.CrystalReports.Engine.ReportDocument rpt = 
                new CrystalDecisions.CrystalReports.Engine.ReportDocument();

            rpt.Load(Server.MapPath("CrystalReport.rpt"));
            rpt.SetDatabaseLogon("sa", "enabler", ".\SQLEXPRESS2008", "Northwind");

            //โหลดข้อมูล Table Products {ds.Tables[1]} เข้า SubReport
            rpt.Subreports[0].Database.Tables[0].SetDataSource(ds.Tables[1].DefaultView);

            //โหลดข้อมูล Table Categories {ds.Tables[0]} เข้า MainReport
            rpt.SetDataSource(ds.Tables[0].DefaultView);

            //กำหนด Parameter บน MainReport
            rpt.SetParameterValue("pmMain", "รายงานสินค้าตาม ประเภทเภทสินค้า");

            //กำหนด Parameter บน Subreport
            rpt.SetParameterValue("pmSub", "รายงานสินค้า", "product");

            //เก็บ ReportSource บน Session
            this.Session["ReportSource"] = rpt;
            CrystalReportViewer1.ReportSource = 
                (CrystalDecisions.CrystalReports.Engine.ReportDocument)this.Session["ReportSource"];

        }

    }
}

 

ขั้นตอนที่ แปด: ทดสอบพิมพ์รายงาน

 

เงื่อนไขการออกรายงาน เราสามารถกรองรายการสินค้าที่ต้องการพิมพ์รายงานโดยพิมพ์เงื่อนไขดังกล่าวลงไปบน TextBox Category และ Product ได้ ดังรูป

18

รูปที่ 17 ทดสอบพิมพ์รายงาน

 

การพิมพ์รายงานออกเครื่องพิมพ์จะไม่พิมพ์ผ่าน บราวเซอร์ แต่ Crystal report จะ Export ข้อมูลไปเป็น PDF เพื่อให้รูปแบบไม่ผิดเพี้ยงเมื่อถูกพิมพ์ออกจากเครื่องพิมพ์ ทำได้โดยการคลิกปุ่ม Print บน Toolbar จะมีหน้า Print the Report ให้เลือก All แล้วกดปุ่ม OK

19

รูปที่ 18 Export ข้อมูลไปเป็น PDF

 

เมื่อรายงานถูก Export เป็น PDF เป็นที่เรียบร้อยเราสามารรถกดเมื่อ Print บน Toolbar ของ Acrobat เพื่อพิมพ์รายงานออกเครื่องพิมพ์

20

รูปที่ 19 พิมพ์รายงานออกเครื่องพิมพ์

 

เป็นอย่างไรบ้างครับ สำหรับการออกแบบรายงานด้วย Crystal Reports Basic for Visual Studio 2008 บน VS2008 ใช้ได้ดีไม่แพ้ Crystal Report ตัวเต็มใช่ใหมครับ  ให้โชคดีสุขีในวันปีใหม่ 2552 ขอให้โชคดีกันทุกๆ ท่านครับ

แหล่งข้อมูลอ้างอิง:

Advertisements
เกี่ยวกับ

Nuchit Atjanawat is a Microsoft MVP, GreatFriends Community Leader, WindowsITPro Columnist(Mr.Nano), Silverlight Business Application Instructor, Speaker in various Microsoft events, Author, passionate Blogger and a Software Engineer by profession. He has a very good skill over Silverlight, LightSwitch, C#, XAML & Blend. He shares his technical findings, tutorials in his technical blog. Follow his Blog and Facebook page to be updated on latest articles. - Technical Blog: https://janawat.wordpress.com - WindowsITPro Columnist(Mr.Nano): http://windowsitpro.net - The GreatFriends.Biz Community Discussion Board (nano): http://greatfriends.biz - witter: https://twitter.com/janawat - Facebook Page: https://www.facebook.com/nuchit - Instructor: http://bit.ly/GF250-01, http://bit.ly/GF150-02

เขียนใน Crystal Reports
12 comments on “สร้างรายงานย่อย(Subreport) บน Crystal Reports Basic for Visual Studio 2008
  1. ejeepss พูดว่า:

    ละเอียดดีครับ ต้องยกนิ้วโป้งให้เลยครับ เยี่ยมกิตติชน แม้นสมุทร

  2. worawith พูดว่า:

    สุดยอดมากครับ ต้องขอบคุณมากครับผมได้ความรู้มากเลยครับ

  3. Ronnachai พูดว่า:

    ขอบคุณมากครับ…เก่งจัง!

  4. Patcha พูดว่า:

    สอบถามหน่อยคะว่า เวลากดปุ่ม Print บน Toolbar (จะมีหน้า Print the Report ขึ้นมาให้เลือก)
    ถ้าเราไม่ต้องการให้ขึ้น แต่ให้รายงานถูก Export เป็น PDF เลยได้หรือป่าว ค่ะ

    • janawat พูดว่า:

      ได้ครับ แต่เราต้องไปใส่โค้ดเพิ่มเติมนิดหน่อย ตามนี้:
      https://janawat.wordpress.com/2011/01/10/asp-net-crystal-reports-export-pdf

      • Patcha พูดว่า:

        ขอโทษค่ะที่ถามไม่ละเอียด คือว่า เวลาที่เรากด ปุ่ม Print บน Toolbar แล้ว ไม่ต้องการให้ Page “Print the Report” แต่ ให้ขึ้น Page ” Acrobat ” ขึ้นมาให้เลือก Print อีกทีหนึ่งคะ

        แล้ว อยากถามอีกข้อหนึ่งค่ะ ว่า Toolbar ไม่มีปุ่ม Close หรือค่ะ เราต้อง เขียนเพิ่มหรือป่าว ( ไม่ต้องการกด ปุ่มปิดของ Windows)

        ขอบคุณที่ช่วยนะค่ะ ( มือใหม่หัดทำ ค่ะ)

  5. […] สร้างรายงานย่อย(Subreport) บน Crystal Reports Basic for Visual Stu…  มีเพื่อนคนหนึ่ง […]

  6. golf พูดว่า:

    พอดีผมออกแบบ Report ใน MSVS 2008 อ่ะคับ แล้วพอเวลาเราสั่งพิมพ์หรือแสดงรายงนจริง ตัวหนังสือมันหดเล้กลงกว่าเดิมอ่ะคับ เกือบจะเหลือครึ่งหน้าเลยคับ ทั้งๆที่เวลาเราออกแบบมันก็เต็มหน้า แต่ทำไมเวลาแสดงรายงานจริงมันมีขนาดไม่เท่ากันที่ออกแบบไว้อ่ะคับ รบกวนด้วยคับ

  7. 2 พูดว่า:

    กำลังทำโปรเจ็คอยู่เลยค่ะ แต่ติดตรงที่ username : sa
    แล้ว pass อ่ะค่ะ หนูจะหาจากที่ไหนอ่ะค่ะ ซื้อหนังสือมาลองทำแล้ว pass มันไม่ตรงกันอ่ะค่ะ
    แต่รู้ว่าต้องดูที่โค๊ด ไม่รู้ตรงไหนอ่ะค่ะ รบกวนตอบทีนะคะ ขอบคุณค่ะ
    …….มือใหม่ หัดใช้ อ่ะค่ะ …….

  8. off พูดว่า:

    ผมทำโปรแกรมร้านขายเครื่องใช้ไฟฟ้า ผมไม่ได้ใช้ asp.net ใช้ vs2008 + SQLSev 2005 อยากทราบวิธีสร้างรายงานสินค้าขายดี 5 อันดัอดับ ช่วยสอนหน่อยครับ เริ่มต้นยังไงไม่เป็นเลยครับ

  9. MookMik พูดว่า:

    ขอบคุนมากค่า … ได้ความรู้ และตอนนี้ต้องการการสร้างรายงานอยู่พอดีเลยค่า ละเอียดมาก แต้งกิ้ว ๆ มาก ๆ ค่า

  10. JOY พูดว่า:

    ขอบคุณมากค่ะ ได้นำความรู้ไปใช้เลยค่ะ ขอบคุณมากๆนะค่ะ ^^

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

In Archive
%d bloggers like this: