public static FullApplicationRow ConvertRowInfoToFullApplicationRow(GridViewRowInfo row) { FullApplicationRow res = new FullApplicationRow(); res.ProductCode = (long)row.Cells[0].Value; res.PackageDetails = (long)row.Cells[1].Value; res.Count = Convert.ToInt32(row.Cells[2].Value); return res; }
/// <summary> /// Создание таблицы "Полная применяемость" и ее заполнение /// </summary> /// <param name="data">Данные, для вставки в таблицу</param> public static void CreateAndFillFullApplicationTable(FullApplicationRow[] data) { CreateTableFullApplication(); FillFullApplicationTable(data); IsItFATable = true; }
public static DatabaseLib.ParametersCollection ConvertFullApplicationRowToParameters(FullApplicationRow row) { DatabaseLib.ParametersCollection par = new DatabaseLib.ParametersCollection(); par.Add("ProductCode", row.ProductCode, DbType.UInt64); par.Add("PackageDetails", row.PackageDetails, DbType.UInt64); par.Add("Count", row.Count, DbType.UInt32); return par; }
/// <summary> /// Заполнение данными таблицы "Полная применяемость" /// </summary> /// <param name="data">Данные, для вставки в таблицу</param> public static void FillFullApplicationTable(FullApplicationRow[] data) { DatabaseLib.ParametersCollection[] Pars = new DatabaseLib.ParametersCollection[data.Length]; for (int i = 0; i < data.Length; i++) { Pars[i] = Converter.ConvertFullApplicationRowToParameters(data[i]); } dbf.InsertMany("FullApplication", Pars); }
/// <summary> /// Подсчет количества деталей в изделии /// </summary> /// <returns>Возвращает сассив с данными об изделиях и их составе</returns> public FullApplicationRow[] CalculateFullApplication() { FullApplicationRow[] Data = new FullApplicationRow[0]; int i; for (i = 0; i < Root.Length; i++) // просматриваем по деревьям { GoIntoTree(Root[i], ref Data, 1); // подсчитаем для одного изделия } IsCalculated = true; return Data; }
/// <summary> /// Проверка на существование в массиве сведений о текущей детали /// </summary> /// <param name="node">Текущий узел (описывает данные текущей детали)</param> /// <param name="Data">Массив со сведениями о деталях</param> /// <returns>Возвращает True, если деталь уже имеет описание в массиве, в противном случае False</returns> private bool IsItDetail(TreeNode node, FullApplicationRow[] Data) { bool flag = false; for (int i = 0; i < Data.Length; i++) { if (node.PRootCode == Data[i].ProductCode && node.PProductCodeWhat == Data[i].PackageDetails) { flag = true; break; } } return flag; }
/// <summary> /// Вставка данных о детали в массив данных для таблицы ПП /// </summary> /// <param name="node">Вставляемый узел (данные для вставки)</param> /// <param name="Data">Собственно сам массив с данными</param> /// <param name="count">Счетчик единиц (накапливаемый)</param> private void InsertNodeDataToFAData(TreeNode node, ref FullApplicationRow[] Data, int count) { // проверим, есть ли уже в массиве запись для данной детали if (!IsItDetail(node, Data)) { Array.Resize(ref Data, Data.Length + 1); Data[Data.Length - 1].ProductCode = node.PRootCode; Data[Data.Length - 1].PackageDetails = node.PProductCodeWhat; Data[Data.Length - 1].Count = node.PCount * count; } else // если есть уже запись для данной детали { for (int i = 0; i < Data.Length; i++) if (node.PRootCode == Data[i].ProductCode && node.PProductCodeWhat == Data[i].PackageDetails) { Data[i].Count += node.PCount * count; // увеличим количество существующих деталей break; } } }
/// <summary> /// Рекурсивный метод обхода дерева для подсчета состава изделия /// </summary> /// <param name="root">Корневой узел для обхода</param> /// <param name="Data">Массив сведений о составе изделия</param> /// <param name="count">Счетчик единиц (накапливаемый)</param> private void GoIntoTree(TreeNode root, ref FullApplicationRow[] Data, int count) { // просматриваем дочерние узлы текушего узла root for (int i = 0; i < root.GetNodesCount(); i++) { // проверям, деталь ли это if (root[i].GetNodesCount() == 0) { InsertNodeDataToFAData(root[i], ref Data, count); } else // если не деталь смотрим для текущего узла { GoIntoTree(root[i], ref Data, root[i].PCount * count); } } }