ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 1446|ตอบกลับ: 2

ตัวอย่างการสร้างรายงานจาก คอนโทรล์ค่าย DevExpress

[คัดลอกลิงก์]

11

กระทู้

31

โพสต์

427

เครดิต

ผู้ดูแลบอร์ด

Rank: 7Rank: 7Rank: 7

เครดิต
427

แก้ไขครั้งสุดท้ายโดย puklit เมื่อ 2021-10-12 10:50

สวัสดีสมาชิกทุก ๆ ท่าน

วันนี้ผมจะมาขอนำเสนอการสร้างรายงานโดยการใช้คอนโทรล์ของค่าย DevExpress ดังนี้
- ChartControl
- PivotGrid
- GridControl, GridView

โดยลำดับของการเรียกแสดงรายงานตามเงือนไขผมได้เอามาจากระบบ SAP มาประยุกต์ใช้งานคือ
1. Multiselect

2. ALV grid control ของค่าย SAP ที่สามารถปรับแต่ง Layout และสามารถบันทึกรูปแบบ และโหลดมาใช้งานได้ โดยไม่ต้องเสียเวลามาจัด Layout ของ Grid ใหม่ทุกๆ ครั้งที่ต้องการข้อมูล


ทีนี้เรามาเข้าเนื้อนหาและลำดับการเรียกรายงานแบบมีเงือนไข (ผมใช้คอนโทรล์ของค่าย DevExpress ประยุกต์ใช้งาน) เริ่มจาก
1. ผู้ใช้งานระบุเงือนไขเข้ามา (แล้วกดปุ่มโหลดข้อมูล) ก่อนโหลดรายงานมาแสดง


สำหรับในการระบุเงื่อนไขนั้นผมได้สร้างฟอร์มกลางเข้ามารับค่าฟิลด์ของตารางและเงือนไขรวมถึงตัว Operator สำหรับฟิล์ดนั้น เข้ามาเก็บไว้ใน DataTable ที่สร้างขึ้นนมาดังนี้
โดยรูปแบบการระบุเงือนไขนี้ผมประยุกต์การใช้งานมาจาก Multiselection ของระบบ SAP สามารถระบุค่าและเลือกตัว Operator ของฟิลด์นั้นๆ ได้
ตัวอย่าง =, >, <, >=, <=, ไม่=, ไม่>, ไม่<, ไม่>=, ไม่<=, LIKE, ไม่LIKE, BETWEEN, ไม่BETWEEN เป็นต้น
ซึ่งผมได้เขียน เข้ามาเก็บไว้ใน DataTable ที่สร้างขึ้นนมา แล้วนำค่าเหล่านั้นมาสร้างในรูปแบบ Dynamic sql query อีกครั้ง



ตัวอย่างโค้ดที่เลือกค่าพารามิเตอร์ของแต่ละฟิลด์ เพื่อนำมาเก็บไว้ใน DataTable ที่สร้างไว้ก่อนนำไปสร้างคำสั่ง Dynamic sql query สำหรับโหลดข้อมูลจากฐานข้อมูล
  1. // เลือกเงื่อนไขสำหรับสร้าง Sql conditions
  2.         private void BT_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
  3.         {

  4.             ButtonEdit txt = sender as ButtonEdit;

  5.             // กำหนดปุ่มที่เลือก ลบ / เลือก
  6.             switch (e.Button.Index)
  7.             {

  8.                 case 0: // เคลีย์ค่าเงื่อนไข

  9.                     dtSQLConditions.Rows.OfType<DataRow>().Where(r => r["FieldName"].ToString() == txt.Tag.ToString()).ToList().ForEach(r => r.Delete());
  10.                     dtSQLConditions.AcceptChanges();
  11.                     txt.Text = string.Empty;
  12.                     break;

  13.                 case 1: // เลือกเงือนไข

  14.                     FSQL_Condition frm = new FSQL_Condition();
  15.                     Prm_SQL prm = new Prm_SQL();

  16.                     switch (txt.Tag.ToString())
  17.                     {

  18.                         case "Current_WC": prm.SqlLine(frm, txt, dtSQLConditions, lbCurrent_WC.Text); break;
  19.                         case "R3_Workcenter": prm.SqlWorkCenter(frm, txt, dtSQLConditions, lbR3_Workcenter.Text); break;
  20.                         case "Process_Name": prm.SqlProcess(frm, txt, dtSQLConditions, lbProcess_Name.Text); break;
  21.                         case "SAPOpr_ID2": prm.SqlSAPOperation(frm, txt, dtSQLConditions, lbSAPOpr_ID2.Text); break;
  22.                         case "AsstLeader": prm.SqlAsstLeader(frm, txt, dtSQLConditions, lbAsstLeader.Text); break;
  23.                         case "Leader": prm.SqlLeader(frm, txt, dtSQLConditions, lbLeader.Text); break;
  24.                         case "Supervisor": prm.SqlSupervisor(frm, txt, dtSQLConditions, lbSupervisor.Text); break;
  25.                         case "Manager": prm.SqlManager(frm, txt, dtSQLConditions, lbManager.Text);break;
  26.                         case "Sec_Name": prm.SqlSection(frm, txt, dtSQLConditions, lbSec_Name.Text);break;
  27.                         case "Div_Name": prm.SqlDivision(frm, txt, dtSQLConditions, lbDiv_Name.Text); break;
  28.                         case "Dep_Name": prm.SqlDepartment(frm, txt, dtSQLConditions, lbDep_Name.Text); break;
  29.                         case "Plant_Code": prm.SqlPlantCode(frm, txt, dtSQLConditions, lbPlant_Code.Text); break;

  30.                         default: break;

  31.                     }

  32.                     // ตรวจสอบการระบุเงื่อนไข

  33.                     if (frm.IsExecute == true)
  34.                     {
  35.                         sql.SQLCreateConditions(dtSQLConditions, txt.Name.Replace("txt", string.Empty), txt); // สร้างเงื่อนไขใหม่ตามที่ผู้ใช้งานเลือก
  36.                     }

  37.                     break;

  38.                 default: break;
  39.             }

  40.         }
คัดลอกไปที่คลิปบอร์ด



2. เมื่อกดปุ่มโหลดรายงานผู้ใช้งานจะได้ข้อมูลมา 3 ส่วนดังนี้
2.1 Chart report


ตัวอย่างโค้ดที่ผมเขียนใช้งาน (ต้องขออภัยเป็นภาษา C#)
  1. private void Chart_Total()
  2.         {

  3.             ClsData cdt = new ClsData();

  4.             string sqlstr = @"SELECT tbl.*
  5.                               INTO EmpDirect
  6.                               FROM
  7.                                  (
  8.                                         SELECT Direct_Flag, SUM(Totals) AS Totals
  9.                                         FROM MAN_Employee_DataActived
  10.                                         GROUP BY Direct_Flag, Current_WC, R3_Workcenter, Process_Name, SAPOpr_ID2, AsstLeader, Leader, Supervisor, Manager, Sec_Name, Div_Name, Dep_Name, Plant_Code
  11.                                         {0}
  12.                                   ) tbl

  13.                                SELECT Direct_Flag, SUM(Totals) AS Totals FROM EmpDirect GROUP BY Direct_Flag
  14.                                DROP TABLE EmpDirect";

  15.             DataTable dt = new DataTable();
  16.             cdt.Get_DataToDataTable(dt, string.Format(sqlstr, sql.SQLCommandStr(dtSQLConditions, ClsSql.Clause.HAVING, ClsSql.SQLOperator.AND)));

  17.             ChartControl crt = chartTotal;
  18.             crt.DataSource = dt;

  19.             crt.Series[0].ArgumentDataMember = "Direct_Flag";
  20.             crt.Series[0].ValueDataMembers.AddRange(new string[] { "Totals" });
คัดลอกไปที่คลิปบอร์ด



2.2 PivotGrid (ตัวนี้ผมจะเปิดเป็นรายงานในรูปแบบอิสระที่ผู้ใช้งานสามารถลากวางข้อมูลในรูปแบบที่ต้องการ แล้วสามารถบันทึกเป็นรูปแบบ และโหลดมาใช้งานเองได้)


ตัวอย่างโค้ด
  1. private void Show_PivotData()
  2.         {

  3.             ClsData cdt = new ClsData();
  4.             string sqlstr = @"SELECT Gender, Direct_Flag, Emp_Type, Current_WC, Process_Name, SAPOpr_ID2, R3_Workcenter,
  5.                                      Sec_Name, Div_Name, Dep_Name, AsstLeader, Leader, Supervisor, Manager, Plant_Code, Totals
  6.                               FROM View_MAN_Employee_DataActived
  7.                               {0}";

  8.             DataTable rpt = new DataTable();
  9.             cdt.Get_DataToDataTable(rpt, string.Format(sqlstr, sql.SQLCommandStr(dtSQLConditions, ClsSql.Clause.WHERE, ClsSql.SQLOperator.AND)));
  10.             if (rpt.Rows.Count > 0) { IsContainData = true; } else { IsContainData = false; }
  11.             pvgData.DataSource = rpt;
  12.             SetPivotGrid();

  13.         }
คัดลอกไปที่คลิปบอร์ด


2.3 GridView (Raw data)


ตัวอย่างโค้ด
  1. ClsGridview cgv = new ClsGridview();

  2.             string sqlstr = @"SELECT Emp_ID, FullName, NickName, Gender, Direct_Flag, Emp_Type, Hiredate, Probation, Grade,
  3.                                      Position_NameEN, WorkExp, Current_WC, Process_Name, SAPOpr_ID2, R3_Workcenter,
  4.                                      Sec_Name, Div_Name, Dep_Name, AsstLeader, Leader, Supervisor, Manager, Plant_Code
  5.                               FROM View_MAN_Employee_DataActived
  6.                               {0}";

  7.             cgv.Get_DataToGridview(string.Format(sqlstr, sql.SQLCommandStr(dtSQLConditions, ClsSql.Clause.WHERE, ClsSql.SQLOperator.AND)), "View_MAN_Employee_DataActived", gcData);
  8.             SetGridRawDB();
คัดลอกไปที่คลิปบอร์ด


ซึ่งโค้ดตัวอย่างนี้จะถูกเรียกใช้งานจาก Class ที่ผมสร้างขึ้นมาอีกครั้งเพื่อลดการเขียนซ้ำและสะดวกในการพัฒนา

3. การสร้าง Option สำหรับบันทึกและโหลดรูปแบบ ที่เราสร้างเอาไว้ขึ้นมาใช้งาน
ไม่ว่าจะเป็น PivotGrid, GridView, BannedGrid ของค่าย DevExpress จะมีคุณสมบัติสามารถบันทึกและโหลดรูปแบบ ที่เรากำหนดเอาไว้มาใช้งานได้เหมือนกับ ALV GridControl ของระบบ SAP
ซึ่งค่าของรูปแบบนี้จะถูกจัดเก็บในรูปแบบ XML ซึ่งเราสามารถนำค่า XML ในี้จัดเก็บลงในฐานข้อมูลได้ ในที่นี้ผมได้เก็บลงใน SQL Server ดังนี้




ตัวอย่างฟอร์มที่ผมใช้ในการบันทึกรูปแบบของ PivotGrid, GridView, BannedGrid

ตัวอย่างโค้ด
  1. private void btSLayout_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  2.         {

  3.             FLayout_Save frm = new FLayout_Save();

  4.             // 2= PivodGrid, 3=GridView
  5.             switch (TabPageIndex)
  6.             {
  7.                 case 2: frm.LayoutParameters(pvgData, Grid.PivotGrid, this.Name); break;
  8.                 case 3: frm.LayoutParameters(gvData, Grid.GridView, this.Name); break;
  9.                 default: break;
  10.             }

  11.             frm.ShowDialog();

  12.         }
คัดลอกไปที่คลิปบอร์ด


ตัวอย่างฟอร์มที่ผมใช้ในการโหลดรูปแบบของ PivotGrid, GridView, BannedGrid


ตัวอย่างโค้ด
  1. private void btCLayout_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  2.         {
  3.             FLayout_Choose frm = new FLayout_Choose();

  4.             // 2= PivodGrid, 3=GridView
  5.             switch (TabPageIndex)
  6.             {
  7.                 case 2: frm.LayoutParameters(pvgData, Grid.PivotGrid, this.Name); break;
  8.                 case 3: frm.LayoutParameters(gvData, Grid.GridView, this.Name); break;
  9.                 default: break;
  10.             }

  11.             frm.ShowDialog();

  12.         }
คัดลอกไปที่คลิปบอร์ด


4. การนำข้อมูลจาก PivotGrid, GridView, BannedGrid เพื่อบันทึกไปยังไฟล์ต่างๆ เช่น .txt, .csv, .xls, .xlsx, .pdf เป็นต้น สามารถดูได้จากคู่มือของ DevExpress
สำหรับด้านล่างนี้ผมได้ออกแบบหน้าตาฟอร์มสำหรับนำออกข้อมูลของไฟล์ต่างๆ ต่างนี้


ตัวอย่างโค้ด
  1. private void btExportFile_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  2.         {

  3.             FExportFile frm = new FExportFile();

  4.             // 2= PivodGrid, 3=GridView
  5.             switch (TabPageIndex)
  6.             {
  7.                 case 2: frm.Export(pvgData); break;
  8.                 case 3: frm.Export(gvData); break;
  9.                 default: break;
  10.             }

  11.             frm.ShowDialog();
  12.         }
คัดลอกไปที่คลิปบอร์ด


หวังว่าคงเป็นประโยชน์ต่อท่านสมาชิกหลายๆ ท่านเพื่อเป็นแนวทางในการสร้างรายงาน
หรือหากสมาชิกท่านใดมีแนวทางอื่นๆ ก็สามารถแลกเปลี่ยนประสบการณ์กันได้ครับ
ทั้งหมดนี้เป็นส่วนที่ผมประยุกต์มาสำหรับใช้งานในระบบจริง และตัวผมเองไม่่ได้เรียนมาสายนี้โดยตรง
อาศัยเริ่มต้นจาก Excel , Excel + VBA, VB จากเว็ปบอร์ดของอาจารย์ทองก้อน และต่อยอดมาจนถึงทุกวันนี้ครับ

ขอบคุณครับ



ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x

11

กระทู้

31

โพสต์

427

เครดิต

ผู้ดูแลบอร์ด

Rank: 7Rank: 7Rank: 7

เครดิต
427
 เจ้าของ| โพสต์ 2021-10-12 11:10:25 | ดูโพสต์ทั้งหมด

แก้ไขครั้งสุดท้ายโดย puklit เมื่อ 2021-10-12 11:23

สำหรับการเขียนรูปแบบคำสั่ง SQL Command แบบ Dynamic sql query ผมจะยังไม่แจกโค้ดนะครับ แต่จะให้เป็นแนวทางว่าผมให้มันเขียนคำสั่งตามเงือนไขที่เลือกอย่างไร
ตัวอย่างโค้ด
  1. private void btLoad_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  2.         {

  3.             string sqlstr = @"SELECT Emp_ID, FullName, NickName, Gender, Direct_Flag, Emp_Type, Hiredate, Probation, Grade,
  4.                                      Position_NameEN, WorkExp, Current_WC, Process_Name, SAPOpr_ID2, R3_Workcenter,
  5.                                      Sec_Name, Div_Name, Dep_Name, AsstLeader, Leader, Supervisor, Manager, Plant_Code
  6.                               FROM View_MAN_Employee_DataActived
  7.                               {0}";


  8.             string str = string.Format(sqlstr, sql.SQLCommandStr(dtSQLConditions, ClsSql.Clause.WHERE, ClsSql.SQLOperator.AND));

  9.             XtraMessageBox.Show(str);

  10.         }
คัดลอกไปที่คลิปบอร์ด



ตัวอย่างฟอร์มรับค่าฟิลด์และเงื่อนไข


ผลลัพธ์



ที่มาของที่ผมไม่เขียน SQL แบบตายตัว เพราะผมมีเงื่อนไขแบบไม่จำกัดจากผู้ใช้งาน และบางรายงานผมมีเงือนไขมากกว่า 10 ฟิลด์ขึ้นไป
ซึ่งการเขียนแบบให้ผู้ใช้งาน สามารถระบุเงื่อนไข จะมีผลดีดังต่อไปนี้
1. ผู้ใช้งานได้ผลลัพธ์ หรือข้อมูลตรงประเด็นและตรงกับความต้องการมากที่สุด
2. ลดภาระการโหลดข้อมูล แทนที่จะโหลดข้อมูลมาทั้งหมดและเลือกเอาเฉพาะที่ต้องการ เป็นผลดีต่อ การทำงานของเครื่อง Server และระบบเครือข่ายด้วย

ตัวอย่าง เงือนไขที่มากกว่า 10 ฟิลด์ ก่อนโหลดรายงาน


ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x

0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2022-2-24 00:03:41 | ดูโพสต์ทั้งหมด

ขอบคุณคัพ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-3-29 20:09 , Processed in 0.184572 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้