/// <summary>Step 5: Xây dựng Query Buider cho việc tìm kiếm
        /// Xây dựng một QueryBuilder từ những chọn lựa trong phần filter.
        /// Từ QueryBuilder này ta có thể lấy được dữ liệu thỏa điều kiện.
        /// Nếu hỗ trợ duyệt thì trong câu truy vấn trả về 
        /// phải có cột là DUYET_BIT
        /// </summary>
        public override QueryBuilder PLBuildQueryFilter()
        {
            try
            {

                //if (filterControl1.FilterString != "")
                //    filterControl1.FilterCriteria = PrepairFilter(filterControl1.FilterCriteria);
                FilterControlHelper fch = new FirebirdFilterToSQLStatement(filterControl1);
                SQLDATA sqlData = fch.GetSQLFilter(true, true);
                DataSet ds = null;
                if (sqlData.Filters != "")
                {

                    ds = filterCase.DataSetFilterFromDatabase(sqlData);
                }
                else ds = HelpDB.getDatabase().LoadDataSet(UpdateRow());
                if (ds != null && ds.Tables.Count > 0)
                {
                    gridControlMaster.DataSource = ds.Tables[0];
                   // filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.NGAY_PHAT_DAU_TIEN]);
                    //filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.THOI_HAN_BAN_QUYEN_DISPLAY]);

                }
            }
            catch
            {

            }

            return null;
        }
 private void sbApply_Click(object sender, EventArgs e)
 {
     try
     {
         //Dừng Firebird Query
         FilterControlHelper fch = new FirebirdFilterToSQLStatement(filterControl1);
         SQLDATA sqlData = fch.GetSQLFilter(true);
         DataSet ds = ObjFilter.DataSetFilterFromDatabase(sqlData);
         if (hook != null)
         {
             hook(ds);
         }
         gridControlQL.DataSource = ds.Tables[0];
     }
     catch (Exception ex) {
         PLException.AddException(ex);
     }
 }
        /// <summary>Step 5: Xây dựng Query Buider cho việc tìm kiếm
        /// Xây dựng một QueryBuilder từ những chọn lựa trong phần filter.
        /// Từ QueryBuilder này ta có thể lấy được dữ liệu thỏa điều kiện.
        /// Nếu hỗ trợ duyệt thì trong câu truy vấn trả về 
        /// phải có cột là DUYET_BIT
        /// </summary>
        public override QueryBuilder PLBuildQueryFilter()
        {
            if (isAdvance)
            {
                try
                {

                    //if (filterControl1.FilterString != "")
                    //    filterControl1.FilterCriteria = PrepairFilter(filterControl1.FilterCriteria);
                    FilterControlHelper fch = new FirebirdFilterToSQLStatement(filterControl1);
                    SQLDATA sqlData = fch.GetSQLFilter(true, true);
                    DataSet ds = null;
                    if (sqlData.Filters != "")
                    {

                        ds = filterCase.DataSetFilterFromDatabase(sqlData, "category, noi_dung");
                    }
                    else
                    {
                        QueryBuilder query = new QueryBuilder(UpdateRow());
                        query.addCondition("1=1");
                        if (this.ASCSortClause != "")
                            query.setAscOrderBy(ASCSortClause);
                        if (this.DESCSortClause != "")
                            query.setDescOrderBy(DESCSortClause);
                        ds = HelpDB.getDatabase().LoadDataSet(query);
                    }
                    if (ds != null && ds.Tables.Count > 0)
                    {
                        gridControlMaster.DataSource = ds.Tables[0];
                        // filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.NGAY_PHAT_DAU_TIEN]);
                        //filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.THOI_HAN_BAN_QUYEN_DISPLAY]);

                    }
                }
                catch
                {

                }
                return null;

            }
            else
            {
                QueryBuilder filter = null;
                string sql = UpdateRow();
                filter = new QueryBuilder(sql);
                filter.addSoPhieu("CT." + CHUONG_TRINH.MA_CT, MaCT.Text);
                filter.addLike("LOWER(CT." + CHUONG_TRINH.NOI_DUNG + ")", NoiDung.Text.ToLower());
                AppCtrl.addID(filter, "CT." + CHUONG_TRINH.TIET_MUC, TietMuc);
                AppCtrl.addFilterFromTo(filter, "PM." + CHUONG_TRINH_POST_MASTER.NGAY_NHAP, ngayNhap);
                AppCtrl.addID(filter, "PM." + CHUONG_TRINH_POST_MASTER.PHONG_BAN, PhongBan);
                AppCtrl.addID(filter, "PM." + CHUONG_TRINH_POST_MASTER.NGUOI_NHAP, NguoiNhap);
                AppCtrl.addID(filter, "PM." + CHUONG_TRINH_POST_MASTER.POST_MASTER_ID, PostMaster);
                AppCtrl.addID(filter, "PM." + CHUONG_TRINH_POST_MASTER.LOAI_LUU_TRU, LoaiLuuTru);
                if (!SoDKCBHD._IsNotCheckAnyOrCheckedAll)
                {
                    filter.addCondition("exists(select chd.ctpm_hd_id from chuong_trinh_post_Master_hd chd where chd.ctpm_id=pm.ctpm_id and chd.so_dkcb_hd in " + SoDKCBHD._getStrSelectedIDs() + ")");
                }

                string w2 = "";
                if (TapSoTu.Value > 0)
                {
                    w2 += " AND bm.tap_so >= " + TapSoTu.Value;
                }
                if (TapSoDen.Value > 0)
                {
                    w2 += " AND bm.tap_so <=" + TapSoDen.Value;
                }

                if (TenTap.Text.Trim() != "")
                {
                    w2 += " AND lower(bm.ten_tap) like '%" + TenTap.Text.Trim().ToLower() + "%'";
                }

                if (w2 != "")
                {
                    filter.addCondition(string.Format("exists(select bm.bm_id from bien_muc bm where (is_delete='N' or is_delete is null) and bm.ctpm_id=pm.ctpm_id {0})", w2));
                }
                filter.addCondition("1=1");
                if (this.ASCSortClause != "")
                    filter.setAscOrderBy(ASCSortClause);
                if (this.DESCSortClause != "")
                    filter.setDescOrderBy(DESCSortClause);
                return filter;
            }
        }
        /// <summary>Step 5: Xây dựng Query Buider cho việc tìm kiếm
        /// Xây dựng một QueryBuilder từ những chọn lựa trong phần filter.
        /// Từ QueryBuilder này ta có thể lấy được dữ liệu thỏa điều kiện.
        /// Nếu hỗ trợ duyệt thì trong câu truy vấn trả về 
        /// phải có cột là DUYET_BIT
        /// </summary>
        public override QueryBuilder PLBuildQueryFilter()
        {
            error.ClearErrors();
            gridViewMaster.ClearGrouping();
            GridColumn col1 = null;
            GridColumn col2 = null;
            GridColumn col3 = null;
            foreach (GridSummaryItem item in timkiem.CotNoiDung.SummaryItem.Collection)
            {
                item.SummaryType = DevExpress.Data.SummaryItemType.None;
            }
            if (TruongCap1.Text != string.Empty ||
               TruongCap2.Text != string.Empty ||
               TruongCap3.Text != string.Empty)
            {
                gridViewMaster.OptionsView.ShowFooter = true;
            }
            foreach (CheckedListBoxItem item in ckcCotHienThi.Items)
            {
                if (!(item.Value is BandedGridColumn)) continue;
                ((BandedGridColumn)item.Value).Visible = item.CheckState == System.Windows.Forms.CheckState.Checked;
            }
            if (TruongCap1.Text != string.Empty)
            {
                col1 = gridViewMaster.Columns[(int)TruongCap1._getSelectedID()];
                col1.Group();
                col1.Visible = true;
            }
            if (TruongCap2.Text != string.Empty)
            {
                if (TruongCap2.Text != TruongCap1.Text)
                {
                    col2 = gridViewMaster.Columns[(int)TruongCap2._getSelectedID()];
                    col2.Group();
                    col2.Visible = true;
                }
                else TruongCap2.SetError(error, "Trường thống kê này đã được sử dụng!");
            }
            if (TruongCap3.Text != string.Empty)
            {
                if (TruongCap3.Text != TruongCap1.Text && TruongCap3.Text != TruongCap2.Text)
                {
                    col3 = gridViewMaster.Columns[(int)TruongCap3._getSelectedID()];
                    col3.Group();
                    col3.Visible = true;
                }
                else TruongCap3.SetError(error, "Trường thống kê này đã được sử dụng!");
            }

            try
            {

                //if (filterControl1.FilterString != "")
                //    filterControl1.FilterCriteria = PrepairFilter(filterControl1.FilterCriteria);
                FilterControlHelper fch = new FirebirdFilterToSQLStatement(filterControl1);
                SQLDATA sqlData = fch.GetSQLFilter(true, true);
                DataSet ds = null;
                if (sqlData.Filters != "")
                {

                    ds = filterCase.DataSetFilterFromDatabase(sqlData);
                }
                else ds = HelpDB.getDatabase().LoadDataSet(UpdateRow());
                if (ds != null && ds.Tables.Count > 0)
                {
                    gridControlMaster.DataSource = ds.Tables[0];
                    filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.NGAY_PHAT_DAU_TIEN]);
                    filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.THOI_HAN_BAN_QUYEN_DISPLAY]);

                }
            }
            catch
            {

            }

            SetSumary(col1);
            SetSumary(col2);
            SetSumary(col3);
            return null;
        }
        /// <summary>Step 5: Xây dựng Query Buider cho việc tìm kiếm
        /// Xây dựng một QueryBuilder từ những chọn lựa trong phần filter.
        /// Từ QueryBuilder này ta có thể lấy được dữ liệu thỏa điều kiện.
        /// Nếu hỗ trợ duyệt thì trong câu truy vấn trả về 
        /// phải có cột là DUYET_BIT
        /// </summary>
        public override QueryBuilder PLBuildQueryFilter()
        {
            //QueryBuilder filter = new QueryBuilder(UpdateRow());
            //filter.addCondition("1=1");
            //filter.setDescOrderBy(BIEN_MUC.NGAY_CAP_NHAT);
            //CotTietMuc.GroupIndex = 0;
            //CotNoiDung.GroupIndex = 1;l
            // return filter;
            try
            {

                //if (filterControl1.FilterString != "")
                //    filterControl1.FilterCriteria = PrepairFilter(filterControl1.FilterCriteria);
                FilterControlHelper fch = new FirebirdFilterToSQLStatement(filterControl1);
                SQLDATA sqlData = fch.GetSQLFilter(true,true);
                DataSet ds = null;
                if (sqlData.Filters != "")                {

                    ds = filterCase.DataSetFilterFromDatabase(sqlData);
                }
                else ds = HelpDB.getDatabase().LoadDataSet(UpdateRow());
                if (ds != null && ds.Tables.Count > 0)
                {
                    gridControlMaster.DataSource = ds.Tables[0];
                    filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.NGAY_PHAT_DAU_TIEN]);
                    filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.THOI_HAN_BAN_QUYEN_DISPLAY]);

                }
            }
            catch
            {

            }

            return null;
        }
        /// <summary>Step 5: Xây dựng Query Buider cho việc tìm kiếm
        /// Xây dựng một QueryBuilder từ những chọn lựa trong phần filter.
        /// Từ QueryBuilder này ta có thể lấy được dữ liệu thỏa điều kiện.
        /// Nếu hỗ trợ duyệt thì trong câu truy vấn trả về 
        /// phải có cột là DUYET_BIT
        /// </summary>
        public override QueryBuilder PLBuildQueryFilter()
        {
            if (isAdvance)
            {
                try
                {

                    //if (filterControl1.FilterString != "")
                    //    filterControl1.FilterCriteria = PrepairFilter(filterControl1.FilterCriteria);
                    FilterControlHelper fch = new FirebirdFilterToSQLStatement(filterControl1);
                    SQLDATA sqlData = fch.GetSQLFilter(true, true);
                    DataSet ds = null;
                    if (sqlData.Filters != "")
                    {

                        ds = filterCase.DataSetFilterFromDatabase(sqlData, "category, noi_dung");
                    }
                    else
                    {
                        QueryBuilder query = new QueryBuilder(UpdateRow());
                        query.addCondition("1=1");
                        if (this.ASCSortClause != "")
                            query.setAscOrderBy(ASCSortClause);
                        if (this.DESCSortClause != "")
                            query.setDescOrderBy(DESCSortClause);
                        ds = HelpDB.getDatabase().LoadDataSet(query);
                    }
                    if (ds != null && ds.Tables.Count > 0)
                    {
                        gridControlMaster.DataSource = ds.Tables[0];
                        // filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.NGAY_PHAT_DAU_TIEN]);
                        //filterControl1.FilterColumns.Remove(filterControl1.FilterColumns[BIEN_MUC.THOI_HAN_BAN_QUYEN_DISPLAY]);

                    }
                }
                catch
                {

                }
                return null;

            }
            else
            {
                QueryBuilder filter = null;
                string sql = UpdateRow();
                filter = new QueryBuilder(sql);
                filter.addLike("LOWER(" + CHUONG_TRINH.NOI_DUNG + ")", NoiDung.Text.ToLower());
                filter.addLike("LOWER(" + CHUONG_TRINH.TEN_GOC + ")", TenGoc.Text.ToLower());
                filter.addLike("LOWER(" + CHUONG_TRINH.CATEGORY + ")", Category.Text.ToLower());
                AppCtrl.addID(filter, CHUONG_TRINH.TIET_MUC, TietMuc);
                AppCtrl.addID(filter, CHUONG_TRINH.DON_VI_CUNG_CAP, DonViCungCap);
                AppCtrl.addFilterFromTo(filter, BIEN_MUC.NAM_SAN_XUAT, NamSXTu.Value, NamSXDen.Value);
                long[] IDs = QuocGia._getSelectedIDs();
                if (IDs.Length > 0 && IDs.Length < QuocGia.Properties.GetItems().Count)
                {
                    string cond = "(";
                    foreach (long id in IDs)
                    {
                        cond += BIEN_MUC.NUOC_SAN_XUAT + " like '%," + id + ",%' or ";
                    }
                    cond = cond.TrimEnd(' ', 'r', 'o');
                    cond = cond += ")";
                    filter.addCondition(cond);
                }
                AppCtrl.addID(filter, CHUONG_TRINH.BAN_QUYEN_THUOC, BanQuyenThuoc);
                filter.addDateFromTo(CHUONG_TRINH.BAN_QUYEN_DID_END, BQDTTNEndTu.DateTime, BQDTTNEndDen.DateTime);
                filter.addDateFromTo(CHUONG_TRINH.BAN_QUYEN_DTNN_END, BQDTNNEndTu.DateTime, BQDTNNEndDen.DateTime);
                AppCtrl.addFilterFromTo(filter, CHUONG_TRINH.TONG_SO_RUN, TongSoRunTu.Value, TongSoRunDen.Value);
                AppCtrl.addFilterFromTo(filter, CHUONG_TRINH.SO_LAN_DA_PHAT, SoRunDaDungTu.Value, SoRunDaDungDen.Value);
                AppCtrl.addFilterFromTo(filter, "(" + CHUONG_TRINH.TONG_SO_RUN + "-" + CHUONG_TRINH.SO_LAN_DA_PHAT + ")", SoRunConLaiTu.Value, SoRunConLaiDen.Value);
                AppCtrl.addFilterFromTo(filter, CHUONG_TRINH.NGAY_NHAP, ngayNhap);
                AppCtrl.addID(filter, CHUONG_TRINH.PHONG_BAN, PhongBan);
                filter.addIn(Alias + CHUONG_TRINH.IS_TRONG_KHO, AppCtrl.GetCheckedValues(TrongKho, true));
                string ftTimeslot = AppCtrl.getFilterFromTo("CTNPDT.TIMESLOT", TimeslotTu, TimeslotDen);
                if (ftTimeslot != "")
                {
                    filter.addCondition(string.Format(@"exists(select ctnpdt.ct_id from chuong_trinh_npdt   ctnpdt
                                                    where ctnpdt.timeslot is not null and ctnpdt.ct_id= ct.ct_id {0})", ftTimeslot));
                }
                string w1 = "";
                if (!LoaiLuuTru._IsNotCheckAnyOrCheckedAll)
                {
                    w1 += " AND " + CHUONG_TRINH_POST_MASTER.LOAI_LUU_TRU + " in " + LoaiLuuTru._getStrSelectedIDs();
                }
                if (!SoDKCBHD._IsNotCheckAnyOrCheckedAll)
                {
                    w1 += " AND exists(select chd.ctpm_hd_id from chuong_trinh_post_Master_hd chd where chd.ctpm_id=cp.ctpm_id and chd.so_dkcb_hd in " + SoDKCBHD._getStrSelectedIDs() + ")";

                }
                if (w1 != "")
                    filter.addCondition(string.Format(@"exists(select cp.ctpm_id from chuong_trinh_post_Master cp where (is_delete='N' or is_delete is null) and  cp.ct_id = ct.ct_id {0})", w1));

                string w2 = "";
                if (TapSoTu.Value > 0)
                {
                    w2 += " AND bm.tap_so >= " + TapSoTu.Value;
                }
                if (TapSoDen.Value > 0)
                {
                    w2 += " AND bm.tap_so <=" + TapSoDen.Value;
                }

                if (TenTap.Text.Trim() != "")
                {
                    w2 += " AND lower(bm.ten_tap) like '%" + TenTap.Text.Trim().ToLower() + "%'";
                }

                if (w2 != "")
                {
                    filter.addCondition(string.Format("exists(select bm.bm_id from bien_muc bm where (is_delete='N' or is_delete is null) and bm.ct_id=ct.ct_id {0})", w2));
                }

                filter.addCondition("1=1");
                if (this.ASCSortClause != "")
                    filter.setAscOrderBy(ASCSortClause);
                if (this.DESCSortClause != "")
                    filter.setDescOrderBy(DESCSortClause);
                return filter;
            }
        }