Загрузка данных


  private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  {
      try
      {
          string connStr = "Data Source=sqldata;Initial Catalog=OAO;Persist Security Info=True;User ID=seluser;Password=123";
          DataTable dt = new DataTable();
          dt.Columns.Add("Article", typeof(string));
          dt.Columns.Add("Name", typeof(string));
          dt.Columns.Add("Tooling", typeof(string));
          dt.Columns.Add("attr1", typeof(string));
          dt.Columns.Add("attr2", typeof(string));
          dt.Columns.Add("attr3", typeof(string));
          dt.Columns.Add("attr4", typeof(string));
          dt.Columns.Add("attr5", typeof(string));
          dt.Columns.Add("attr6", typeof(string));
          dt.Columns.Add("attr7", typeof(string));
          dt.Columns.Add("attr8", typeof(string));
          dt.Columns.Add("qt", typeof(string));
          dt.Columns.Add("ei_shnm", typeof(string));
          dt.Columns.Add("topa_rcd", typeof(string));

          string sql = @"
      SELECT 
          MAX(skln.SklN_Cd) AS Article,
          MAX(skln.SklN_Nm) AS Name,
          MAX(skln.SklN_NmAlt) AS Tooling,
          MAX(TOpa_AttrTpName1+': '+ISNULL(TOpa_AttrCd1,TOpa_AttrName1)) attr1,
          MAX(TOpa_AttrTpName2+': '+ISNULL(TOpa_AttrCd2,TOpa_AttrName2)) attr2,
          MAX(TOpa_AttrTpName3+': '+ISNULL(TOpa_AttrCd3,TOpa_AttrName3)) attr3,
          MAX(TOpa_AttrTpName4+': '+ISNULL(TOpa_AttrCd4,TOpa_AttrName4)) attr4,
          MAX(TOpa_AttrTpName5+': '+ISNULL(TOpa_AttrCd5,TOpa_AttrName5)) attr5,
          MAX(TOpa_AttrTpName6+': '+ISNULL(TOpa_AttrCd6,TOpa_AttrName6)) attr6,
          MAX(TOpa_AttrTpName7+': '+ISNULL(TOpa_AttrCd7,TOpa_AttrName7)) attr7,
          MAX(TOpa_AttrTpName8+': '+ISNULL(TOpa_AttrCd8,TOpa_AttrName8)) attr8,
          SUM(dcsInf.qt) AS qt,
          MAX(ei.EI_ShNm) AS ei_shnm,
          t.Topa_Rcd
      FROM SKLKRT
      JOIN SKLN ON skln.SklN_Rcd = SKLKRT.SklKrt_RcdNom
      JOIN EI ON ei.EI_Rcd = skln.SklN_EiOsn
      JOIN TSKLOPADETAIL t ON t.Topa_Rcd = SKLKRT.SklKrt_RcdOpa
      OUTER APPLY (
          SELECT SUM(CASE WHEN skldcs_mov = 1 THEN 1 ELSE -1 END * skldcs_qtosn) qt
          FROM SKLDCS WHERE skldcs_krt = SKLKRT.SklKrt_Rcd
      ) dcsInf
      GROUP BY t.Topa_Rcd
      ORDER BY attr2 DESC";

          using (SqlConnection conn = new SqlConnection(connStr))
          using (SqlCommand cmd = new SqlCommand(sql, conn))
          {
              conn.Open();
              using (SqlDataReader r = cmd.ExecuteReader())
              {
                  while (r.Read())
                  {
                      DataRow row = dt.NewRow();
                      row["Article"] = r.IsDBNull(0) ? "" : r.GetValue(0).ToString();
                      row["Name"] = r.IsDBNull(1) ? "" : r.GetValue(1).ToString();
                      row["Tooling"] = r.IsDBNull(2) ? "" : r.GetValue(2).ToString();
                      row["attr1"] = r.IsDBNull(3) ? "" : r.GetValue(3).ToString();
                      row["attr2"] = r.IsDBNull(4) ? "" : r.GetValue(4).ToString();
                      row["attr3"] = r.IsDBNull(5) ? "" : r.GetValue(5).ToString();
                      row["attr4"] = r.IsDBNull(6) ? "" : r.GetValue(6).ToString();
                      row["attr5"] = r.IsDBNull(7) ? "" : r.GetValue(7).ToString();
                      row["attr6"] = r.IsDBNull(8) ? "" : r.GetValue(8).ToString();
                      row["attr7"] = r.IsDBNull(9) ? "" : r.GetValue(9).ToString();
                      row["attr8"] = r.IsDBNull(10) ? "" : r.GetValue(10).ToString();
                      row["qt"] = r.IsDBNull(11) ? "" : r.GetValue(11).ToString();
                      row["ei_shnm"] = r.IsDBNull(12) ? "" : r.GetValue(12).ToString();
                      row["topa_rcd"] = r.IsDBNull(13) ? "" : r.GetValue(13).ToString();
                      dt.Rows.Add(row);
                  }
              }
          }

          var mainForm = new DevExpress.XtraEditors.XtraForm
          {
              Text = "Детальный поиск (атрибуты)",
              Size = new Size(1300, 700),
              StartPosition = FormStartPosition.CenterScreen,
              WindowState = FormWindowState.Maximized
          };
          var grid = new DevExpress.XtraGrid.GridControl { DataSource = dt, Dock = DockStyle.Fill };
          var view = new DevExpress.XtraGrid.Views.Grid.GridView(grid)
          {
              OptionsBehavior = { Editable = false },
              OptionsView = { ShowGroupPanel = false },
              OptionsFind = { AlwaysVisible = true, FindNullPrompt = "Поиск по всем атрибутам...", ShowClearButton = true }
          };
          grid.MainView = view;

          if (view.Columns["Tooling"] != null)
              view.Columns["Tooling"].Caption = "skln_nm";

          view.DoubleClick += (s, ev) =>
          {
              var row = view.GetFocusedDataRow();
              if (row == null) return;
              string topaStr = Convert.ToString(row["topa_rcd"]);
              string art = Convert.ToString(row["Article"]);
              string nam = Convert.ToString(row["Name"]);
              if (int.TryParse(topaStr, out int selTopa))
                  ShowProductDetail(connStr, selTopa, art, nam);
          };

          mainForm.Controls.Add(grid);
          mainForm.Show();
          view.BestFitColumns();
      }
      catch (Exception ex)
      {
          XtraMessageBox.Show("Ошибка основного запроса: " + ex.Message);
      }
  }

  private void ShowProductDetail(string connStr, int topaRcd, string art, string nam)
  {
      try
      {
          DataTable dt = new DataTable();
          dt.Columns.Add("SklStor_Nm", typeof(string)).Caption = "Наименование склада";
          dt.Columns.Add("SklStor_Sh", typeof(string)).Caption = "Код склада";
          dt.Columns.Add("Place", typeof(string)).Caption = "Место хранения";
          dt.Columns.Add("Quantity", typeof(string)).Caption = "Количество";
          dt.Columns.Add("ProductionOrder", typeof(string)).Caption = "Производственный заказ";
          dt.Columns.Add("topa_rcd", typeof(string)).Caption = "topa_rcd";

          string sql = @"
      SELECT 
          sklstor.SklStor_Nm,
          sklstor.SklStor_Sh,
          '' AS Place,
          dcsInf.qt,
          t.TOpa_AttrTpName7 AS ProductionOrder,
          t.Topa_Rcd
      FROM TSKLOPADETAIL t
      INNER JOIN SKLKRT sklkrt ON t.Topa_Rcd = sklkrt.SklKrt_RcdOpa
      INNER JOIN SKLSTOR sklstor ON sklkrt.SklKrt_Stor = sklstor.SklStor_Rcd
      OUTER APPLY (
          SELECT SUM(CASE WHEN skldcs_mov = 1 THEN 1 ELSE -1 END * skldcs_qtosn) qt
          FROM SKLDCS WHERE skldcs_krt = sklkrt.SklKrt_Rcd
      ) dcsInf
      WHERE t.Topa_Rcd = @topaRcd";

          using (SqlConnection conn = new SqlConnection(connStr))
          using (SqlCommand cmd = new SqlCommand(sql, conn))
          {
              cmd.Parameters.AddWithValue("@topaRcd", topaRcd);
              conn.Open();
              using (SqlDataReader r = cmd.ExecuteReader())
              {
                  while (r.Read())
                  {
                      DataRow row = dt.NewRow();
                      row["SklStor_Nm"] = r.IsDBNull(0) ? "" : r.GetValue(0).ToString();
                      row["SklStor_Sh"] = r.IsDBNull(1) ? "" : r.GetValue(1).ToString();
                      row["Place"] = r.IsDBNull(2) ? "" : r.GetValue(2).ToString();
                      row["Quantity"] = r.IsDBNull(3) ? "" : r.GetValue(3).ToString();
                      row["ProductionOrder"] = r.IsDBNull(4) ? "" : r.GetValue(4).ToString();
                      row["topa_rcd"] = r.IsDBNull(5) ? "" : r.GetValue(5).ToString();
                      dt.Rows.Add(row);
                  }
              }
          }

          var detailForm = new DevExpress.XtraEditors.XtraForm
          {
              Text = $"Остатки на предприятии: {article} – {Name}",
              Size = new Size(900, 400),
              StartPosition = FormStartPosition.CenterParent
          };
          var grid = new DevExpress.XtraGrid.GridControl { DataSource = dt, Dock = DockStyle.Fill };
          var view = new DevExpress.XtraGrid.Views.Grid.GridView(grid)
          {
              OptionsBehavior = { Editable = false },
              OptionsView = { ShowGroupPanel = false },
              OptionsFind = { AlwaysVisible = true, FindNullPrompt = "Поиск...", ShowClearButton = true }
          };
          grid.MainView = view;

          
          view.DoubleClick += (s, ev) =>
          {
              var row = view.GetFocusedDataRow();
              if (row == null) return;
              string topaStr = Convert.ToString(row["topa_rcd"]);
              string storSh = Convert.ToString(row["SklStor_Sh"]);
              string storNm = Convert.ToString(row["SklStor_Nm"]);
              string prodOrd = Convert.ToString(row["ProductionOrder"]);
              if (string.IsNullOrEmpty(storSh))
              {
                  XtraMessageBox.Show("Не указан код склада.");
                  return;
              }
              if (int.TryParse(topaStr, out int selTopa))
                  ShowMovements(connStr, selTopa, article, Name, storSh, storNm, prodOrd);
          };

          detailForm.Controls.Add(grid);
          detailForm.Show();
          view.BestFitColumns();
      }
      catch (Exception ex)
      {
          XtraMessageBox.Show("Ошибка загрузки остатков: " + ex.Message);
      }
  }

  private void ShowMovements(string connStr, int selTopa, GridColumn article, string name, string storSh, string storNm, string prodOrd)
  {
      try
      {
          DataTable dt = new DataTable();
          dt.Columns.Add("DocType", typeof(string)).Caption = "Тип документа";
          dt.Columns.Add("DocNumber", typeof(string)).Caption = "Номер документа";
          dt.Columns.Add("NaklNumber", typeof(string)).Caption = "№ накладной";
          dt.Columns.Add("Comment", typeof(string)).Caption = "Комментарий";
          dt.Columns.Add("DocDate", typeof(string)).Caption = "Дата";
          dt.Columns.Add("Kontragent", typeof(string)).Caption = "Контраг-заказ";
          dt.Columns.Add("KontrCode", typeof(string)).Caption = "Код контрагента-заказа";
          dt.Columns.Add("Prihod", typeof(string)).Caption = "Приход";
          dt.Columns.Add("Rashod", typeof(string)).Caption = "Расход";
          dt.Columns.Add("Ostatok", typeof(string)).Caption = "Остаток (шт)";
          dt.Columns.Add("SklStor", typeof(string)).Caption = "Склад";

          
          string sql = @"
      SELECT 
          d.SklDc_OprCd AS DocType,
          d.SklDc_Nmr AS DocNumber,
          d.SklDc_RcdNak AS NaklNumber,
          d.SklDc_Cmt1 AS Comment,
          d.SklDc_Dat AS DocDate,
          d.SklDc_KAgRcd AS Kontragent,
          d.SklDc_KAgRcd AS KontrCode,
          CASE WHEN d.SklDc_Mov = 1 THEN d.SklDc_QtOsn ELSE 0 END AS Prihod,
          CASE WHEN d.SklDc_Mov = -1 THEN d.SklDc_QtOsn ELSE 0 END AS Rashod,
          SUM(CASE WHEN d.SklDc_Mov = 1 THEN d.SklDc_QtOsn ELSE -d.SklDc_QtOsn END) 
              OVER (ORDER BY d.SklDc_Dat, d.SklDc_Rcd) AS Ostatok,
          s.SklStor_Nm AS SklStor
      FROM SKLDCS d
      INNER JOIN SKLKRT krt ON d.skldcs_krt = krt.SklKrt_Rcd
      INNER JOIN SKLSTOR s ON krt.SklKrt_Stor = s.SklStor_Rcd
      WHERE krt.SklKrt_RcdOpa = @topaRcd
        AND s.SklStor_Sh = @sklStorSh
      ORDER BY d.SklDc_Dat, d.SklDc_Rcd";

          using (SqlConnection conn = new SqlConnection(connStr))
          using (SqlCommand cmd = new SqlCommand(sql, conn))
          {
              
              cmd.Parameters.Add(new SqlParameter("@topaRcd", SqlDbType.Int) { Value = topaRcd });
              cmd.Parameters.Add(new SqlParameter("@sklStorSh", SqlDbType.NVarChar, 50) { Value = sklStorSh ?? "" });

              conn.Open();
              int rowCount = 0;
              decimal sumOstatok = 0;
              using (SqlDataReader r = cmd.ExecuteReader())
              {
                  while (r.Read())
                  {
                      DataRow row = dt.NewRow();
                      row["DocType"] = r.IsDBNull(0) ? "" : r.GetValue(0).ToString();
                      row["DocNumber"] = r.IsDBNull(1) ? "" : r.GetValue(1).ToString();
                      row["NaklNumber"] = r.IsDBNull(2) ? "" : r.GetValue(2).ToString();
                      row["Comment"] = r.IsDBNull(3) ? "" : r.GetValue(3).ToString();
                      // дата
                      if (r.IsDBNull(4))
                          row["DocDate"] = "";
                      else
                      {
                          try { row["DocDate"] = Convert.ToDateTime(r.GetValue(4)).ToString("dd.MM.yyyy"); }
                          catch { row["DocDate"] = r.GetValue(4).ToString(); }
                      }
                      row["Kontragent"] = r.IsDBNull(5) ? "" : r.GetValue(5).ToString();
                      row["KontrCode"] = r.IsDBNull(6) ? "" : r.GetValue(6).ToString();
                      row["Prihod"] = r.IsDBNull(7) ? "" : r.GetValue(7).ToString();
                      row["Rashod"] = r.IsDBNull(8) ? "" : r.GetValue(8).ToString();
                      string ostatokStr = r.IsDBNull(9) ? "0" : r.GetValue(9).ToString();
                      row["Ostatok"] = ostatokStr;
                      row["SklStor"] = r.IsDBNull(10) ? "" : r.GetValue(10).ToString();
                      dt.Rows.Add(row);

                      if (decimal.TryParse(ostatokStr, out decimal ost))
                          sumOstatok += ost;
                      rowCount++;
                  }
              }

              // Итоговая строка как на фото
              DataRow totalRow = dt.NewRow();
              totalRow["DocType"] = "";
              totalRow["DocNumber"] = "";
              totalRow["NaklNumber"] = "";
              totalRow["Comment"] = $"Кол-во = {rowCount}";
              totalRow["DocDate"] = "";
              totalRow["Kontragent"] = "";
              totalRow["KontrCode"] = "";
              totalRow["Prihod"] = "";
              totalRow["Rashod"] = "";
              totalRow["Ostatok"] = $"Сумма = {sumOstatok}";
              totalRow["SklStor"] = "";
              dt.Rows.Add(totalRow);
          }

          // Заголовок
          string caption = $"Номенклатура: {article} {name} | № заказа: {prodOrder} | Склад: {sklStorSh} - {sklStorNm}";

          var movForm = new DevExpress.XtraEditors.XtraForm
          {
              Text = caption,
              Size = new Size(1100, 500),
              StartPosition = FormStartPosition.CenterParent
          };
          var grid = new DevExpress.XtraGrid.GridControl { DataSource = dt, Dock = DockStyle.Fill };
          var view = new DevExpress.XtraGrid.Views.Grid.GridView(grid)
          {
              OptionsBehavior = { Editable = false },
              OptionsView = { ShowGroupPanel = false },
              OptionsFind = { AlwaysVisible = true, FindNullPrompt = "Поиск...", ShowClearButton = true }
          };
          grid.MainView = view;
          movForm.Controls.Add(grid);
          movForm.Show();
          view.BestFitColumns();
      }
      catch (Exception ex)
      {
          string fullError = $"{ex.GetType().Name}: {ex.Message}\r\n\r\n{ex.StackTrace}";
          if (ex.InnerException != null)
              fullError += $"\r\n\r\nInner: {ex.InnerException.GetType().Name}: {ex.InnerException.Message}\r\n{ex.InnerException.StackTrace}";
          XtraMessageBox.Show(fullError, "Ошибка в ShowMovements");
      }
  }

  private object GetSklStorNm()
  {
      return sklStorNm;
  }