Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FOREIGN KEY Обеспечение целоостности [D5, IB6.x]


Страницы:   1 2 3

Борис ©   (2002-12-17 11:15:00) 

Уважаемые господа!
Есть N таблиц.

Одна главная:

CREATE TABLE "T_SKLAD"
(
"PKEY" INTEGER NOT NULL,
"NOMINAL" VARCHAR(250) CHARACTER SET WIN1251,
"TYPE_ELEM" VARCHAR(250) CHARACTER SET WIN1251,
"TYPE_ELEM_SVAZ" INTEGER,
"PRICE" INTEGER,
"POSTAVCHIK" INTEGER,
"PRIMECHANIE" VARCHAR(250) CHARACTER SET WIN1251,
"SROK_POSTAVKI" VARCHAR(250) CHARACTER SET WIN1251,
"OSTATOK" FLOAT,
"DEFICIT_NORM" INTEGER,
"ZAKAZAT" INTEGER,
"ZAKAZANO" INTEGER,
"OPLATIT" INTEGER,
"OPLACHENO" INTEGER,
"P1" INTEGER,
"P2" INTEGER,
"P3" INTEGER,
"P4" INTEGER,
"P5" INTEGER,
PRIMARY KEY ("PKEY")
);


И есть подчиненные таблицы (их много, но они одинаковые)
CREATE TABLE "T_NORM_1"
(
"PKEY" INTEGER NOT NULL,
"SECOND_KEY" INTEGER,
"NORMA" FLOAT,
"NORMA_NA_N" FLOAT,
"P1" FLOAT,
"P2" FLOAT,
"P3" FLOAT,
"P4" FLOAT,
"P5" FLOAT,
PRIMARY KEY ("PKEY")
);
ALTER TABLE "T_NORM_1" ADD FOREIGN KEY ("SECOND_KEY") REFERENCES T_SKLAD ("PKEY");


Задача - Обеспечетиь, чтобы для каждой строки в таблице T_SKLAD была своя строка в таблицах T_NORM_N (1..N) завязанная Первичный ключ T_SKLAD - Вторичный ключ SECOND_KEY T_NORM_N.


Anatoly Podgoretsky   (2002-12-30 09:53:00) [21]

Он уже этот вопрос задавал много месяцев назад, один к одному, тогда было дано много нормальных ответов.


Delirium^.Tremens   (2002-12-30 09:33:00) [22]

Для того, чтобы у Бориса окончательно башню снесло, могу посоветовать посмотреть как это реализовано в 1С:Предприятии (конф. Производство+Услуги+Бухгалтерия).


ЮЮ   (2002-12-30 09:30:00) [23]

Зато без Бориса никто не сможет начать производство новой продукции :-)


Sergey13   (2002-12-30 09:26:00) [24]

Может я чего не понял, но ИМХО, есть над чем поурчать проектировщику. Например
>У каждой продукции свои платы. на каждую плату таблица с нормами

Это как? При разработке новой продукции - строится новая структура таблиц?


Борис   (2002-12-30 09:00:00) [25]

Уважаемая Наталия и Сергей!
Опишу кратко проблему:
Имеется склад комплектующих. N позиций на склдае. N > 1000.
Имеются планы производства. Фактически это сколько единиц комплектующих выдано на каждую плату каждой продукции (в одной продукции N различных плат).
Имеются нормы (это сколько какой детали необходимо, чтобы собрать 1 плату). Имеется также незавершенка (это сколько выдано на данную плату в пределах плана). Т.е. можно запустить в производство сколько угодно планов.
И это все в различных таблица. В одной таблице склад. Потом таблица продукции. У каждой продукции свои платы. на каждую плату таблица с нормами (ссылка на комплектующие из главной таблицы и само значение нормы). + Для каждой платы сколько угодно незвершенок (это куда выдают комплектующие на плату).


Sergey13   (2002-12-30 08:37:00) [26]

2Борис © (30.12.02 08:24)
>На парадоксе не влезало в 255 столбцов, а сейчас их будет значительно больше!
Если не секрет, что за задача? Не часто встретишь, что бы 255 столбцов не зватало. Может консерваторию править надо. ИМХО, Наталия © (30.12.02 06:47) права.


Наталия   (2002-12-30 08:32:00) [27]

А зачем столько столбцов? :)
Ты таблицы объединяй "не в ширину" :), а "в глубину" :).
А в одном дополнительном поле "норма" указывать к какой таблице из перечня норм принадлежит данная запись.


Борис   (2002-12-30 08:24:00) [28]

Наталия!
Вы знаете, так раньше и было сделано! Однако колчиство этих таблиц большое. На парадоксе не влезало в 255 столбцов, а сейчас их будет значительно больше!


kaif   (2002-12-30 07:23:00) [29]

Наталия © (30.12.02 06:47)
Очень резонное замечание.


Наталия   (2002-12-30 06:47:00) [30]

А не проще ли все однотипные таблицы норм преобразовать в одну таблицу с дополнительным полем "Норма"? Тем более, что судя по всему, количество этих таблиц не постоянно.


Борис   (2002-12-28 09:10:00) [31]

Есть один вопрос:
Имеется таблицы со списком названий предположим Таблиц норм.

Необходимо в тригере пройтись по этой таблице и вставить в каждую таблицу нормы новую строчку. Как это можно организовать?


Romkin   (2002-12-17 13:04:00) [32]

create trigger Set_detail for T_SKLAD
after insert
as
begin
insert into T_NORM (PKEY, Second_key, ...)
values (Gen_ID(...,1), NEW.PKEY); /* NEW - новое значение поля в T_Sklad */
end
А по моему коду - это просто аналог твоей таблицы T_Sklad, базу надо строить так, чтобы не приходилось писать такие триггеры


Борис   (2002-12-17 12:54:00) [33]

Большое спасибо!
Как я понел надо:
пройтись по списку таблиц, в каждую добавить запись и все будет ОК.
Только вот как в данном тригере получить вводимы значения строчки из T_SKLAD?


Romkin   (2002-12-17 12:37:00) [34]

create trigger Set_detail for table1T_SKLAD
after insert
as
begin
insert into T_NORM (...)
values (...);
end


Борис   (2002-12-17 12:30:00) [35]

Prooksius
Я не прошу, чтобы за меня что-то писали. я попросил Romkin-а чтобы он дал комментарии к приведенному тексту.

Реализацию с помощью тригера я представляю, но как я понял romkin приводит другой вариант? Или я не прав?


Prooksius   (2002-12-17 12:16:00) [36]

2 Борис © (17.12.02 11:54)
Ты прямо хочешь чтобы за тебя и прогу написали, и базу составили.
Читай умные книжки. Твоих знаний пока недостаточно для этого.


Борис   (2002-12-17 11:54:00) [37]

Уважаемый Romkin!
Спасибо за приведение текста. Однако непонятно, как в данном случае можно обеспечить наличие строк в обеих таблицах?
Прошу, если возможно, объяснить.


Romkin   (2002-12-17 11:39:00) [38]

/* Table: Остатки по дням движения, Owner: SYSDBA */

CREATE TABLE "WH_REMAIN"
(
"MODEL_ID" INTEGER NOT NULL,
"REMAIN_COUNT" "DCOUNT",
"DATA" DATE DEFAULT "TODAY" NOT NULL,
CONSTRAINT "PK_WH_REMAIN" PRIMARY KEY ("MODEL_ID", "DATA")
);


Romkin   (2002-12-17 11:37:00) [39]

/* Domain definitions */
CREATE DOMAIN DCOUNT AS NUMERIC(18, 4) /*Количество*/
default 1 NOT NULL;
CREATE DOMAIN DCURRENCY AS NUMERIC(15, 2) /*Цена*/
default 0 NOT NULL;
CREATE DOMAIN DLONGNAME AS VARCHAR(254) CHARACTER SET WIN1251;
CREATE DOMAIN DMASK AS CHAR(5) CHARACTER SET WIN1251;
CREATE DOMAIN DNAME AS VARCHAR(120) CHARACTER SET WIN1251;
CREATE DOMAIN DNOTES AS VARCHAR(4096) CHARACTER SET WIN1251;
CREATE DOMAIN DNUMBER AS VARCHAR(40) CHARACTER SET WIN1251;
CREATE DOMAIN DSHORTNAME AS VARCHAR(25) CHARACTER SET WIN1251;
CREATE DOMAIN DTYPE AS CHAR(5) CHARACTER SET WIN1251 NOT NULL;

/* Table: книга прихода-расхода (и резервирования), Owner: SYSDBA */

CREATE TABLE "ACCOUNTBOOK"
(
"ACCOUNTBOOK_ID" INTEGER NOT NULL,
"PARTY_NUM" INTEGER NOT NULL, /*Номер партии*/
"PARTY_YEAR" INTEGER NOT NULL, /*Год*/
"INOUT_SIGN" INTEGER default 1 NOT NULL, /*-1 - расход, 1 - приход, 0 - резерв*/
"PARTY_STATUS_ID" INTEGER default 1 NOT NULL,
"DATA" DATE DEFAULT "TODAY" NOT NULL, /*День движения*/
"BASE_TYPE" INTEGER, /*BASE - документ-основание*/
"BASE_NUM" "DNUMBER",
"BASE_DATE" DATE,
"MODEL_ID" INTEGER NOT NULL, /*Что за товар*/
"CLIENT_ID" INTEGER NOT NULL, /*от кого/кому*/
"COUNTNUM" "DCOUNT", /*кол-во*/
"UNIT_ID" INTEGER DEFAULT 1 NOT NULL, /*ед изм*/
"GARANTY" DATE, /*срок гарантии*/
"GCD_NUM" "DNUMBER",
"COUNTRY" "DNAME",
"ACT0" "DNUMBER",
"IN0" "DNUMBER",
"NOTES" "DNOTES",
"USER_ID" INTEGER,
CONSTRAINT "PK_ACCOUNT_BOOK" PRIMARY KEY ("ACCOUNTBOOK_ID")
);


Prooksius   (2002-12-17 11:31:00) [40]

2 Борис © (17.12.02 11:27)
Так в триггере after insert и добавляешь.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо