void computeWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Result        result     = new Result();
            EpiDataHelper DataHelper = e.Argument as EpiDataHelper;

            if (DataHelper != null && DataHelper.Project != null && DataHelper.Project.CollectedData != null)
            {
                IDbDriver db    = DataHelper.Project.CollectedData.GetDatabase();
                DateTime  today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

                DataTable labTable = DataHelper.LabTable;

                double patientsTested   = 0;
                double samplesCollected = labTable.Rows.Count;//0;

                foreach (CaseViewModel caseVM in DataHelper.CaseCollection)
                {
                    if (caseVM.EpiCaseDef != Core.Enums.EpiCaseClassification.Excluded)
                    {
                        double samplesForCurrentCase = labTable.Select("[FKEY] = '" + caseVM.RecordId + "'").Count();
                        //samplesCollected = samplesCollected + samplesForCurrentCase;

                        if (samplesForCurrentCase > 0)
                        {
                            patientsTested++;
                        }
                    }
                }

                // Commented below is the old method, which simply counted everyone with lab sample records. Customer noted this needs to change. See new code.
                //result.PatientsTested = patientsTested.ToString();

                // New code is below.
                Epi.Fields.RenderableField finalLabClassField = DataHelper.CaseForm.Fields["FinalLabClass"] as Epi.Fields.RenderableField;
                if (finalLabClassField != null && finalLabClassField.Page != null)
                {
                    string finalLabClassTableName = finalLabClassField.Page.TableName;
                    string queryText   = "select distinct lrf.FKEY from " + finalLabClassTableName + " crf INNER JOIN LaboratoryResultsForm lrf on crf.GlobalRecordId = lrf.FKEY where (crf.FinalLabClass <> '' AND crf.FinalLabClass is not null)";
                    Query  selectQuery = db.CreateQuery(queryText);
                    int    count       = db.Select(selectQuery).Rows.Count;

                    // TODO: Remove excluded cases

                    result.PatientsTested   = count.ToString();
                    result.SamplesCollected = samplesCollected.ToString();
                }
                e.Result = result;
            }
        }
Exemple #2
0
 public static int GetControlTop(Epi.Fields.RenderableField field, int height)
 {
     return((int)Math.Ceiling(field.ControlTopPositionPercentage * height));
 }
Exemple #3
0
 public static int GetControlLeft(Epi.Fields.RenderableField field, int width)
 {
     return((int)Math.Ceiling(field.ControlLeftPositionPercentage * width));
 }
Exemple #4
0
        /// <summary>
        /// Orders the columns in a DataTable by the given ordering method.
        /// </summary>
        /// <param name="table">The table whose columns should be sorted.</param>
        /// <param name="columnSortOrder">The order by which the columns should be sorted.</param>
        /// <param name="view">The Epi Info 7 form</param>
        public static void OrderColumns(DataTable table, ColumnSortOrder columnSortOrder, View view = null)
        {
            #region Input Validation
            if (table == null)
            {
                throw new ArgumentNullException("table");
            }
            #endregion // Input Validation

            if (columnSortOrder == ColumnSortOrder.None)
            {
                return;
            }

            bool isUsingEpiProject = (view == null);
            bool sortByTabOrder    = (columnSortOrder == ColumnSortOrder.TabOrder);

            if (!sortByTabOrder || !isUsingEpiProject)
            {
                // alphabetical sort
                List <string> columnNames = new List <string>();

                foreach (DataColumn dc in table.Columns)
                {
                    columnNames.Add(dc.ColumnName);
                }

                columnNames.Sort();

                if (columnNames.Contains("UniqueKey"))
                {
                    columnNames.Remove("UniqueKey");
                    columnNames.Add("UniqueKey");
                }
                else if (columnNames.Contains("UNIQUEKEY"))
                {
                    columnNames.Remove("UNIQUEKEY");
                    columnNames.Add("UNIQUEKEY");
                }

                for (int i = 0; i < columnNames.Count; i++)
                {
                    string columnName = columnNames[i];
                    table.Columns[columnName].SetOrdinal(i);
                }
            }
            else if (sortByTabOrder && isUsingEpiProject)
            {
                // tab order sort
                Dictionary <string, int> columnNames = new Dictionary <string, int>();
                int runningTabIndex = 0;

                foreach (Page page in view.Pages)
                {
                    SortedDictionary <double, string> fieldsOnPage = new SortedDictionary <double, string>();

                    foreach (Epi.Fields.Field field in page.Fields)
                    {
                        if (field is Epi.Fields.RenderableField && field is Epi.Fields.IDataField)
                        {
                            Epi.Fields.RenderableField renderableField = field as Epi.Fields.RenderableField;
                            if (renderableField != null)
                            {
                                double tabIndex = renderableField.TabIndex;
                                while (fieldsOnPage.ContainsKey(tabIndex))
                                {
                                    tabIndex = tabIndex + 0.1;
                                }

                                fieldsOnPage.Add(tabIndex, field.Name);
                            }
                        }
                    }

                    foreach (KeyValuePair <double, string> kvp in fieldsOnPage)
                    {
                        columnNames.Add(kvp.Value, runningTabIndex);
                        runningTabIndex++;
                    }
                }

                if (columnNames.ContainsKey("UniqueKey"))
                {
                    columnNames["UniqueKey"] = runningTabIndex + 1;
                }
                else if (columnNames.ContainsKey("UNIQUEKEY"))
                {
                    columnNames["UNIQUEKEY"] = runningTabIndex + 1;
                }
                else
                {
                    columnNames.Add("UNIQUEKEY", runningTabIndex + 1);
                }

                int newRunningTabIndex = 0; // to prevent arg exceptions; TODO: Fix this better
                foreach (KeyValuePair <string, int> kvp in columnNames)
                {
                    if (table.Columns.Contains(kvp.Key))
                    {
                        table.Columns[kvp.Key].SetOrdinal(newRunningTabIndex);
                        newRunningTabIndex++;
                    }
                }
            }
        }
        void computeWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Result        result     = new Result();
            EpiDataHelper DataHelper = e.Argument as EpiDataHelper;

            if (DataHelper != null && DataHelper.Project != null && DataHelper.Project.CollectedData != null)
            {
                IDbDriver db    = DataHelper.Project.CollectedData.GetDatabase();
                int       total = (from caseVM in DataHelper.CaseCollection
                                   where caseVM.EpiCaseDef != Core.Enums.EpiCaseClassification.Excluded
                                   select caseVM).Count();
                string format = "P1";

                int count = (from caseVM in DataHelper.CaseCollection
                             where caseVM.FinalLabClass == Core.Enums.FinalLabClassification.ConfirmedAcute && caseVM.EpiCaseDef != Core.Enums.EpiCaseClassification.Excluded
                             select caseVM).Count();

                result.ConfirmedAcuteCount   = count.ToString();
                result.ConfirmedAcutePercent = ((double)count / (double)total).ToString(format);

                count = (from caseVM in DataHelper.CaseCollection
                         where caseVM.FinalLabClass == Core.Enums.FinalLabClassification.ConfirmedConvalescent && caseVM.EpiCaseDef != Core.Enums.EpiCaseClassification.Excluded
                         select caseVM).Count();

                result.ConfirmedConvalescentCount   = count.ToString();
                result.ConfirmedConvalescentPercent = ((double)count / (double)total).ToString(format);

                count = (from caseVM in DataHelper.CaseCollection
                         where caseVM.FinalLabClass == Core.Enums.FinalLabClassification.NotCase && caseVM.EpiCaseDef != Core.Enums.EpiCaseClassification.Excluded
                         select caseVM).Count();

                result.NegativeCount   = count.ToString();
                result.NegativePercent = ((double)count / (double)total).ToString(format);

                count = (from caseVM in DataHelper.CaseCollection
                         where caseVM.FinalLabClass == Core.Enums.FinalLabClassification.Indeterminate && caseVM.EpiCaseDef != Core.Enums.EpiCaseClassification.Excluded
                         select caseVM).Count();

                result.IndeterminateCount   = count.ToString();
                result.IndeterminatePercent = ((double)count / (double)total).ToString(format);

                count = (from caseVM in DataHelper.CaseCollection
                         where caseVM.FinalLabClass == Core.Enums.FinalLabClassification.NeedsFollowUpSample && caseVM.EpiCaseDef != Core.Enums.EpiCaseClassification.Excluded
                         select caseVM).Count();

                result.NeedsFollowUpCount   = count.ToString();
                result.NeedsFollowUpPercent = ((double)count / (double)total).ToString(format);

                Epi.Fields.RenderableField finalLabClassField = DataHelper.CaseForm.Fields["FinalLabClass"] as Epi.Fields.RenderableField;
                Epi.Fields.RenderableField epiCaseDefField    = DataHelper.CaseForm.Fields["EpiCaseDef"] as Epi.Fields.RenderableField;

                if (finalLabClassField != null && epiCaseDefField != null && finalLabClassField.Page != null && epiCaseDefField.Page != null)
                {
                    string finalLabClassTableName = finalLabClassField.Page.TableName;
                    string epiCaseClassTableName  = epiCaseDefField.Page.TableName;

                    string queryText = "";
                    if (db.ToString().ToLower().Contains("sql"))
                    {
                        queryText = "select count(*) from " + finalLabClassTableName + " AS crf INNER JOIN " + epiCaseClassTableName + " AS crfEpiCaseClass on crf.GlobalRecordId = crfEpiCaseClass.GlobalRecordId INNER JOIN LaboratoryResultsForm lrf on crf.GlobalRecordId = lrf.FKEY where ((crf.FinalLabClass = '' OR crf.FinalLabClass is null) AND (crfEpiCaseClass.EpiCaseDef <> '4'))";
                    }
                    else
                    {
                        queryText = "select count(*) from ((" + finalLabClassTableName + " AS crf) INNER JOIN " + epiCaseClassTableName + " AS crfEpiCaseClass on crf.GlobalRecordId = crfEpiCaseClass.GlobalRecordId) INNER JOIN LaboratoryResultsForm lrf on crf.GlobalRecordId = lrf.FKEY where ((crf.FinalLabClass = '' OR crf.FinalLabClass is null) AND (crfEpiCaseClass.EpiCaseDef <> '4'))";
                    }
                    Query selectQuery = db.CreateQuery(queryText);
                    count = (int)db.ExecuteScalar(selectQuery);

                    if (db.ToString().ToLower().Contains("sql"))
                    {
                        queryText = "select crfEpiCaseClass.ID from " + finalLabClassTableName + " AS crf INNER JOIN " + epiCaseClassTableName + " AS crfEpiCaseClass on crf.GlobalRecordId = crfEpiCaseClass.GlobalRecordId INNER JOIN LaboratoryResultsForm lrf on crf.GlobalRecordId = lrf.FKEY where ((crf.FinalLabClass = '' OR crf.FinalLabClass is null) AND (crfEpiCaseClass.EpiCaseDef <> '4'))";
                    }
                    else
                    {
                        queryText = "select crfEpiCaseClass.ID from ((" + finalLabClassTableName + " AS crf) INNER JOIN " + epiCaseClassTableName + " AS crfEpiCaseClass on crf.GlobalRecordId = crfEpiCaseClass.GlobalRecordId) INNER JOIN LaboratoryResultsForm lrf on crf.GlobalRecordId = lrf.FKEY where ((crf.FinalLabClass = '' OR crf.FinalLabClass is null) AND (crfEpiCaseClass.EpiCaseDef <> '4'))";
                    }
                    selectQuery = db.CreateQuery(queryText);
                    DataTable   dt = db.Select(selectQuery);
                    WordBuilder wb = new WordBuilder(",");

                    foreach (DataRow row in dt.Rows)
                    {
                        wb.Add(row["ID"].ToString());
                    }

                    result.PendingIDs = wb.ToString();

                    result.PendingCount   = count.ToString();
                    result.PendingPercent = ((double)count / (double)total).ToString(format);

                    if (db.ToString().ToLower().Contains("sql"))
                    {
                        queryText = "select count(*) from CaseInformationForm AS crf LEFT JOIN " + epiCaseClassTableName + " AS crfEpiCaseClass on crf.GlobalRecordId = crfEpiCaseClass.GlobalRecordId LEFT JOIN LaboratoryResultsForm lrf on crf.GlobalRecordId = lrf.FKEY where ((lrf.GlobalRecordId = '' OR lrf.GlobalRecordId is null) AND (crfEpiCaseClass.EpiCaseDef <> '4') AND crf.RecStatus = 1)";
                    }
                    else
                    {
                        queryText = "select count(*) from ((CaseInformationForm AS crf) LEFT JOIN " + epiCaseClassTableName + " AS crfEpiCaseClass on crf.GlobalRecordId = crfEpiCaseClass.GlobalRecordId) LEFT JOIN LaboratoryResultsForm lrf on crf.GlobalRecordId = lrf.FKEY where ((lrf.GlobalRecordId = '' OR lrf.GlobalRecordId is null) AND (crfEpiCaseClass.EpiCaseDef <> '4') AND crf.RecStatus = 1)";
                    }
                    selectQuery = db.CreateQuery(queryText);
                    count       = (int)db.ExecuteScalar(selectQuery);

                    result.NotSampledCount   = count.ToString();
                    result.NotSampledPercent = ((double)count / (double)total).ToString(format);

                    e.Result = result;
                }
                else
                {
                    throw new InvalidOperationException("FinalLabClass and EpiCaseDef must both be non-null fields in computeWorker_doWork in LabClassAllPatients.xaml.cs");
                }
            }
        }