Загрузка данных
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;
}