using System; using System.Collections.Generic; using System.Linq; using Datalib.DatabaseSpecific; using System.Windows.Forms; using Datalib.Linq; using Datalib.EntityClasses; using Datalib.FactoryClasses; using Datalib.HelperClasses; using PatientMan.Classes; namespace PatientMan.Classes { class clsHivqual { public DevExpress.XtraSpreadsheet.SpreadsheetControl spreed; public DateTime BeginDate; public DateTime EndDate; private DevExpress.Spreadsheet.Worksheet _Hivqual, _R9, _Common, _Tracking; public DataAccessAdapter adapter = new DataAccessAdapter(SettingInfo.Constr); int row, col; public void Calculate() { // var path = Application.StartupPath; // var templatefile = path + @"\templates\Hivqual.xls"; // var repfile = path + @"\Excels\Hivqual.xls"; // Microsoft.Office.Interop.Excel.Workbook wb; row = 5; col = 4; // var app = new Excel.Application(); // File.Copy(templatefile, repfile, true); // wb = app.Workbooks.Open(repfile); _Hivqual = this.spreed.Document.Worksheets["VN"]; _Tracking = this.spreed.Document.Worksheets["Tracking"]; _Common = this.spreed.Document.Worksheets["Common"]; _Common.Cells[1, 1].Value = BeginDate; _Common.Cells[1, 2].Value = EndDate; Hivqual1(); Hivqual2(); Hivqual3(); Hivqual4(); Hivqual5(); Hivqual6(); Hivqual7(); Hivqual8(); Hivqual9(); Hivqual10(); // app.Visible = true; } #region "Hivqual" private void Hivqual1() { /*Mẫu số: Lọc trong bảng tblPatient những bệnh nhân có DateofRegistration trong khoảng ngày báo cáo và loại trừ những bệnh nhân có DateofReferral!=nul. Từ số: Trong bảng tblPreclicnic, lọc những bản ghi CD4 có ngày TestDate – DateofRegistration <=15. Hoặc có ngày TestDate – DateofRegistration >= -180. Nhóm lại để lấy duy nhất nều tồn tại ở một bệnh nhân có 2 lần là CD4 thỏa mãn điều kiện trên. */ int numerator, denominator; var thisPatients = new EntityCollection(); var tests = new EntityCollection(); adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(tests, null); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; var dDominator = (from q in thisPatients where (q.DateofRegistration != null && q.DateofRegistration >= thisBeginDate && q.DateofRegistration <= thisEndDate && q.Dateofreferral == null) select q).ToList(); var sDenominator = string.Join(",", dDominator.Select(m => m.PatientId).ToArray()); denominator = dDominator.Count; var dNumerator = (from q in tests join p in dDominator on q.PatientId equals p.PatientId where (q.Testid == "01" && q.TestDate != null) select new { q.TestDate, p.DateofRegistration, q.PatientId, diff = ((TimeSpan)(q.TestDate - p.DateofRegistration)).TotalDays }).ToList().Where(s => s.diff <= 15 || s.diff >= -180).GroupBy(g => g.PatientId).Select(m => m.First().PatientId).ToList(); numerator = dNumerator.Count; var sNumerator = string.Join(",", dNumerator.ToArray()); double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row, col].Value = result; _Hivqual.Cells[row, col + 1].Value = denominator; _Tracking.Cells[row, col + 1].Value = sDenominator; _Tracking.Cells[row, col].Value = sNumerator; } private void Hivqual2() { /*Mấu số: Lọc bệnh nhân trong bảng tblPatients thỏa mãn điều kiện có ngày DateofArv == null hoặc ngày DateofArv > EndDate. Và có ít nhất 1 ngày khám trong giai đoạn đánh giá. Tử số: Lọc trong bảng tblExamination có ngày khám cuối trong giai đoạn đó – ngày cuối giai đoạn đánh giá >= -90. . Nhóm lại nếu có nhiều bản ghi cho mỗi bệnh nhân để lấy bản ghi duy nhất. */ int numerator, denominator; var thisPatients = new EntityCollection(); var exams = new EntityCollection(); adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; List includes = (from q in exams where (q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate) group q by q.PatientId into g select g.First().PatientId).ToList(); var dDenominator = (from q in thisPatients where ((q.DateofArv == null || q.DateofArv > thisEndDate) && includes.Contains(q.PatientId)) select q.PatientId).ToList(); denominator = dDenominator.Count; var sDenominator = string.Join(",", dDenominator.ToArray()); var dNumerator = (from q in exams where (dDenominator.Contains(q.PatientId) && ((TimeSpan)(q.ExamDate - thisEndDate)).TotalDays >= -90) group q by q.PatientId into g select g.Last().PatientId).ToList(); var sNumerator = string.Join(",", dNumerator.ToArray()); numerator = dNumerator.Count; double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 1, col].Value = result; _Hivqual.Cells[row + 1, col + 1].Value = denominator; _Tracking.Cells[row + 1, col + 1].Value = sDenominator; _Tracking.Cells[row + 1, col].Value = sNumerator; } private void Hivqual3() { /*Tỷ lệ bệnh nhân mới đăng ký tại PKNT đủ tiêu chuẩn dự phòng INH (IPT) được kê đơn dự phòng trong vòng 6 tháng qua Mẫu số: Bước 1: Lọc ra những BN có ngày đăng kí trong giai đoạn đánh giá và ngày chuyển tới = null. Bước 2: Từ các BN ở bước 1, Lọc ra những BN ở lần khám cuối thỏa tất cả: - Sàng lọc lao = “01” - Kết quả sàng lọc = “01” (âm tính) - Kết quả AST, ALT gần nhất nhưng phải nằm trong giai đoạn đánh giá < 200 (nếu ko có là ko thỏa). ALT< 200 và [(AST <200) hoặc (AST = null)] - Không có rối loạn thần kinh ngoại biên - Không có Vàng da, vàng mắt - Tự khám Tử số: Lấy tất cả mẫu số, thỏa có INH (mã số 03) ở lần khám cuối (bảng tblTreatments). */ int numerator, denominator; var thisPatients = new EntityCollection(); var exams = new EntityCollection(); var treatments = new EntityCollection(); var tests = new EntityCollection(); adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); adapter.FetchEntityCollection(treatments, null); adapter.FetchEntityCollection(tests, null); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; List includesPatient = (from q in thisPatients where q.DateofRegistration >= thisBeginDate && q.DateofRegistration <= thisEndDate && q.Dateofreferral == null select q.PatientId).ToList(); var examciriteria = (from q in exams where (includesPatient.Contains(q.PatientId) && q.TbScreenResult == "01" && q.TbScreenResult == "01" && q.Jaundice != 1 && q.Blackouts != 1) group q by q.PatientId into g select g.First().PatientId).ToList(); var denominatorset = (from q in tests where (examciriteria.Contains(q.PatientId) && q.Testid == "03" && (q.QuantityResult >= 200 || q.Testid == "04" && q.QuantityResult >= 200) && q.TestDate >= thisBeginDate && q.TestDate >= thisEndDate) group q by q.PatientId into g select g.First().PatientId).ToList(); var sDenominator = string.Join(",", denominatorset.ToArray()); denominator = denominatorset.Count; var numeratorset = (from q in treatments where (denominatorset.Contains(q.PatientId) && q.TreatmentSdate >= thisBeginDate && q.TreatmentSdate <= thisEndDate && q.TreatmentId == "03") group q by q.PatientId into p select p.Last().PatientId).ToList(); var sNumerator = string.Join(",", numeratorset.ToArray()); numerator = (from q in numeratorset where denominatorset.Contains(q) select q).Count(); double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 2, col].Value = result; _Hivqual.Cells[row + 2, col + 1].Value = denominator; _Tracking.Cells[row + 2, col + 1].Value = sDenominator; _Tracking.Cells[row + 2, col].Value = sNumerator; } private void Hivqual4() { /* Tỷ lệ bệnh nhân ARV đến tái khám đúng hẹn trong lần khám gần nhất Mẫu số: Lọc các bệnh nhân có ngày điều trị ARV < cuối giai đoạn đánh giá và có ngày tái khám trong khoảng giai đoạn đánh giá. Nhóm lại để lấy duy nhất nếu tồn tại BN có nhiều hơn 1 ngày khám trong giai đoạn đánh giá. Tử số: lọc các bệnh án có ngày hẹn tái khám >cuối kì báo cáo và có Daydiff <= 1. Lọc các bản ghi lần khám gần nhất của các bệnh nhân đang điều trị Arv có DayDiff <=1 để lấy làm tử số */ int numerator, denominator; var thisPatients = new EntityCollection(); var exams = new EntityCollection(); adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; List arvPatients = thisPatients.Where(q => q.DateofArv != null && q.DateofArv <= thisEndDate).Select(q => q.PatientId).ToList(); List dDenominator = exams.Where(m => m.ExamDate <= thisEndDate && m.ExamDate >= thisBeginDate && arvPatients.Contains(m.PatientId)).GroupBy(g => g.PatientId).Select(g => g.OrderBy(m => m.ExamDate).Last()).Select(m => m.PatientId).ToList(); denominator = dDenominator.Count; var dNumerator = (from q in exams where (q.ExamDate <= thisEndDate && dDenominator.Contains(q.PatientId)) group q by q.PatientId into p select p.Last()).Where(g => Math.Abs(Convert.ToDouble(g.DayDiff)) <= 1).Select(m => m.PatientId).ToList(); numerator = dNumerator.Count; var sDenominator = string.Join(",", dDenominator.ToArray()); var sNumerator = string.Join(",", dNumerator.ToArray()); double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 3, col].Value = result; _Hivqual.Cells[row + 3, col + 1].Value = denominator; _Tracking.Cells[row + 3, col + 1].Value = sDenominator; _Tracking.Cells[row + 3, col].Value = sNumerator; } private void Hivqual5() { /* Tỷ lệ bệnh nhân được đánh giá TTĐT trong lần khám gần nhất * Mẫu số: - Ngày điều trị ARV != null và < ngày cuối giai đoạn đánh giá. - Có ngày khám trong giai đoạn đánh giá - Tự đến khám - Loại BN có ngày khám cuối (trong giai đoạn đánh giá) trùng ngày khởi liều ARV Tử số: Mẫu số + có biến TreatmentFollow!=null ở lần khám cuối trong giai đoạn đánh giá. */ int numerator = 0; int denominator = 0; var thisPatients = new EntityCollection(); var exams = new EntityCollection(); adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; List arvPatients = thisPatients.Where(q => q.DateofArv != null && q.DateofArv <= thisEndDate).Select(q => q.PatientId).ToList(); var dDenominator = (from q in exams where (arvPatients.Contains(q.PatientId) && q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate) group q by q.PatientId into g select g.OrderBy(m => m.ExamDate).Last()).ToList() .Where(m => m.NoSelfExam != 1) .Select(m => m.PatientId) .ToList(); denominator = dDenominator.Count; var dNumerator = (from q in exams where (q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate && dDenominator.Contains(q.PatientId)) group q by q.PatientId into p select p.Last()).Where(g => g.TreatmentFollow != null).Select(m => m.PatientId).ToList(); numerator = dNumerator.Count; var sDenominator = string.Join(",", dDenominator.ToArray()); var sNumerator = string.Join(",", dNumerator.ToArray()); double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 4, col].Value = result; _Hivqual.Cells[row + 4, col + 1].Value = denominator; _Tracking.Cells[row + 4, col + 1].Value = sDenominator; _Tracking.Cells[row + 4, col].Value = sNumerator; } private void Hivqual6() { /* Tỷ lệ BN điều trị ARV được bắt đầu điều trị ARV trong vòng 15 ngày Mẫu số: - Bước 1: Lọc ra các bệnh nhân có ngày khởi liều ARV nằm trong giai đoạn đánh giá. - Bước 2: Loại ra những bệnh nhân đã điều trị ARV chuyển tới Tử số: - Lấy mẫu số - Lọc ra những bệnh nhân có ngày khởi liều ARV – ngày đủ tiêu chuẩn <= 15 HOẶC ngày đủ tiêu chuẩn = null. - Ngày đủ tiêu chuẩn = min (ngày có CD4 < 350 (ngày CD4 này phải lớn hơn ngày đăng ký), ngày khám có giai đoạn lâm sang 3 hoặc 4) */ int numerator, denominator; var exams = new EntityCollection(); var tests = new EntityCollection(); var thisPatients = new EntityCollection(); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); adapter.FetchEntityCollection(tests, null); var arvPatients = thisPatients.Where(p => p.DateofArv >= thisBeginDate && p.DateofArv <= thisEndDate && p.HaveArvBefore != 1).ToList(); var arvTests = tests.Where(p => p.Testid == "01" && p.QuantityResult < 350).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.TestDate).First()).ToList(); var arvClinics = exams.Where(p => p.ClinicStage >= 3).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.ExamDate).First()).ToList(); var preresult = (from q in arvPatients join p in arvTests on q.PatientId equals p.PatientId into g from m in g select new { q.PatientId, q.DateofArv, TestDate = (m == null) ? DateTime.Today.AddYears(100) : m.TestDate, Cd4Criteria = (m == null) ? false : true }).ToList(); var postresult = (from q in preresult join p in arvClinics on q.PatientId equals p.PatientId into g from m in g select new { q.PatientId, q.DateofArv, q.TestDate, q.Cd4Criteria, ClinicDate = (m == null) ? DateTime.Today.AddYears(100) : m.ExamDate, ClinicStageCriteria = (m == null) ? false : true }).ToList(); var dDenominator = arvPatients.Select(m => m.PatientId).ToList(); denominator = dDenominator.Count(); var dNumerator = (from q in postresult where ((q.ClinicStageCriteria || q.Cd4Criteria) && ((DateTime)q.DateofArv - (DateTime)(q.TestDate >= q.ClinicDate ? q.ClinicDate : q.TestDate)).Days <= 15) select q.PatientId).ToList(); numerator = dNumerator.Count; var sDenominator = string.Join(",", dDenominator.ToArray()); var sNumerator = string.Join(",", dNumerator.ToArray()); double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 5, col].Value = result; _Hivqual.Cells[row + 5, col + 1].Value = denominator; _Tracking.Cells[row + 5, col + 1].Value = sDenominator; _Tracking.Cells[row + 5, col].Value = sNumerator; } private void Hivqual7() { /* Kết quả CD4 của bệnh nhân lúc bắt đầu điều trị ARV Mẫu số: - Lọc ra những bệnh nhân có ngày khởi liều ARV trong giai đoạn đánh giá. - Loại những đồng chí chuyển tới đã điều trị ARV. - Lọc những người được làm test CD4 có ngày làm test nhỏ hơn ngày Arv (lấy bản ghi đầu tiên của từng người). Counter ở đây được lấy làm mẫu Chia các chỉ số Arv thành 4 khoảng < 100, 100-249, 250-349, > 350, tính counter cho các nhóm để làm tử số. Và turn ra 4 tỷ lệ % tương ứng với 4 nhóm. Vậy sẽ có 4 tỷ lệ */ int denominator; var tests = new EntityCollection(); var thisPatients = new EntityCollection(); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(tests, null); var arvPatients = thisPatients.Where(p => p.DateofArv >= thisBeginDate && p.DateofArv <= thisEndDate && p.HaveArvBefore != 1).ToList(); var arvTests = tests.Where(p => p.Testid == "01").ToList(); var preresult = (from q in arvTests join p in arvPatients on q.PatientId equals p.PatientId where (q.TestDate <= p.DateofArv) select new { q.PatientId, q.QuantityResult, q.TestDate }).ToList(); var postresult = preresult.GroupBy(m => m.PatientId).Select(g => g.OrderBy(m => m.TestDate).First()).ToList(); denominator = postresult.Count; var sDenominator = string.Join(",", postresult.Select(m => m.PatientId).ToArray()); int g1 = 100; int g2 = 250; int g3 = 350; var dD1 = postresult.Where(m => m.QuantityResult < g1).Select(m => m.PatientId).ToList(); int d1 = dD1.Count(); var sD1 = string.Join(",", dD1.ToArray()); var dD2 = postresult.Where(m => m.QuantityResult >= g1).Where(m => m.QuantityResult <= g2).Select(m => m.PatientId).ToList(); int d2 = dD2.Count; var sD2 = string.Join(",", dD2.ToArray()); var dD3 = postresult.Where(m => m.QuantityResult > g2).Where(m => m.QuantityResult < g3).Select(m => m.PatientId).ToList(); int d3 = dD3.Count; var sD3 = string.Join(",", dD3.ToArray()); var dD4 = postresult.Where(m => m.QuantityResult >= g3).Select(m => m.PatientId).ToList(); int d4 = dD4.Count; var sD4 = string.Join(",", dD4.ToArray()); _Hivqual.Cells[row + 6, col].Value = denominator == 0 ? 0 : (double)d1 / (double)denominator; _Hivqual.Cells[row + 6, col + 1].Value = denominator; _Tracking.Cells[row + 6, col + 1].Value = sDenominator; _Tracking.Cells[row + 6, col].Value = sD1; _Hivqual.Cells[row + 7, col].Value = denominator == 0 ? 0 : (double)d2 / (double)denominator; _Hivqual.Cells[row + 7, col + 1].Value = denominator; _Tracking.Cells[row + 7, col + 1].Value = sDenominator; _Tracking.Cells[row + 7, col].Value = sD2; _Hivqual.Cells[row + 8, col].Value = denominator == 0 ? 0 : (double)d3 / (double)denominator; _Hivqual.Cells[row + 8, col + 1].Value = denominator; _Tracking.Cells[row + 8, col + 1].Value = sDenominator; _Tracking.Cells[row + 8, col].Value = sD3; _Hivqual.Cells[row + 9, col].Value = denominator == 0 ? 0 : (double)d4 / (double)denominator; _Hivqual.Cells[row + 9, col + 1].Value = denominator; _Tracking.Cells[row + 9, col + 1].Value = sDenominator; _Tracking.Cells[row + 9, col].Value = sD4; } private void Hivqual8() { /*Tỷ lệ bệnh nhân được kê đơn dự phòng CTX hoặc DAPSONE khi đủ tiêu chuẩn trong lần khám gần nhất Mẫu số: - Có ngày khám trong giai đooi đánh giá - Chọn lần khám cuối cùng trong giai đoạn đánh giá - Lần khám cuối là tự đến - Đủ tiêu chuẩn dự phòng CTX: tại lần khám cuối cùng (ở trên) có CD4 <=350 hoặc lầ nkhám cuối cùng (chọn ở trên) có giai đoạn lâm sang 3 hoặc 4. Tử số: - Mẫu số được điều trị CTX trong lần khám đó. */ int numerator, denominator; var exams = new EntityCollection(); var tests = new EntityCollection(); var treatment = new EntityCollection(); var thisPatients = new EntityCollection(); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); adapter.FetchEntityCollection(tests, null); adapter.FetchEntityCollection(treatment, null); var exaPatients = exams.Where(p => p.ExamDate >= thisBeginDate && p.ExamDate <= thisEndDate && p.NoSelfExam != 1) .GroupBy(p => p.PatientId) .Select(g => g.OrderBy(p => p.ExamDate).First()) .ToList(); var arvTests = tests.Where(p => p.Testid == "01" && p.QuantityResult < 350 && p.TestDate <= thisEndDate).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.TestDate).First()).ToList(); var arvClinics = exams.Where(p => p.ClinicStage >= 3 && p.ExamDate <= thisEndDate).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.ExamDate).First()).ToList(); var preresult = (from q in exaPatients join p in arvTests on q.PatientId equals p.PatientId into g from m in g select new { q.PatientId, TestDate = (m == null) ? DateTime.Today.AddYears(100) : m.TestDate, Cd4Criteria = (m == null) ? false : true }).ToList(); var postresult = (from q in preresult join p in arvClinics on q.PatientId equals p.PatientId into g from m in g select new { q.PatientId, q.TestDate, q.Cd4Criteria, ClinicDate = (m == null) ? DateTime.Today.AddYears(100) : m.ExamDate, ClinicStageCriteria = (m == null) ? false : true }).ToList(); var dDenominator = postresult.Where(m => m.Cd4Criteria || m.ClinicStageCriteria).Select(m => m.PatientId).ToList(); denominator = dDenominator.Count; var critiera = (from q in postresult where (q.ClinicStageCriteria || q.Cd4Criteria) select new { q.PatientId, CriteriaDate = q.TestDate >= q.ClinicDate ? q.ClinicDate : q.TestDate }).ToList(); var dNumerator = (from q in treatment join p in critiera on q.PatientId equals p.PatientId where q.TreatmentSdate == p.CriteriaDate orderby q.TreatmentSdate group q by q.PatientId into g select g.First()).ToList().Where(m => m.TreatmentId == "04").Select(m => m.PatientId).ToList(); numerator = dNumerator.Count; var sDenominator = string.Join(",", dDenominator.ToArray()); var sNumerator = string.Join(",", dNumerator.ToArray()); double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 10, col].Value = result; _Hivqual.Cells[row + 10, col + 1].Value = denominator; _Tracking.Cells[row + 10, col + 2].Value = sDenominator; _Tracking.Cells[row + 10, col].Value = sNumerator; } private void Hivqual9() { /* Tỷ lệ bệnh nhân được sàng lọc Lao trong lần khám gần nhất Lọc những bệnh nhân đi có khám lâm sàng trong khoảng báo cáo - làm mẫ sốu, ko tính các lần người nhà tới khám. Lọc bản ghi khám cuối cùng của những bệnh nhân này trong khoảng báo cáo thỏa mãn TbScreen==1 làm tử */ int numerator, denominator; var thisPatients = new EntityCollection(); var exams = new EntityCollection(); adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; var dDenominator = (from q in exams where q.IsClinic == 1 && q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate group q by q.PatientId into g select g.Key).ToList(); denominator = dDenominator.Count; var dNumerator = (from q in exams where (q.IsClinic == 1 && q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate) group q by q.PatientId into g select g.Last()).Where(m => m.TbScreen == 1).Select(m => m.PatientId).ToList(); numerator = dNumerator.Count; var sDenominator = string.Join(",", dDenominator.ToArray()); var sNumerator = string.Join(",", dNumerator.ToArray()); double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 11, col].Value = result; _Hivqual.Cells[row + 11, col + 1].Value = denominator; _Tracking.Cells[row + 11, col + 1].Value = sDenominator; _Tracking.Cells[row + 11, col].Value = sNumerator; } private void Hivqual10() { /* Mẫu số: Có ít nhất 1 lần khám trong giai đoạn đánh giá. - Loại các bệnh nhân chuyển đến trong giai đoạn đánh giá - Loại các bệnh nhân có ngày đăng kí +15 >= ngày cuối giai đoạn đánh giá Tử số: Từ mẫu, lọc các bênh nhân có ít nhất 1 KQ CD4 nằm trong giai đoạn đánh giá */ int numerator, denominator; var thisPatients = new EntityCollection(); var exams = new EntityCollection(); var tests = new EntityCollection(); adapter.FetchEntityCollection(thisPatients, null); adapter.FetchEntityCollection(exams, null); adapter.FetchEntityCollection(tests, null); var thisBeginDate = this.BeginDate; var thisEndDate = this.EndDate; var denominatorset = (from q in exams join p in thisPatients on q.PatientId equals p.PatientId where (p.DateofRegistration != null && p.DateofRegistration.Value.AddDays(15) < thisEndDate && q.IsClinic == 1 && q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate) group q by q.PatientId into g select g.First()).ToList(); denominator = denominatorset.Count; var numeratorset = (from q in tests join p in denominatorset on q.PatientId equals p.PatientId where q.TestDate >= thisBeginDate && q.TestDate <= thisEndDate && q.Testid == "01" group q by q.PatientId into g select g.First()).ToList(); var sDenominator = string.Join(",", denominatorset.Select(m => m.PatientId).ToArray()); var sNumerator = string.Join(",", numeratorset.Select(m => m.PatientId).ToArray()); numerator = numeratorset.Count; double result = denominator == 0 ? 0 : (double)numerator / (double)denominator; _Hivqual.Cells[row + 12, col].Value = result; _Hivqual.Cells[row + 12, col + 1].Value = denominator; _Tracking.Cells[row + 12, col + 1].Value = sDenominator; _Tracking.Cells[row + 12, col].Value = sNumerator; } #endregion } }