DTECH SST - Tài liệu kỹ thuật
  • CÀI ĐẶT DTECH
    • PHIÊN BẢN ĐÓNG GÓI
    • PHIÊN BẢN CUSTOMIZE
      • UPDATE LẬP TRÌNH SANG KHÁCH HÀNG
    • CHUYỂN MÁY CHỦ ĐÓNG GÓI
    • LỖI KẾT NỐI MÁY CHỦ
    • LỖI ATTACH DATA KHÔNG NHẬN
    • QUẢN LÝ TRẠM
    • BẢN SERVICE
      • KHÔNG NHẬN ĐỦ DATA KHI ĐĂNG NHẬP
      • KHÔNG TẠO ĐƯỢC DATA MỚI
      • KIỂM TRA KHÓA BẢN DỊCH VỤ
    • LỖI ĐĂNG NHẬP TRÊN MÁY CHỦ
    • LỖI ĐĂNG NHẬP MÁY TRẠM
    • CÀI ĐẶT SQL LỖI
    • XỬ LÝ LIÊN QUAN KEY HỆ THỐNG
    • Lỗi đọc thông tin phần cứng (Alias not found)
    • A severe error occurred on the current command
    • GỬI HƯỚNG DẪN CÀI ĐẶT XONG
    • PHIÊN BẢN CŨ
  • HÓA ĐƠN ĐIỆN TỬ
    • CHỮ KÝ SỐ - CKS
    • CẤU HÌNH KẾT NỐI
    • CÔNG CỤ LIÊN QUAN
    • TỔNG HỢP LỖI CHUNG
      • Update trạng thái huỷ cho chứng từ
      • update trạng thái hoá đơn effect
      • Xoá menu chuột phải bị lặp lại
    • TỔNG HỢP LỖI M-INVOICE
    • TỔNG HỢP LỖI VNPT
    • TỔNG HỢP LỖI VIETTEL
    • TỔNG HỢP LỖI BKAV
    • TỔNG HỢP LỖI VIN
    • TỎNG HỢP LỖI EASYINVOICE
    • LƯU Ý HOÁ ĐƠN ĐIỆN TỬ
  • LỖI THƯỜNG GẶP
    • LƯU BÁO LỖI
    • GIAO DIỆN VỠ FONT
  • CONVERT DỮ LIỆU
    • EFFECT 2.0
    • EFFECT 3.0 - 4.0 - 6.0
    • MISA VERSION DESKTOP
    • 3T SOFT
  • EXCEL
  • DANH MỤC
    • TẠO CỘT MÃ TĂNG TỰ ĐỘNG
    • XOÁ BỎ CÁC DÒNG TRÙNG
    • UPDATE BANKACCOUNT THEO TÀI KHOẢN KẾ TOÁN
    • MỞ RỘNG KÝ TỰ CHO CỘT MÃ
    • XỬ LÝ SỐ LƯỢNG QUY ĐỔI
    • UPDATE CHITIETTHEO
  • DỮ LIỆU KẾ TOÁN
    • CẬP NHẬT DIỄN GIẢI BÁN HÀNG
  • LƯƠNG
    • CÁC LỖI THƯỜNG GẶP
  • NGHIỆP VỤ
    • TEMP NOTE PHÂN TÍCH
  • PHIẾU IN NHẬP LIỆU
    • IN MẪU DẠNG GROUP
    • Merger các ô của cột trên các dòng giống nhau
    • CÂU LỆNH FORMAT PHIẾU IN
    • Lặp lại tiêu đề in + logo... ở trang 2
    • Lặp lại tiêu đề in
  • KẾT NỐI HTKK
    • MAPING TỪ 1 BÁO CÁO
    • MAPING TỪ NHIỀU BÁO CÁO
  • BÁO CÁO
    • CÔNG THỨC
    • BÁO CÁO DYNAMIC ĐỘNG
      • dynamic cột là tháng
    • LẤY ĐIỀU KIỆN LỌC BÁO CÁO
    • TEMP NOTE PHÂN TÍCH
    • ENTER CHI TIẾT
    • Trước tất cả - chặn khi thiếu điều kiện lọc
  • EFFECT
    • TRUYỀN ĐẨY DỮ LIỆU *
    • GHÉP TỆP U*.DBF
    • KIỂM TRA TRẠM
    • FONT
    • BÁO CÁO
  • SQL SERVER
    • Một số lỗi truy vấn SQL
    • Tài khoản sa của SQL SERVER
    • SQL Server blocked access (OpenRowset/OpenDatasource)
    • Chế độ xp_cmd shell trong SQL Server
    • Tạo Backup tự động SQL Express
    • SQL Script Kiểm tra
    • SQL Scritp Fix Database
    • Attach and Detach Database
    • SQL LOCAL DB
    • HÀM TÁCH SỐ VÀ CHỮ KHỎI CHUỖI
    • KHÔNG TÌM THẤY SQL CONFIG
    • identity_insert table
    • BACKUP - RESTORE SQL
    • Insert tables
    • Sửa lỗi cài đặt SQL
    • Shrink Database
    • Kiểm tra port SQL sử dụng
    • CONVERT DATATYPE SQL
    • Xóa bản ghi trùng trên bảng
    • Replication SQL SERVER
  • THUẾ
    • HÓA ĐƠN MUA VÀO LÀ HÓA ĐƠN BÁN HÀNG CÓ CẦN KÊ KHAI TRÊN TỜ KHAI THUẾ GTGT KHÔNG?
    • Kết chuyển thuế GTGT cuối kỳ
  • LỆNH CẦN BIẾT
  • CÔNG CỤ KHÁC
    • RADMIN VPN
      • CÀI ĐẶT RADMIN
      • KIỂM TRA RADMIN
      • Sửa lỗi Bạn bị cấm ( You are banned )
      • Tắt Auto Metric Radmin VPN
      • Mô hình hoạt động của Radmin VPN
    • Tailscale VPN
  • Cài đặt Google Drive để backup dữ liệu
  • GIÁ THÀNH
    • NÔNG NGHIỆP - TRỒNG TRỌT
      • CÂY TRỒNG 1 LẦN, THU HOẠCH NHIỀU LẦN
      • CÂY TRỒNG LÂU NĂM
      • CÂY TRỒNG NGẮN NGÀY
  • 📶MẠNG LAN - INTERNET
  • KIẾN THỨC PHẦN CỨNG MÁY TÍNH
  • KIỂM TRA MÁY TÍNH
  • WINDOWS SERVER
    • WMI Repository
  • Chữ ký số
    • XOÁ DANH SÁCH CKS CŨ
  • Hướng dẫn tạo SSL/TLS miễn phí với OpenSSL và Let’s Encrypt
Powered by GitBook
On this page
  • 1. TIỀN XỬ LÝ
  • 2. XỬ LÝ CÁC CỘT TRONG CÔNG THỨC - ẨN HIỆN, THỨ TỰ...
  • 3. TRƯỚC TẤT CẢ - KQKD KHOẢN MỤC + PHÒNG BAN
  • 4. HẬU XỬ LÝ - KQKD KHOẢN MỤC + PHÒNG BAN
  1. BÁO CÁO

BÁO CÁO DYNAMIC ĐỘNG

1. TIỀN XỬ LÝ

// Some code

public DataTable DMain(DataTable dtColumns, DataRow drReport, FOR0025 formBaoCao)
	{
		//Viết code dưới dòng này(chỉnh sửa cấu trúc hiển thị báo cáo)
		/*
		- xử lý vấn đề bên nợ 154: đối ứng với 62,154 trong kỳ
		- 01 tkdoiung, có 2 nhóm chính: đích danh và phân bổ
		*/
		string nhomcot = "";
		nhomcot = drReport["nhomcot"].ToString(); // lấy nhóm cột gõ tay nếu có
		// nhomcot(col1,col2)0#
		try {			
			#region: xử lý bên có 154

			if(dtTaocot != null && dtTaocot.Rows.Count != 0)
			{
				for (int i = 0; i < dtTaocot.Rows.Count; i++)
				{
					dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
					dr["ten"] = dtTaocot.Rows[i]["tkco"].ToString().Trim();
					dr["giatri"] = "case when vr.benno=0 then vr.psco else 0 end as TKC_"+ dtTaocot.Rows[i]["tkco"].ToString();
					dr["dieukien"] = "vr.tkco like '" + dtTaocot.Rows[i]["tkco"].ToString()+"' and trongky()";
					_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
				}
			}
			#endregion: xử lý bên có 154
		}
		
		catch(Exception ex) { MessageBox.Show(ex.Message); }
		drReport["nhomcot"] = nhomcot; // gán lại nhóm cột mới
		return dtColumns;
	}
	
public string dynamicTen(string strTen)
	{
		// strTen = "Tháng " + strTen;
		return strTen;
	}

	// hàm tính giá trị
	public string dynamicGiaTri(string strGiaTri)
	{
		// strGiaTri = "case when KhoanmucTien.tinhchat=1 or vr.khoanmucTien=0 then VR.PSNO - VR.PSCO else VR.PSCO - VR.PSNO end as TH_"+ strGiaTri.Trim();
		return strGiaTri;
	}

	// hàm tính điều kiện
	public string dynamicDieuKien(string strDieuKien)
	{
		// int thang = Convert.ToInt32(strDieuKien.Split('_')[0].ToString());
		// int nam = Convert.ToInt32(strDieuKien.Split('_')[1].ToString());
		// strDieuKien = "ngay>='"+ new DateTime(nam, thang , 01).ToString("MM/dd/yyyy")+"'";
		// strDieuKien += " and ngay<='"+ new DateTime(nam, thang , 01).AddMonths(1).AddDays(-1).ToString("MM/dd/yyyy")+"'";
		return strDieuKien;
	}
	
	public string dynamicTen1(string strTen)
	{
		strTen = "Tháng 1" ;
		return strTen;
	}

	// hàm tính giá trị
	public string dynamicGiaTri1(string strGiaTri)
	{
		strGiaTri = "0";
		return strGiaTri;
	}

	// hàm tính điều kiện
	public string dynamicDieuKien1(string strDieuKien)
	{
		strDieuKien = "1=1";
		return strDieuKien;
	}

2. XỬ LÝ CÁC CỘT TRONG CÔNG THỨC - ẨN HIỆN, THỨ TỰ...

// thêm cột khonghien. để ẩn hiện cột dynamic
if(!_Vari.FormChinh.dtDynamicReportColumn.Columns.Contains("khonghien"))
			_Vari.FormChinh.dtDynamicReportColumn.Columns.Add("khonghien", typeof(int));
// thêm cột stt, sắp xếp thứ tự cột dynamic			
if(!_Vari.FormChinh.dtDynamicReportColumn.Columns.Contains("stt"))
			_Vari.FormChinh.dtDynamicReportColumn.Columns.Add("stt", typeof(decimal));			

3. TRƯỚC TẤT CẢ - KQKD KHOẢN MỤC + PHÒNG BAN

// Some code
public DateTime TuNgay, DenNgay;
	public DataTable dtBaocaoPhu;
	public string nhomcot;
	public DataTable dtnhom = new DataTable();// bảng lưu dữ liệu phục vụ tính nhóm cột
	public DataTable DMain(DataTable dtColumns, DataRow drReport, FOR0025 formBaoCao)
	{
		// //Viết code dưới dòng này(chỉnh sửa cấu trúc hiển thị báo cáo)
		TuNgay = formBaoCao.TuNgay;
		DenNgay = formBaoCao.DenNgay;
		string where = formBaoCao.GetWhereCondition(false);//.Replace("where", "").Replace("WHERE", "");
		dtBaocaoPhu = formBaoCao.ChayBaoCao(0, "BCP_KQKD_B", "Daubc=0", where, formBaoCao.TuNgay, formBaoCao.DenNgay);
		formBaoCao.AddTable("BaoCaoPhu", dtBaocaoPhu);
		// nhomcot = "Chứng từ(chungtu,ngaychungtu)0#"+ nhomcot ;
		// drReport["nhomcot"] = nhomcot;

		#region: Tính toán nhóm cột cho báo cáo bsc par
		dtnhom.Columns.Add("From", typeof(string));
		dtnhom.Columns.Add("To", typeof(string));
		dtnhom.Columns.Add("TenNhom", typeof(string));
		formBaoCao.Tag = dtnhom;// lưu lại bảng dtnhom trên form báo cáo
		#endregion: Tính toán nhóm cột cho báo cáo bsc par
		return dtColumns;
	}

	// hàm tính giá trị
	public string dynamicRowGiaTri(string strGiaTri)
	{
		// MessageBox.Show("gt: "+ strGiaTri);
		return strGiaTri;
	}

	// 24217
	// 24219
	public string dynamicCol(string strGT, string ctCotTruoc, string tencottruoc, string tencotnay, DataRow drReportFix)
	{
		// strGT là giá trị cột giá trị của dòng trong dtDynamicReportColumn
		// ctCotTruoc là giá trị công thức cột trước cột đang động cột
		// tencottruoc là columnName cột trước cột tự động
		// tencotnay là cột hiện tại đang tự động tính nhằm replace các biểu thức tính sau cho chính xác tên cột mình cần xử lý
		// drReportFix là dòng dữ liệu trong báo cáo fix trường hợp không lấy cột liền trước có thể gọi các cột liền trước để lấy công thức cần dùng
		DataView dvBaocaophu = new DataView(dtBaocaoPhu);

		// tính toán lần đầu tiên bảng cần par
		if(_Vari.FormChinh.dtDynamicReportColumn.Rows.Count<= 0)
		{
			// DateTime tungay = formBaoCao.TuNgay;
			// DateTime denngay = formBaoCao.DenNgay;
			int sothang = (DenNgay.Year*12 + DenNgay.Month)-(TuNgay.Year*12 + TuNgay.Month)+1;
			DataTable dtPhongban = _Func.GetTable("phongban").Copy();
			DataView dvPhongban = new DataView(dtPhongban);
			DataRow dr;
			string nhomcotthang = "";// lưu text tiêu đề nhóm cột vào dòng đầu tiên bảng nhomcot
			for (int i = 0; i < sothang; i++)
			{
				dvBaocaophu.RowFilter = "thang =" + (TuNgay.AddMonths(i).Year*12 + TuNgay.AddMonths(i).Month).ToString(); // filter những phòng ban của tháng đang duyệt
				if(dvBaocaophu.Count != 0)
				{
					nhomcot += "Tháng_"+ TuNgay.AddMonths(i).Month.ToString()+"_"+ TuNgay.AddMonths(i).Year.ToString()+"(";
					DataTable dtBaocaophu0 = dvBaocaophu.ToTable(true, new string[] { "phongban" });
					if(dtBaocaophu0.Rows.Count != 0)
					{
						for (int iij = 0; iij < dtBaocaophu0.Rows.Count; iij++)
						{
							dvPhongban.RowFilter = "phongban = " + dtBaocaophu0.Rows[iij]["phongban"].ToString()+ (dtPhongban.Columns.Contains("donvi")?" and donvi="+ _Vari.Donvi:"");
							dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
							//dr["ten"] = dvPhongban[0]["ten"].ToString()+" Tháng_" + TuNgay.AddMonths(i).Month.ToString()+"_"+ TuNgay.AddMonths(i).Year.ToString();// điền tên cần hiển thị thêm trong report fix
							dr["ten"] = (string.IsNullOrWhiteSpace(dvPhongban[0]["ten"].ToString())? "Trống phòng ban" : dvPhongban[0]["ten"].ToString());// điền tên cần hiển thị thêm trong report fix
							dr["giatri"] = dtBaocaophu0.Rows[iij]["phongban"].ToString() +"_"+ (TuNgay.AddMonths(i).Year*12 + TuNgay.AddMonths(i).Month).ToString();// điền giá trị dùng để truyền đầu vào hàm dynamicCol để xử lý
							_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
						}
					}
				}

				nhomcotthang+= "Tháng "+ TuNgay.AddMonths(i).ToString("MM/yyyy").Trim()+"#";
			}

			// //_Func.TextEditer("nhomcotthang: "+nhomcotthang);
			// this.dtnhom.Rows.Add("", "", nhomcotthang);
			// // MessageBox.Show("1: "+ strGT +"#"+ctCotTruoc+"#"+tencottruoc);
		}

		// //MessageBox.Show("1: "+ strGT +"#"+ctCotTruoc+"#"+tencottruoc);
		// if(this.dtnhom.Rows.Count == 0 ||(this.dtnhom.Rows[this.dtnhom.Rows.Count-1]["from"].ToString().Trim()+"_"+this.dtnhom.Rows[this.dtnhom.Rows.Count-1]["to"].ToString().Trim() != tencottruoc.Trim() +"_"+tencotnay.Trim()))
		// this.dtnhom.Rows.Add(tencottruoc, tencotnay, "");
		if(string.IsNullOrWhiteSpace(strGT))
			return ctCotTruoc;
		else
			return ctCotTruoc.Replace(tencottruoc, tencotnay).Replace(",1)".Replace(" ", ""), ","+ (strGT.Split('_').Length!= 0? strGT.Split('_')[1].ToString():strGT) +")".Replace(" ", ""))
														.Replace(",-3)".Replace(" ", ""), ","+ (strGT.Split('_').Length!= 0? strGT.Split('_')[1].ToString():strGT) +")".Replace(" ", ""))
														.Replace(",-1".Replace(" ", ""), ","+ (strGT.Split('_').Length!= 0? strGT.Split('_')[0].ToString():strGT) +"".Replace(" ", ""))
														;
	}

	public string dynamicRowTenCpDinhPhi(string strTen)
	{
		// tính toán lần đầu tiên bảng cần par
		if(_Vari.FormChinh.dtDynamicReportColumn.Rows.Count<= 0)
		{
			DataView dvBaocaophu = new DataView(dtBaocaoPhu);
			dvBaocaophu.RowFilter = "tkno like '64%' or tkno like '635%' or tkno like '811%'";
			DataTable dtBaocaophu0 = dvBaocaophu.ToTable(true, new string[] { "khoanmuc" });
			DataTable dtBaocaophu1 = dvBaocaophu.ToTable(true, new string[] { "tkno" });
			string sTaikhoan = string.Join("_", dtBaocaophu1.Rows.OfType<DataRow>().Select(r => r[0].ToString()));
			DataView dvkhoanmuc = new DataView(_Func.GetTable("KhoanMuc"));
			DataRow dr;
			string dkKhoanmucMa = "DP";
			//// nếu dvBaocaophu không có dòng nào thì sao.
			for (int i = 0; i < dtBaocaophu0.Rows.Count; i++)
			{
				// dvkhoanmuc.RowFilter = "khoanmuc="+ dtBaocaophu0.Rows[i]["khoanmuc"].ToString()+" and ma like '" + dkKhoanmucMa + "%'";
				dvkhoanmuc.RowFilter = "khoanmuc="+ dtBaocaophu0.Rows[i]["khoanmuc"].ToString()+" and dinhphi=1";
				if(dvkhoanmuc.Count != 0)
				{
					dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
					dr["ten"] = new string(' ', 10) +" - " +dvkhoanmuc[0]["Ten"];
					dr["giatri"] = "pscdCPKM(" + sTaikhoan +",911,-1,"+ dvkhoanmuc[0]["KhoanMuc"].ToString()+",-3)";
					// pscd(641,911,-phongban-1, -khoanmuc-2,-thang-3) pscdCPBH
					_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
				}
			}

			// điền 1 dòng trống khi không có dòng dữ liệu nào của báo cáo này
			if(_Vari.FormChinh.dtDynamicReportColumn.Rows.Count<= 0)
			{
				dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
				dr["ten"] = "";
				dr["giatri"] = "";
				_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
			}
		}

		return strTen;
	}
	
		public string dynamicRowTenCpBienPhiNhanvien(string strTen)
	{
		// tính toán lần đầu tiên bảng cần par
		if(_Vari.FormChinh.dtDynamicReportColumn.Rows.Count<= 0)
		{
			DataView dvBaocaophu = new DataView(dtBaocaoPhu);
			dvBaocaophu.RowFilter = "tkno like '64%' or tkno like '635%' or tkno like '811%'";
			DataTable dtBaocaophu0 = dvBaocaophu.ToTable(true, new string[] { "khoanmuc" });
			DataTable dtBaocaophu1 = dvBaocaophu.ToTable(true, new string[] { "tkno" });
			string sTaikhoan = string.Join("_", dtBaocaophu1.Rows.OfType<DataRow>().Select(r => r[0].ToString()));
			DataView dvkhoanmuc = new DataView(_Func.GetTable("KhoanMuc"));
			string dkKhoanmucMa = "BP01";
			DataRow dr;
			//// nếu dvBaocaophu không có dòng nào thì sao.
			for (int i = 0; i < dtBaocaophu0.Rows.Count; i++)
			{
				// dvkhoanmuc.RowFilter = "khoanmuc="+ dtBaocaophu0.Rows[i]["khoanmuc"].ToString()+" and ma like '" + dkKhoanmucMa +"%'";
				dvkhoanmuc.RowFilter = "khoanmuc="+ dtBaocaophu0.Rows[i]["khoanmuc"].ToString()+" and dinhphi=2";
				if(dvkhoanmuc.Count != 0)
				{
					dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
					dr["ten"] = new string(' ', 10) +" - " +dvkhoanmuc[0]["Ten"];
					dr["giatri"] = "pscdCPKM(" + sTaikhoan +",911,-1,"+ dvkhoanmuc[0]["KhoanMuc"].ToString()+",-3)";
					_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
				}
			}

			// điền 1 dòng trống khi không có dòng dữ liệu nào của báo cáo này
			if(_Vari.FormChinh.dtDynamicReportColumn.Rows.Count<= 0)
			{
				dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
				dr["ten"] = "";
				dr["giatri"] = "";
				_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
			}
		}

		return strTen;
	}

	public string dynamicRowTenCpBienPhiMuaNgoai(string strTen)
	{
		// tính toán lần đầu tiên bảng cần par
		if(_Vari.FormChinh.dtDynamicReportColumn.Rows.Count<= 0)
		{
			DataView dvBaocaophu = new DataView(dtBaocaoPhu);
			dvBaocaophu.RowFilter = "tkno like '64%' or tkno like '635%' or tkno like '811%'";
			DataTable dtBaocaophu0 = dvBaocaophu.ToTable(true, new string[] { "khoanmuc" });
			DataTable dtBaocaophu1 = dvBaocaophu.ToTable(true, new string[] { "tkno" });
			string sTaikhoan = string.Join("_", dtBaocaophu1.Rows.OfType<DataRow>().Select(r => r[0].ToString()));
			DataView dvkhoanmuc = new DataView(_Func.GetTable("KhoanMuc"));
			string dkKhoanmucMa = "BP02";
			DataRow dr;
			//// nếu dvBaocaophu không có dòng nào thì sao.
			for (int i = 0; i < dtBaocaophu0.Rows.Count; i++)
			{
				// dvkhoanmuc.RowFilter = "khoanmuc="+ dtBaocaophu0.Rows[i]["khoanmuc"].ToString()+" and ma like '" + dkKhoanmucMa +"%'";
				dvkhoanmuc.RowFilter = "khoanmuc="+ dtBaocaophu0.Rows[i]["khoanmuc"].ToString()+" and dinhphi=0";
				if(dvkhoanmuc.Count != 0)
				{
					dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
					dr["ten"] = new string(' ', 10) +" - " +dvkhoanmuc[0]["Ten"];
					dr["giatri"] = "pscdCPKM(" + sTaikhoan +",911,-1,"+ dvkhoanmuc[0]["KhoanMuc"].ToString()+",-3)";
					_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
				}
			}

			// điền 1 dòng trống khi không có dòng dữ liệu nào của báo cáo này
			if(_Vari.FormChinh.dtDynamicReportColumn.Rows.Count<= 0)
			{
				dr = _Vari.FormChinh.dtDynamicReportColumn.NewRow();
				dr["ten"] = "";
				dr["giatri"] = "";
				_Vari.FormChinh.dtDynamicReportColumn.Rows.Add(dr);
			}
		}

		return strTen;
	}

4. HẬU XỬ LÝ - KQKD KHOẢN MỤC + PHÒNG BAN


public DataTable dtbccon;
	public DataTable DMain(DataTable dtDL, string ssele, DataTable dtColumns, DataRow drReport, FOR0025 formBaoCao)
	{
		#region: Tính toán nhóm cột cho báo cáo bsc par
		// tính toán nhóm cột cho báo cáo bsc par
		if(formBaoCao.Tag!= null & formBaoCao.Tag.GetType() == typeof(DataTable))
		{
			try {
				DataTable dtnhomcot = formBaoCao.Tag as DataTable;
				if(dtnhomcot.Rows.Count>1 && !string.IsNullOrWhiteSpace(dtnhomcot.Rows[0]["TenNhom"].ToString()))
				{
					string[] artennhom = dtnhomcot.Rows[0]["TenNhom"].ToString().Split('#');
					StringBuilder strnhomcot = new StringBuilder();
					string sfrom = dtnhomcot.Rows[1]["from"].ToString().Trim(), sto = dtnhomcot.Rows[1]["to"].ToString().Trim(), sbd = dtnhomcot.Rows[1]["to"].ToString().Trim();
					int nhom = 0;
					DataView dvcol = new DataView(dtColumns);
					for(int i = 1; i< dtnhomcot.Rows.Count; i++)
					{
						// sang nhóm khác
					if(dtnhomcot.Rows[i]["from"].ToString().Trim()!= sfrom || i == dtnhomcot.Rows.Count-1)
						{
							if(i == dtnhomcot.Rows.Count-1)
								sto = dtnhomcot.Rows[i]["to"].ToString().Trim();
							string tennhom = "";
							if(nhom< artennhom.Length)
								tennhom = artennhom[nhom];
							nhom+= 1;
							int sttbd = 0, sttkt = 0;
							dvcol.RowFilter = "GiaTri = 'ReportFix."+ sbd +"'";
							if(dvcol.Count>0)
								sttbd = Convert.ToInt16(dvcol[0]["stt"]);
							dvcol.RowFilter = "GiaTri = 'ReportFix."+ sto +"'";
							if(dvcol.Count>0)
								sttkt = Convert.ToInt16(dvcol[0]["stt"]);
							if(sttkt>0)
								strnhomcot.Append(tennhom+"("+sttbd+","+sttkt +")0#");
							sfrom = dtnhomcot.Rows[i]["from"].ToString().Trim();
							sto = sbd = dtnhomcot.Rows[i]["to"].ToString().Trim();
						}
						else sto = dtnhomcot.Rows[i]["to"].ToString().Trim();
					}

					drReport["nhomcot"] = strnhomcot.ToString();
				}
			}
			catch(Exception ex) { MessageBox.Show(ex.Message); }
		}

		#endregion: Tính toán nhóm cột cho báo cáo bsc par
		//Viết code dưới dòng này(chỉnh sửa dữ liệu báo cáo)
		// #region trường hợp chạy báo cáo FIX trên sql sẽ chuyển hóa các hàm công thức cột FIX sang sum giá trị cột tr trong báo cáo con tương ứng. Ví dụ
		// formBaoCao.dtfuncFixReport.Rows.Add("dndau(", "dndau(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr2-tr3 else 0 end) ");
		// formBaoCao.dtfuncFixReport.Rows.Add("dcdau(", "dcdau(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr3-tr2 else 0 end) ");
		// formBaoCao.dtfuncFixReport.Rows.Add("dn(", "dn(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr4-tr5 else 0 end) ");
		// formBaoCao.dtfuncFixReport.Rows.Add("dc(", "dc(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr5-tr4 else 0 end) ");
		// formBaoCao.dtfuncFixReport.Rows.Add("dndault(", "dndault(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr2 else 0 end) ");
		// formBaoCao.dtfuncFixReport.Rows.Add("dcdault(", "dcdault(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr3 else 0 end) ");
		// formBaoCao.dtfuncFixReport.Rows.Add("dnlt(", "dnlt(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr4 else 0 end) ");
		// formBaoCao.dtfuncFixReport.Rows.Add("dclt(", "dclt(@tkhoan)", " Sum( case when  tr1 like '{0}%' then tr5 else 0 end) ");
		// #endregion
		#region trường hợp chạy báo cáo FIX dưới local thì thực hiện chạy báo cáo con rùi add vào dữ liệu báo cáo sau đó tính toán dựa vào bảng đó
		//MessageBox.Show("chạy báo cáo con");
		string where = formBaoCao.GetWhereCondition(false);//.Replace("where", "").Replace("WHERE", "");
		dtbccon = formBaoCao.ChayBaoCao(0, "BCP_KQKD_B", "Daubc=0", where, formBaoCao.TuNgay, formBaoCao.DenNgay);

		formBaoCao.AddTable("BaoCaoCon", dtbccon);
		// thêm cột để quản lý việc sử dụng các tài khoản trong báo con
		if(dtbccon!= null && dtbccon.Rows.Count>0)
		{
			DataColumn dcdu = new DataColumn();
			dcdu.ColumnName = "langoi";// lần gọi số dư
			dcdu.DataType = typeof(int);
			dcdu.DefaultValue = 0;
			dtbccon.Columns.Add(dcdu);
			DataColumn dcnolt = new DataColumn();
			dcnolt.ColumnName = "langoinolt";// lần gọi số dư nợ lưỡng tính
			dcnolt.DataType = typeof(int);
			dcnolt.DefaultValue = 0;
			dtbccon.Columns.Add(dcnolt);
			DataColumn dccolt = new DataColumn();
			dccolt.ColumnName = "langoicolt";// lần gọi số dư có lưỡng tính
			dccolt.DataType = typeof(int);
			dccolt.DefaultValue = 0;
			dtbccon.Columns.Add(dccolt);
		}

		//formBaoCao.ChayBaoCao(154,"","",);
		#endregion
	return dtDL;
	}

	///
public object psDoanhthu(string tkno, int phongban, int thang)
	{
		//psc(511,1). lấy ps có 
		decimal result0 = 0, result1 = 0;
		if(thang == -3) //// bắt chéo tài khoản với cột. Tổng cộng
		{
			result0 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkco").StartsWith(tkno.Trim()))
												 && ! r.Field<string>("Tkno").StartsWith("521") && ! r.Field<string>("Tkno").StartsWith("911")
												)
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkco").StartsWith(tkno.Trim()))
												 && ! r.Field<string>("Tkno").StartsWith("521") && ! r.Field<string>("Tkno").StartsWith("911")
												)
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
		}
		else
		{
			result0 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkco").StartsWith(tkno.Trim())
												&& r.Field<int>("phongban").Equals(phongban)
												&& r.Field<int>("thang").Equals(thang)
												&& ! r.Field<string>("Tkno").StartsWith("521") && ! r.Field<string>("Tkno").StartsWith("911")
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkco").StartsWith(tkno.Trim())
												&& r.Field<int>("phongban").Equals(phongban)
												&& r.Field<int>("thang").Equals(thang)
												&& ! r.Field<string>("Tkno").StartsWith("521") && ! r.Field<string>("Tkno").StartsWith("911")
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);									
		}

		if(result0 == null)result0 = 0;
		if(result1 == null)result1 = 0;

		return result0-result1;
	}

	//====
public object psnd(string tkno, string tkco, int phongban, int thang)
	{
		decimal result0 = 0, result1 = 0;
		if(thang == -3) /// kỳ này //// bắt chéo tài khoản với cột
		{
			result0 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
		}
		else
		{
			result0 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("phongban").Equals(phongban)
												&& r.Field<int>("thang").Equals(thang)
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("phongban").Equals(phongban)
												&& r.Field<int>("thang").Equals(thang)
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
		}

		if(result0 == null)result0 = 0;
		if(result1 == null)result1 = 0;
		return result0 - result1;
	}

	// pscd(511, 52, 1)
	//====
public object pscd(string tkno, string tkco, int phongban, int thang)
	{
		decimal result0 = 0, result1 = 0;
		if(thang == -3) /// kỳ này //// bắt chéo tài khoản với cột
		{
			result0 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
		}
		else
		{
			result0 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("phongban").Equals(phongban)
												&& r.Field<int>("thang").Equals(thang)
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("phongban").Equals(phongban)
												&& r.Field<int>("thang").Equals(thang)
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
		}

		if(result0 == null)result0 = 0;
		if(result1 == null)result1 = 0;
		return result0 - result1;
	}


	public object pscdCPKM(string tkno, string tkco, int phongban, int khoanmuc, int thang)
	{
		decimal result0 = 0, result1 = 0;
		int ngaydau = 0, ngaycuoi = 0;
		List<string> lstTkno = tkno.Split('_').ToList();

		if(thang ==-3) /// kỳ này //// bắt chéo tài khoản với cột
		{
			result0 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("khoanmuc").Equals(khoanmuc)
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("khoanmuc").Equals(khoanmuc)
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
		}
		else
		{
			result0 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("Phongban").Equals(phongban)
												&& r.Field<int>("khoanmuc").Equals(khoanmuc)
												&& r.Field<int>("thang").Equals(thang)
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
			// result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
			result1 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("Phongban").Equals(phongban)
												&& r.Field<int>("khoanmuc").Equals(khoanmuc)
												&& r.Field<int>("thang").Equals(thang)
			//&& r.Field<int>("thang") <= ngaycuoi
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
		}

		if(result0 == null)result0 = 0;
		if(result1 == null)result1 = 0;
		return result0 - result1;
	}

	public object pscdFilter(string tkno, string tkco, int phongban, string dkKhoanmuc, int thang)
	{
		string cmm = "select stuff( (select ','+ convert(nvarchar,KhoanMuc) from dbo.KhoanMuc WHERE "+ dkKhoanmuc+" for xml path('')),1,1,'')";
		object sKhoanmuc = _Func.DBEXEC(cmm, true);
		//MessageBox.Show("sKhoanmuc:\r"+sKhoanmuc.ToString());
		// List<string> lstKhoanmuc = sKhoanmuc.ToString().Split(',').ToList();

		List<int> lstKhoanmuc = sKhoanmuc.ToString().Split(',').Select(Int32.Parse).ToList();
		decimal result0 = 0, result1 = 0;
		int iThang = 0, iNam = 0;
		int ngaydau = 0, ngaycuoi = 0;
		List<string> lstTkno = tkno.Split('_').ToList();
		string sWhereTkno = "";
		for (int i = 0; i < lstTkno.Count; i++)
		{
			sWhereTkno += " ma like '" + lstTkno[i].ToString()+"%'" + (i == (lstTkno.Count-1)?"":" or ");
		}

		//MessageBox.Show(sWhereTkno);
		cmm = "select stuff( (select '_'+ ma from dbo.taikhoan WHERE "+ sWhereTkno+" for xml path('')),1,1,'')";
		object sTkno = _Func.DBEXEC(cmm, true);
		lstTkno = sTkno.ToString().Split('_').ToList();

		if(thang == -3) /// kỳ này //// bắt chéo tài khoản với cột
		{
			result0 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& lstKhoanmuc.Contains(r.Field<int>("khoanmuc"))
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
			result1 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& lstKhoanmuc.Contains(r.Field<int>("khoanmuc"))
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
			//MessageBox.Show(result0.ToString()+"#"+result1.ToString());
		}
		else
		{
			result0 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("Phongban").Equals(phongban)
												&& lstKhoanmuc.Contains(r.Field<int>("khoanmuc"))
												&& r.Field<int>("thang").Equals(thang)
												))
												.Sum(r => r.Field<decimal?>("pscoKynay") ?? 0);
			// result1 = dtbccon.AsEnumerable().Where(r => (r.Field<string>("Tkno").StartsWith(tkno.Trim())
			result1 = dtbccon.AsEnumerable().Where(r => (lstTkno.Contains(r.Field<string>("Tkno").Trim())
												&& r.Field<string>("tkco").StartsWith(tkco.Trim())
												&& r.Field<int>("Phongban").Equals(phongban)
												&& lstKhoanmuc.Contains(r.Field<int>("khoanmuc"))
												&& r.Field<int>("thang").Equals(thang)
												))
												.Sum(r => r.Field<decimal?>("psnoKynay") ?? 0);
		}

		if(result0 == null)result0 = 0;
		if(result1 == null)result1 = 0;
		return result0 - result1;
	}
	
PreviousCÔNG THỨCNextdynamic cột là tháng

Last updated 10 months ago