Hàm Compute() của DataTable dùng để tính toán các biểu thức

Trong lớp System.Data.DataTable của C# có hỗ trợ hàm Compute() dùng để tính toán giá trị các biểu thức như: sum, count, …thỏa một điều kiện nào đó.

Theo Góc Kinh Nghiệm dùng hàm Compute() này rất tiện lợi và nhanh chóng. Bạn không cần phải chạy vòng lập, kiểm tra điều kiện rồi ép kiểu dữ liệu, rất phiền phức.

Cú pháp:

Compute(expression, filter);

Trong đó:

  • expression: kiểu dữ liệu là string, là biểu thức dùng để tính toán.
  • filters: kiểu dữ liệu là string, là điểu kiện để giới hạn (lọc ra) số dòng cần tính toán cho biểu thức expression. Nếu truyền vào null, hàm Compute() sẽ tính toán trên tất cả các dòng của DataTable.

Hàm Compute() có kiểu trả về là object.

Ví dụ minh họa, Góc Kinh Nghiệm sử dụng VS2005 để chạy ví dụ này:

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MyProject
{
   public partial class FormSelectData : Form
   {
      public FormSelectData()
      {
         InitializeComponent();
         this.btnSum.Click += new EventHandler(btnSum_Click);
      }

      private void FormSelectData_Load(object sender, EventArgs e)
      {
         // Tạo ra 3 nhân viên cho đối tượng DataGridView tên grvData
         // Tạo đối tượng DataTable tên data
         DataTable data = new DataTable();

         // Đối tượng data có 3 cột: Mã nhân viên, tên nhân viên và giới tính
         data.Columns.Add("MaNhanVien", typeof(string));
         data.Columns.Add("TenNhanVien", typeof(string));
         data.Columns.Add("GioiTinh", typeof(string));
         data.Columns.Add("TroCap", typeof(long));

         // Khởi tạo 3 nhân viên cho đối tượng data
         // Nhân viên 1
         DataRow empployee1 = data.NewRow();
         empployee1["MaNhanVien"] = "NV01";
         empployee1["TenNhanVien"] = "Nguyễn Khánh Hưng";
         empployee1["GioiTinh"] = "Nam";
         empployee1["TroCap"] = "200000";
         data.Rows.Add(empployee1);

         // Nhân viên 2
         DataRow empployee2 = data.NewRow();
         empployee2["MaNhanVien"] = "NV02";
         empployee2["TenNhanVien"] = "Đoàn Thanh Thúy";
         empployee2["GioiTinh"] = "Nữ";
         empployee2["TroCap"] = "150000";
         data.Rows.Add(empployee2);

         // Nhân viên 3
         DataRow empployee3 = data.NewRow();
         empployee3["MaNhanVien"] = "NV03";
         empployee3["TenNhanVien"] = "Trần Xuân Vũ";
         empployee3["GioiTinh"] = "Nam";
         empployee3["TroCap"] = "730000";
         data.Rows.Add(empployee3);

         // Hiển thị dữ liệu lên DataGridVidew
         grvData.DataSource = data;
      }

      private void btnSum_Click(object sender, EventArgs e)
      {
         Sum((DataTable)grvData.DataSource);
      }

      private void Sum(DataTable pData)
      {
         object sum = pData.Compute("sum(TroCap)", "GioiTinh='Nam'");
         MessageBox.Show("Tổng tiền trợ cấp của  nhân viên nam là: " + sum + " đồng", "www.gockinhnghiem.com");
      }
   }
}

Chương trình thực hiện tính tổng tiền phụ cấp cùa nhân viên nam trong công ty.

Chạy chương trình, hình bên dưới:

Kết quả sau khi nhấn nút “Tổng trợ cấp”:

Chú ý: nếu bạn thay “GioiTinh=’Nam’ thành null trong hàm Compute() thì kết quả sẽ là 1,080,000 đồng thay vì 930,000 đồng, vì sẽ tính tổng phụ cấp của tất cả các nhân viên không phân biệt Nam hay Nữ

Theo Góc Kinh Nghiệm, bạn hãy vận dụng kiến thức về SQL của mình để làm cho hàm Compute() đa dạng và phong phú hơn, tận dụng tối đa nhé các bạn.

Góc Kinh Nghiệm chúc các bạn thành công!  :roll:

 


6 comments

  1. Hay lắm, thật sự hôm nay mình hàm này. Có hàm này giải quyết được rất nhiều việc
    Thank bạn nhiều !.

  2. cảm ơn bạn, rất hữu ích và ví dụ cụ thể. Có kèm theo source cho các newbie tải về test thì hay hơn nữa.

  3. ví dụ 1 bảng có 2 cột là SoLuong và DonGia, dùng hàm Compute() để tính tổng tiền( tổng tiền = SoLuong*DonGia) của tất cả các hàng thì viết như nào ạ. mình đã thử: Table.Compute(“Sum(SoLuong*DonGia”,””); nhưng ko đc

Leave a Reply

Your email address will not be published. Required fields are marked *