powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Help! Нужен алгоритм совсем не по дереву...
15 сообщений из 15, страница 1 из 1
Help! Нужен алгоритм совсем не по дереву...
    #38722743
D@lex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ID_ITEM_CONTAINER, ID_ITEM - составной PK, и поле PRICE.
Сам ID_ITEM_CONTAINER тоже может входить как ID_ITEM в другой ID_ITEM_CONTAINER.
Т е имеем 2-е таблицы:
1. ITEM
-------------
ID_ITEM
...........
-------------

2. ITEM_CONTAINER
-------------
ID_ITEM_CONTAINER
ID_ITEM

Эти ^ 2-поля - составной первичный ключ и оба внешние к ITEM

PRICE (суммарная цена всех его итемов (ID_ITEM))
...........
-------------
Нужно при изменении PRICE пересчитать все значения в PRICE, всех ID_ITEM_CONTAINER-ов куда он входит и куда входят сами ID_ITEM_CONTAINER и т д до каждого корня из ответвлений. Это для простоты можно представить как дерево с перекрещивающимися ветками и с возможностью одной ветки иметь два родителя. Родитель не может быть итемом сам для себя и все другие итемы куда он входит как итем тоже не должны.
Сделал проц, дергаю ее из триггеров. Проц пересчитывает и апдейтит только самый 1-й уравень выше. Думал триггеры все сделают сами. Но происходи зацикл.
Посоветуйте, что-либо. Мозг уже опух(((
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722755
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D@lex,

DDL по-человечьи + 15-20 строк с данными, напоминающими реальные, - привести можете ?
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722773
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D@lexРодитель не может быть итемом сам для себя и все другие итемы куда он входит
как итем тоже не должны.

Но происходи зацикл.
Значит отквоченное условие не выполняется и где-то в твоём графе есть цикл. Вернись на
стадию проектирования БД или даже к анализу предметной области, поскольку данная схема
неработоспособна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722781
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D@lex,

лучше приведи DDL таблицы и её ключей PK и FK. И таки зря ты составной ПК сделал.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
RECREATE TABLE T(
  ID INT NOT NULL,
  ID_FATHER INT,
  ID_MOTHER INT,
  COST NUMERIC(15, 2),
  CONSTRAINT PK_T PRIMARY KEY(ID),
  CONSTRAINT FK_T_FATHER FOREIGN KEY (ID_FATHER) REFERENCES T(ID),
  CONSTRAINT FK_T_MOTHER FOREIGN KEY (ID_MOTHER) REFERENCES T(ID)
);



Код: plsql
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.
EXECUTE BLOCK (ID INT = :ID)
AS
DECLARE CURRENT_ID INT;
DECLARE ID_FATHER INT;
DECLARE ID_MOTHER INT;
DECLARE COST INT;
DECLARE DEPTH INT;
BEGIN
  FOR
    WITH RECURSIVE R AS (
      SELECT ID,
             ID_FATHER,
             ID_MOTHER,
             COST,
             0 AS DEPTH
      FROM T
      WHERE ID = :ID
      UNION ALL
      SELECT
        T.ID,
        T.ID_FATHER,
        T.ID_MOTHER,
        T.COST,
        R.DEPTH + 1
      FROM R
        JOIN T ON T.ID = R.ID_FATHER
      UNION ALL
      SELECT
        T.ID,
        T.ID_FATHER,
        T.ID_MOTHER,
        T.COST,
        R.DEPTH + 1
      FROM R
        JOIN T ON T.ID = R.ID_MOTHER
    )
    SELECT ID,
           ID_FATHER,
           ID_MOTHER,
           COST,
           DEPTH
    FROM R
    INTO CURRENT_ID,
         ID_FATHER,
         ID_MOTHER,
         COST,
         DEPTH
  DO BEGIN
    /* алгоритм расчёта */
  END
END
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722787
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D@lex,

в триггерах такие вещи лучше не считать.
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722798
D@lex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Структура
CREATE TABLE SRV_ITEMS (
ID_ITEM INTEGER NOT NULL
...
)

CREATE TABLE COMPOUND_SRV_ITEMS (
ID_COMPOUND_ITEM INTEGER NOT NULL,
ID_ITEM INTEGER NOT NULL,
NUMBER DOUBLE PRECISION NOT NULL,
COMPOUND_PRICE NUMERIC(15, 4),
CALC_COMPOUND_PRICE COMPUTED BY (NUMBER * coalesce(COMPOUND_PRICE, 0))
);
ALTER TABLE COMPOUND_SRV_ITEMS ADD PRIMARY KEY (ID_COMPOUND_ITEM, ID_ITEM);
-- foreign
ALTER TABLE COMPOUND_SRV_ITEMS ADD FOREIGN KEY (ID_COMPOUND_ITEM) REFERENCES SRV_ITEMS (ID_ITEM) ON DELETE CASCADE;
ALTER TABLE COMPOUND_SRV_ITEMS ADD FOREIGN KEY (ID_ITEM) REFERENCES SRV_ITEMS (ID_ITEM) ON DELETE CASCADE;

Данные замечательно хранятся и структура рабочая. А вот с пересчетом беда...
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722805
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D@lex,

покажи как пытался. И что конкретно не получается? Обойти дерево?
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722807
D@lex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут картинка с данными в COMPOUND_SRV_ITEMS
http://prntscr.com/4e08gr
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722819
D@lex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Текст процедуры, вызывается после апдейта т COMPOUND_SRV_ITEMS:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  for select ID_COMPOUND_ITEM
  from COMPOUND_SRV_ITEMS
  where ID_ITEM = :ID_ITEM -- (входной параметр услуги у которой измениась цена)
  into :ID_COMPOUND_ITEM
  do
  begin
    -- Предполагалось, что все последующие пересчеты по цепочке вызовут триггеры с вызовом этой же процедуры, но для других  ID
    select sum(C.CALC_COMPOUND_PRICE)
    from COMPOUND_SRV_ITEMS C
    where C.ID_COMPOUND_ITEM = :ID_COMPOUND_ITEM
    into : COMPOUND_PRICE
    
    update COMPOUND_SRV_ITEMS
    set COMPOUND_PRICE = :COMPOUND_PRICE,
    where ID_COMPOUND_ITEM = :ID_COMPOUND_ITEM and
             ID_ITEM <>  :ID_ITEM;
  end
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38722902
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D@lexструктура рабочая. А вот с пересчетом беда...
Оксюморон. Если с запросами беда, значит структура неправильная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38728463
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D@lex,
Можно по-человечески сказать что за объекты и т.д. Услуги или прайс, как что построено? Что это выражает в предметной области? Т.е. постановка задачи в нормальных понятиях... Какие-то итемы, контейнеры, перекрещивающиеся ветки - что это значит.
Ломать мозги над какими-то структурами, тем более возможно неправильно построенными навряд ли кто-то будет.
Я сам занимаюсь бухгалтерией и тому подобными вещами, да и многие в этой области так или иначе работают...
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38728523
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хересе мастодонты повылазили... :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38728605
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамХересе мастодонты повылазили... :)
Да сам сейчас с деревом воюю, на mysql правда... :)
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38728616
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

сочувствую. У mysql с обработкой иерархий всё плохо...
...
Рейтинг: 0 / 0
Help! Нужен алгоритм совсем не по дереву...
    #38733119
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениссочувствую. У mysql с обработкой иерархий всё плохо...Почему плохо? Смотря на какой структуре остановиться. Если традиционный child-parent, то наверное да... но есть же и другие модели.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Help! Нужен алгоритм совсем не по дереву...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]