bazar.AccountableDebts.UpdateDebts C# (CSharp) Method

UpdateDebts() protected method

protected UpdateDebts ( ) : void
return void
        protected void UpdateDebts()
        {
            int countOrg, countCash;
            try
            {
                string sql = "SELECT COUNT(*) as count FROM organizations";
                MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB);
                object result = cmd.ExecuteScalar();
                if(result != DBNull.Value)
                    countOrg = Convert.ToInt32(result);
                else
                    countOrg = 0;

                sql = "SELECT COUNT(*) as count FROM cash";
                cmd = new MySqlCommand(sql, QSMain.connectionDB);
                result = cmd.ExecuteScalar();
                if(result != DBNull.Value)
                    countCash = Convert.ToInt32(result);
                else
                    countCash = 0;

                bool DisplayCash, DisplayOrg;
                DisplayOrg = (countOrg > 1);
                DisplayCash = (countCash > 1);
                string sqlgroup = "";
                if(DisplayOrg)
                    sqlgroup += ", org_id";
                if(DisplayCash)
                    sqlgroup += ", cash_id";
                sql = "SELECT employee_id" + sqlgroup + ", employees.name as employee, organizations.name as organization, cash.name as cash, debt " +
                    "FROM( SELECT employee_id, org_id, cash_id, SUM(count) as debt FROM ( " +
                        "SELECT employee_id, org_id, cash_id, SUM(debit_slips.sum) as count FROM debit_slips WHERE operation = 'advance' GROUP BY employee_id" + sqlgroup +
                        " UNION ALL SELECT employee_id, org_id, cash_id, -SUM(credit_slips.sum) as count FROM credit_slips WHERE operation = 'advance' GROUP BY employee_id" + sqlgroup +
                        " UNION ALL SELECT employee_id, org_id, cash_id, -SUM(advance.sum) as count FROM advance GROUP BY employee_id " + sqlgroup + " ) AS slips " +
                        "GROUP BY employee_id" + sqlgroup + " WITH ROLLUP ) as result " +
                        "LEFT JOIN employees ON result.employee_id = employees.id " +
                        "LEFT JOIN organizations ON result.org_id = organizations.id " +
                        "LEFT JOIN cash ON result.cash_id = cash.id " +
                        "WHERE result.debt <> 0 " +
                        "ORDER BY employee" + sqlgroup;
                cmd = new MySqlCommand(sql, QSMain.connectionDB);
                MySqlDataReader rdr = cmd.ExecuteReader();
                decimal TotalDebt = 0m;
                if(rdr.Read () && rdr["debt"] != DBNull.Value && rdr["employee_id"] == DBNull.Value)
                    TotalDebt = rdr.GetDecimal("debt");
                labelTotal.LabelProp = String.Format("Общая задолжность всех подотчетных лиц: {0:C}", TotalDebt);
                TreeIter EmployeeIter, OrgIter, CurrentIter, TempIter;
                OrgIter = TreeIter.Zero;
                EmployeeIter = TreeIter.Zero;
                CurrentIter = TreeIter.Zero;
                int LastEmployee = -1, LastOrg = -1;
                string FirstColumn;
                while (rdr.Read())
                {
                    bool FirstLevel = false;
                    bool CashLevel = false;

                    //Обход проблемы: если общий долг по сотруднику нулевой, но внутри он разбит на несколько организаций или касс, итоговая втрока в запросе будет удалена.
                    if(LastEmployee != rdr.GetInt32 ("employee_id") && (DisplayOrg && rdr["org_id"] != DBNull.Value || (DisplayCash && rdr["cash_id"] != DBNull.Value)))
                    {
                        EmployeeIter = DebtsTreeStore.AppendValues(rdr.GetInt32 ("employee_id"),
                                                                   rdr["employee"].ToString(),
                                                                   string.Format("{0:C}", 0m));
                    }
                    if (DisplayOrg && LastOrg != DBWorks.GetInt (rdr, "org_id", 0) && DisplayCash && rdr["cash_id"] != DBNull.Value)
                    {
                        OrgIter = DebtsTreeStore.AppendValues(EmployeeIter,
                                                            rdr.GetInt32 ("employee_id"),
                                                              rdr["organization"].ToString(),
                                                              string.Format("{0:C}", 0m));
                    }

                    if(DisplayCash && rdr["cash"] != DBNull.Value)
                    {
                        FirstColumn = rdr["cash"].ToString ();
                        CashLevel = true;
                        if(DisplayOrg)
                            CurrentIter = OrgIter;
                        else
                            CurrentIter = EmployeeIter;
                    }
                    else if(DisplayOrg && rdr["organization"] != DBNull.Value)
                    {
                        FirstColumn = rdr["organization"].ToString ();
                        CurrentIter = EmployeeIter;
                    }
                    else
                    {
                        FirstColumn = rdr["employee"].ToString();
                        FirstLevel = true;
                    }

                    if(FirstLevel)
                        EmployeeIter = DebtsTreeStore.AppendValues(rdr.GetInt32 ("employee_id"),
                                                    FirstColumn,
                                                    string.Format("{0:C}",rdr.GetDecimal("debt")));
                    else
                    {
                        TempIter = DebtsTreeStore.AppendValues(CurrentIter,
                                                                rdr.GetInt32 ("employee_id"),
                                                               FirstColumn,
                                                               string.Format("{0:C}",rdr.GetDecimal("debt")));
                        if(DisplayOrg && !CashLevel)
                            OrgIter = TempIter;
                    }

                    LastEmployee = rdr.GetInt32 ("employee_id");
                    if(DisplayOrg && rdr["org_id"] != DBNull.Value)
                        LastOrg = rdr.GetInt32 ("org_id");
                }
                rdr.Close();
            }
            catch (Exception ex)
            {
                QSMain.ErrorMessageWithLog(this, "Не удалось сформировать отчет!", logger, ex);
            }
        }