/// <summary> /// Рекурсивный метод построения дерева /// </summary> /// <param name="root">Корень для текущей итерации</param> /// <param name="RowsData">Строки таблицы СИ для построения дерева</param> /// <param name="parent">Код родительского узла</param> public void BuiltTree(TreeNode root, CompositionRow[] RowsData, long parent) { for (int i = 0; i < RowsData.Length; i++) if (RowsData[i].WhereCode == parent) { TreeNode node = new TreeNode(RowsData[i].RootCode, RowsData[i].WhereCode, RowsData[i].WhatCode, RowsData[i].Count); int ind = root.AddNode(node); BuiltTree(root[ind], RowsData, root[ind].PProductCodeWhat); } }
/// <summary> /// Добавление корня в массив корней изделий /// </summary> /// <param name="node"></param> public void AddRoot(TreeNode node) { Array.Resize(ref Root, Root.Length + 1); Root[Root.Length - 1] = node; }
/// <summary> /// Добавление дочернего узла к текущему узлу /// </summary> /// <param name="node">Новый добавляемый узел TreeNode</param> /// <returns>Возвращает индекс в массиве дочерних узлов, куда был вставлен новый узел</returns> public int AddNode(TreeNode node) { Array.Resize(ref Nodes, Nodes.Length + 1); Nodes[Nodes.Length - 1] = node; return Nodes.Length - 1; }
/// <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); } } }