/// <summary> /// Построение дерева и создание ТБД "ПП" /// </summary> public static void BuiltTreeAndCreateFATable() { // загрузим данные из ТБД "Состав изделий" DatabaseLib.Select str = new DatabaseLib.Select(); str.From("CompositionProducts"); DataTable dt = DBWorker.dbf.Execute(str); // построим дерево классом для деревьев CompositionRow[] data = Converter.ConvertDataTableToCompositionRow(dt); Tree tr = new Tree(data); // подсчитаем полную применяемость изделий if (!tr.IsCalculated) // если еще не рассчитана полная применяемость { // подсчитаем кол-во деталей в изделиях FullApplicationRow[] calc = tr.CalculateFullApplication(); // заполним таблицу БД ПП DBWorker.CreateAndFillFullApplicationTable(calc); } }
/// <summary> /// Генератор отчета по таблице "Полная применяемость" /// </summary> /// <param name="tr">Дерево разузлования</param> public static void GenerateFullApplicationReport(Tree tr) { // создание файла и запись в него ведомости StreamWriter file = new StreamWriter(GlobalVars.AppDir + @"\Reports\FullApllicationTableReport.html"); // формирование заголовка HTML файла string Header = @"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> <html xmlns='http://www.w3.org/1999/xhtml'> <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> <title>Ведомость по таблице Полная применяемость</title> <style type='text/css'> .h2 { text-align: left; display: table-caption; font-family: 'Times New Roman', Times, serif; color: #009; text-decoration: underline; } </style> </head>"; file.WriteLine(Header); // начало тела HTML файла file.WriteLine("<body><p align = 'center'>"); // определение количества корневых узлов (изделий) int count = tr.Root.Length; // для каждого изделия формирование своей таблицы string str; DataTable dt; for (int i = 0; i < count; i++) { // выборка из таблицы СНП описания продукции для корня str = String.Format("SELECT * FROM ProductNames WHERE ProductNames.ProductKey = {0}", tr.Root[i].PRootCode); dt = DBWorker.dbf.Execute(str); str = String.Format("{0} {1} {2}", dt.Rows[0].ItemArray[0], dt.Rows[0].ItemArray[1], dt.Rows[0].ItemArray[2]); // формирование заголовка таблицы и самой таблицы file.WriteLine("<table border='1' cellspacing='0' width='90%'>"); file.WriteLine(String.Format("<caption align='left'><h2 class='h2'>Ведомость изделия: {0} </h2></caption>", str)); file.WriteLine(@"<tr> <th>Код детали</th> <th>Наименование, обозначение детали</th> <th>Количество деталей, входящее в изделие</th> </tr>"); // загрузка данных для выбранного корня (изделия) str = String.Format(@"SELECT ProductNames.ProductKey, ProductNames.Name || ' ' || ProductNames.Designation AS NameDes, FullApplication.Count FROM FullApplication INNER JOIN ProductNames ON (FullApplication.PackageDetails = ProductNames.ProductKey) WHERE FullApplication.ProductCode = {0}", tr.Root[i].PRootCode); dt = DBWorker.dbf.Execute(str); // формирование таблицы ведомости для данного изделия for (int j = 0; j < dt.Rows.Count; j++) { file.WriteLine("<tr align = 'left'>"); for (int k = 0; k < dt.Columns.Count; k++) file.Write(String.Format("<td>{0}</td> ", dt.Rows[j].ItemArray[k].ToString())); file.WriteLine("</tr>"); } // завершение таблицы file.WriteLine("</table>"); } // заврешение тела HTML файла file.WriteLine("</p></body></html>"); // закрытие файла file.Close(); }