Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
x666ep
2 / 2 / 3
Регистрация: 24.04.2012
Сообщений: 29
#1

Генерация дерева на основе дерева!

19.01.2015, 12:32. Просмотров 640. Ответов 1
Метки нет (Все метки)

Доброго времени суток всем!

Суть: Есть в MSSQL БД, импортированная из dbf Clipper dBASE IV
В таблице хранится спецификации изделия. Все, огромное количество полей.

Нужно составить дерево 1 выбранной спецификации.
Структура таблиц простая - Куда входит, что входит. НО поле КУДА не уникально, и просто построить иерархию у меня не получается. Через пень колоду у меня получилось извратно пребразовать всё это в дерево. Но грузиццо по 10 минут.

Я бы очень хотел преобразовать это безобразие в нормальную таблицу. Но к сожалению пошел уже 3ий день....
Главная проблема в логике преобразования дополнительных полей. В общем, если WP = 0 - это изначальная спека и менять ничего не требуется. (Все модификаторы применяются в последовательности к комплектам и нужным модификатором строки можно считать последний) WP = 1 - Заменяем SD, WP = 2 - Строка Удаляется из спеки

Для построения дерева в принципе всегда известен корень - это Децималь спеки комплекта.

Примерно вот так хотелось бы что бы выглядело:

ID ParentID WC WA SD
1 1 УВ1077402-06 УВ1077402-06 0
2 1 УВ1077402-06 someone n

Кликните здесь для просмотра всего текста

WC куда входит
WA что входит
SD количество
SB комплект
WP признак корректировки


Нормальная таблица
C#
1
2
3
4
5
6
7
8
public partial class UV107740206
    {
        public int ID { get; set; }
        public Nullable<int> ParentID { get; set; }
        public string WC { get; set; }
        public string WA { get; set; }
        public Nullable<int> SD { get; set; }
    }

БД В SQL прикладываю. Получилось очень сумбурно, состояние без сна даёт о себе знать. Буду благодарен за любую помощь. В том числе возможно и материально...
0
Вложения
Тип файла: zip FILE101.zip (1.35 Мб, 5 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2015, 12:32
Ответы с готовыми решениями:

Создать класс дерева, содержащего числа. Реализовать функцию, определяющую количество уровней дерева
Нужна программа: Создать класс дерева, содержащего числа. Реализовать в этом...

Создание дерева на основе свойств объектов
Добрый день! Прошу помощи! List&lt;LeafObject&gt; Set; class LeafObject {...

Вывод бинарного дерева в виде дерева
Помогите пожалуйста вывести дерево в консоль в виде дерева. Саму структуру я...

Реализация многочлена (класс на основе списка, бинарного или сбалансированного дерева)
Здравствуйте! Скоро сдавать зачет и препод скорее всего попросит написать на...

Обход дерева
Узел дерева имеет поля: char letter; // символ int frequency; //частота...

1
x666ep
2 / 2 / 3
Регистрация: 24.04.2012
Сообщений: 29
20.01.2015, 11:15  [ТС] #2
После небольшого но продуктивного сна родилось(выродилось) вот это чудо:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.Linq;
 
 
namespace MigrateApp
{
    class Program
    {
        private static string StartKey = "УВ1077402-06";
        static ClipperEntities dbContext = new ClipperEntities();
        public static void Main(string[] args)
        {
            CreateTree(2);
          //Console.WriteLine("{0} - {1}", row.WC, row.WA);
 
            
            Console.ReadLine();
        }
 
        private static void CreateTree(int id)
        {
            UV107740206 temp = GetRootContent(id);
            List<FILE10> f10 = GetGenerateContent(temp.WA).ToList();
            
            foreach (FILE10 row in f10)
            {
                UV107740206 newOrder = new UV107740206
                {
                    ParentID = temp.ID,
                    WC = row.WC,
                    WA = row.WA,
                    SD = row.SD,
                    SB = row.SB,
                    WP = row.WP
                };
                dbContext.UV107740206.Add(newOrder);
                int changes = dbContext.SaveChanges();
                
 
                Console.WriteLine(changes.ToString() + " changes saved!");
                CreateTree(newOrder.ID);
 
            }
        }
 
 
        private static UV107740206 GetRootContent(int id)
        {
            UV107740206 fuv = dbContext.UV107740206.First(u => u.ID == id);
            return fuv;
        }
 
        private static IQueryable<FILE10> GetGenerateContent(string wc)
        {
            IQueryable<FILE10> f10 = dbContext.FILE10.Where(f => f.WC == wc);
 
            return f10;
        }
        
    }
}
Помогите теперь сделать проверки и слитие строк! А так-же правильный выход из рекурсии, что-то мне подсказывает что после окончания работы я просто словлю эксепшен

Добавлено через 7 часов 43 минуты
Фсё. Спасибо за монолог


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Linq;
 
 
namespace MigrateApp
{
    class Program
    {
 
        private static UV107740206 _newOrder;
        static ClipperEntities dbContext = new ClipperEntities();
        private static FILE10 _row;
 
        private static string _pribor;
 
        public static void Main(string[] args)
        {
            CreateTree(1);//Console.WriteLine("{0} - {1}", row.WC, row.WA);
 
            Console.WriteLine("Complete");
            Console.ReadLine();
        }
 
        private static void CreateTree(int id)
        {
            UV107740206 temp = GetRootContent(id);
            List<FILE10> f10 = GetGenerateContent(temp.WA).ToList();
 
            for (int i = (f10.Count()-1); i >= 0; i--)
            {
                
                try
                {
                    _row = f10[i];
                }
                catch (Exception)
                {
 
                    if (i == 30)
                    {
                        _row = f10[29];
                    }
                    else
                    {
                        _row = f10[i - 1];
                    }
                    
                   
                }
 
                if (_row.WC == "УВ1077402-06")
                {
                    _pribor = _row.WA;
                }
 
                if (_row.WP != 0)
                {
                    FILE10 wpCheck =
                        f10.Where(w => w.WC == _row.WC && w.WA == _row.WA).OrderByDescending(w => w.SB).First();
 
                    switch (wpCheck.WP)
                    {
                        case 1:
                            f10.RemoveAll(r => r.WC == wpCheck.WC && r.WA == wpCheck.WA && r.WP != wpCheck.WP);
                            _newOrder = new UV107740206
                            {
                                ParentID = temp.ID,
                                WC = wpCheck.WC,
                                WA = wpCheck.WA,
                                SD = wpCheck.SD,
                                Pribor = _pribor,
                                Komplekt = "977"
                            };
                            dbContext.UV107740206.Add(_newOrder);
                            break;
                        case 2:
                            f10.RemoveAll(r => r.WC == wpCheck.WC && r.WA == wpCheck.WA);
                            break;
                    }
                }
                else
                {
                    _newOrder = new UV107740206
                    {
                        ParentID = temp.ID,
                        WC = _row.WC,
                        WA = _row.WA,
                        SD = _row.SD,
                        Pribor = _pribor,
                        Komplekt = "977"
                    };
                    dbContext.UV107740206.Add(_newOrder);
                }
 
 
                int changes = dbContext.SaveChanges();
                Console.WriteLine(changes.ToString() + " changes saved!");
                CreateTree(_newOrder.ID);
            }
        }
 
 
        private static UV107740206 GetRootContent(int id)
        {
            UV107740206 fuv = dbContext.UV107740206.First(u => u.ID == id);
            return fuv;
        }
 
        private static IQueryable<FILE10> GetGenerateContent(string wc)
        {
            IQueryable<FILE10> f10 = dbContext.FILE10.Where(f => f.WC == wc);
 
            return f10;
        }
        
    }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2015, 11:15

реализация n-дерева
помогите пожалуйста с реализацией n-дерева необходимо создать дерево,рисуя...

Копирование дерева
Есть дерево (пример кода ниже) У каждого предка может быть несколько потомков....

Реализация дерева
Нужно реализовать дерево подобного вида: BRA - ARG : 0 - 2 BRA - FRA...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru