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

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

Правильное сохранение при Мастер- Детаил [D7, FireBird]


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

Xmen ©   (2009-03-26 07:16:00) 

Привет мастерам.
Делаю программу для склада. Сделал таблицы для прихода товара. Установил связь мастер - детаил. Вопрос в том что если создать форму и поместит в нем 2 грида, один мастер другой детаил то при вводе мастер все нормально но в детаил таблицу ввод не получается изза того что не сохранен данные в мастер таблице. Как можно сохранит сразу и мастер и детаил без commit  таблицы мастера?


Xmen   (2009-03-26 09:23:00) [61]

Я пользуюсь FB1.5 для связи пользуюсь InterBase компонентой.
> ЮЮ ©   (26.03.09 09:13) [12]
> > > Что мешает получить ключ для вставки новой записи в
> мастер-> таблицу до вставки ?До вставки записи в мастер
> таблицу помешает CONSTRAINT FK_PRI_SPISOK_1 FOREIGN KEY
> (PRI_ID) REFERENCES PRIHOD (ID) :)У авторра проблема в том,
>  что забитые в детайл-гриде записи датасет пытается сразу
> засунуть в таблицу, а они должны быть вставлены после записи
> в основную, которая должна произойти только после того,
> как пользователь вобьёт несколько детайл-записей и нажмет
> кнопку "сохранить"

А как можно это тогда по другому сделать? Что можете посоветовать?


Sergey13   (2009-03-26 09:22:00) [62]

+ немного не по теме 8-)

> [0] Xmen   (26.03.09 07:16)
> Сделал таблицы для прихода товара.

Удали ее или переименуй в таблицу ДВИЖЕНИЯ. А то еще придется создавать таблицы расхода, списания и т.д. и т.п.


Сергей М.   (2009-03-26 09:20:00) [63]


> ЮЮ ©   (26.03.09 09:13) [12]
>
>


Причем здесь констрейнт детайл-таблицы ?
Я о вставке в мастер-таблицу..

Ничто ведь не мешает получить значение генератора первичного ключа мастер-таблицы не в триггере на вставку, а передвставкой в мастер-таблицу, т.е. прямым запросом к генератору на стороне клиента ..


ЮЮ   (2009-03-26 09:13:00) [64]


>
> Что мешает получить ключ для вставки новой записи в мастер-
> таблицу до вставки ?


До вставки записи в мастер таблицу помешает
CONSTRAINT FK_PRI_SPISOK_1 FOREIGN KEY (PRI_ID) REFERENCES PRIHOD (ID)
:)

У авторра проблема в том, что забитые в детайл-гриде записи датасет пытается сразу засунуть в таблицу, а они должны быть вставлены после записи в основную, которая должна произойти только после того, как пользователь вобьёт несколько детайл-записей и нажмет кнопку "сохранить"


Сергей М.   (2009-03-26 09:07:00) [65]


> изза того что еще нету внешнего ключа prihod(id)


Что мешает получить ключ для вставки новой записи в мастер-таблицу довставки ?


Виталий Панасенко   (2009-03-26 09:04:00) [66]


> Sergey13 ©   (26.03.09 09:03) [9]

А фиг его знает!:-)


Sergey13   (2009-03-26 09:03:00) [67]

> [4] ЮЮ ©   (26.03.09 08:41)

написал "обычно" вот поэтому

> [5] Виталий Панасенко(дом)   (26.03.09 08:42)

> [6] Xmen   (26.03.09 08:48)

А что еще не ясно?


MsGuns   (2009-03-26 09:00:00) [68]

1c


Виталий Панасенко   (2009-03-26 09:00:00) [69]


> Xmen   (26.03.09 08:48) [6]
>
> И что вы посоветуйте?

А что ты используешь? Компоненты, версия ФБ... тяжело указать или секретная инфа


Xmen   (2009-03-26 08:48:00) [70]

И что вы посоветуйте?


Виталий Панасенко(дом)   (2009-03-26 08:42:00) [71]

Еще
> Sergey13 ©   (26.03.09 08:23) [1]


> 4. Для ИБ/ФБ обычно сначала получают мастер-ИД отдельным
> запросом, потом вставляют его в нужные места.

зависит от версии "птицы".. в 2.х появилась конструкция RETURNING, с помощью которой можно узнать, что сделал триггер(например, сгенерил тот же ИД) без отдельного запроса. Правда, IBX не совсем это поддерживают.ФИБы - без проблем. и у FIBPlus для мастер-детали много приятных вкусностей предусмотрено(подстановка автоматом мастер ИД, пауза при открытии детали(когда пробегаешь по мастеру в поисках нужной записи), автоматическое открытие детали при открытии мастера (нет необходимости явно в коде указывать Detail.Open())). + две транзакции на каждый датасэт одна длинная на чтение, другая, короткая на изменение данных.


ЮЮ   (2009-03-26 08:41:00) [72]


> Для ИБ/ФБ обычно сначала получают мастер-ИД отдельным запросом,
>  потом вставляют его в нужные места

А для остальных иначе?
Тем более, что "вставлять его в нужные места" должна как раз мастер - детэйл связь

Вот только данные в детэйл наборе должны каким-то образом кэшироваться, а не слаться запрос на сервер на вставку записи при переходе из заполненной записи к новой.


Xmen   (2009-03-26 08:37:00) [73]


> Sergey13 ©   (26.03.09 08:23) [1]
> 1. Не надо делать приложение с БД отталкиваясь на пользовательский
> интерфейс.2. Связь МД ты установил, но видимо до конца не
> понимаешь что это такое.3. Пользуясь транзакциями можно
> обновить всю базу без коммита.4. Для ИБ/ФБ обычно сначала
> получают мастер-ИД отдельным запросом, потом вставляют его
> в нужные места.

Мне просто интересно как это в пользовательское форме реализовать. У меня связь нормально работает. Вот как создал таблицы.
CREATE TABLE PRIHOD (
   ID         INTEGER NOT NULL,
   PRINAKNUM  INTEGER,
   PRIDATE    DATE,
   PRISUMMA   NUMERIC(15,2),
   PRINYAL    VARCHAR(30),
   SDAL       VARCHAR(30)
);
ALTER TABLE PRIHOD ADD CONSTRAINT PK_PRIHOD PRIMARY KEY (ID);

CREATE TABLE PRI_SPISOK (
   ID           INTEGER NOT NULL,
   PRI_ID       INTEGER NOT NULL,
   NAME         VARCHAR(50),
   ED_IZM       INTEGER,
   SENA         NUMERIC(15,2),
   KOLICHESTVO  INTEGER,
   SUMMA        NUMERIC(15,2)
);
ALTER TABLE PRI_SPISOK ADD CONSTRAINT PK_PRI_SPISOK PRIMARY KEY (ID);
ALTER TABLE PRI_SPISOK ADD CONSTRAINT FK_PRI_SPISOK_1 FOREIGN KEY (PRI_ID) REFERENCES PRIHOD (ID) ON DELETE CASCADE ON UPDATE CASCADE;
Здесь без сохранения первой таблицы неможно работать с второй таблицей изза того что еще нету внешнего ключа prihod(id)


Сергей М.   (2009-03-26 08:26:00) [74]

А сколько и каких у тебя задействовано транзакций ?


Sergey13   (2009-03-26 08:23:00) [75]

1. Не надо делать приложение с БД отталкиваясь на пользовательский интерфейс.
2. Связь МД ты установил, но видимо до конца не понимаешь что это такое.
3. Пользуясь транзакциями можно обновить всю базу без коммита.
4. Для ИБ/ФБ обычно сначала получают мастер-ИД отдельным запросом, потом вставляют его в нужные места.


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

Наверх

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