Текущий архив: 2009.05.10;
Скачать: CL | DM;
Вниз
Правильное сохранение при Мастер- Детаил Найти похожие ветки
← →
Xmen (2009-03-26 07:16) [0]Привет мастерам.
Делаю программу для склада. Сделал таблицы для прихода товара. Установил связь мастер - детаил. Вопрос в том что если создать форму и поместит в нем 2 грида, один мастер другой детаил то при вводе мастер все нормально но в детаил таблицу ввод не получается изза того что не сохранен данные в мастер таблице. Как можно сохранит сразу и мастер и детаил без commit таблицы мастера?
← →
Sergey13 © (2009-03-26 08:23) [1]1. Не надо делать приложение с БД отталкиваясь на пользовательский интерфейс.
2. Связь МД ты установил, но видимо до конца не понимаешь что это такое.
3. Пользуясь транзакциями можно обновить всю базу без коммита.
4. Для ИБ/ФБ обычно сначала получают мастер-ИД отдельным запросом, потом вставляют его в нужные места.
← →
Сергей М. © (2009-03-26 08:26) [2]А сколько и каких у тебя задействовано транзакций ?
← →
Xmen (2009-03-26 08:37) [3]
> 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:41) [4]
> Для ИБ/ФБ обычно сначала получают мастер-ИД отдельным запросом,
> потом вставляют его в нужные места
А для остальных иначе?
Тем более, что "вставлять его в нужные места" должна как раз мастер - детэйл связь
Вот только данные в детэйл наборе должны каким-то образом кэшироваться, а не слаться запрос на сервер на вставку записи при переходе из заполненной записи к новой.
← →
Виталий Панасенко(дом) (2009-03-26 08:42) [5]Еще
> Sergey13 © (26.03.09 08:23) [1]
> 4. Для ИБ/ФБ обычно сначала получают мастер-ИД отдельным
> запросом, потом вставляют его в нужные места.
зависит от версии "птицы".. в 2.х появилась конструкция RETURNING, с помощью которой можно узнать, что сделал триггер(например, сгенерил тот же ИД) без отдельного запроса. Правда, IBX не совсем это поддерживают.ФИБы - без проблем. и у FIBPlus для мастер-детали много приятных вкусностей предусмотрено(подстановка автоматом мастер ИД, пауза при открытии детали(когда пробегаешь по мастеру в поисках нужной записи), автоматическое открытие детали при открытии мастера (нет необходимости явно в коде указывать Detail.Open())). + две транзакции на каждый датасэт одна длинная на чтение, другая, короткая на изменение данных.
← →
Xmen (2009-03-26 08:48) [6]И что вы посоветуйте?
← →
Виталий Панасенко (2009-03-26 09:00) [7]
> Xmen (26.03.09 08:48) [6]
>
> И что вы посоветуйте?
А что ты используешь? Компоненты, версия ФБ... тяжело указать или секретная инфа
← →
MsGuns © (2009-03-26 09:00) [8]1c
← →
Sergey13 © (2009-03-26 09:03) [9]> [4] ЮЮ © (26.03.09 08:41)
написал "обычно" вот поэтому
> [5] Виталий Панасенко(дом) (26.03.09 08:42)
> [6] Xmen (26.03.09 08:48)
А что еще не ясно?
← →
Виталий Панасенко (2009-03-26 09:04) [10]
> Sergey13 © (26.03.09 09:03) [9]
А фиг его знает!:-)
← →
Сергей М. © (2009-03-26 09:07) [11]
> изза того что еще нету внешнего ключа prihod(id)
Что мешает получить ключ для вставки новой записи в мастер-таблицу до вставки ?
← →
ЮЮ © (2009-03-26 09:13) [12]
>
> Что мешает получить ключ для вставки новой записи в мастер-
> таблицу до вставки ?
До вставки записи в мастер таблицу помешает
CONSTRAINT FK_PRI_SPISOK_1 FOREIGN KEY (PRI_ID) REFERENCES PRIHOD (ID)
:)
У авторра проблема в том, что забитые в детайл-гриде записи датасет пытается сразу засунуть в таблицу, а они должны быть вставлены после записи в основную, которая должна произойти только после того, как пользователь вобьёт несколько детайл-записей и нажмет кнопку "сохранить"
← →
Сергей М. © (2009-03-26 09:20) [13]
> ЮЮ © (26.03.09 09:13) [12]
>
>
Причем здесь констрейнт детайл-таблицы ?
Я о вставке в мастер-таблицу..
Ничто ведь не мешает получить значение генератора первичного ключа мастер-таблицы не в триггере на вставку, а перед вставкой в мастер-таблицу, т.е. прямым запросом к генератору на стороне клиента ..
← →
Sergey13 © (2009-03-26 09:22) [14]+ немного не по теме 8-)
> [0] Xmen (26.03.09 07:16)
> Сделал таблицы для прихода товара.
Удали ее или переименуй в таблицу ДВИЖЕНИЯ. А то еще придется создавать таблицы расхода, списания и т.д. и т.п.
← →
Xmen (2009-03-26 09:23) [15]Я пользуюсь FB1.5 для связи пользуюсь InterBase компонентой.
> ЮЮ © (26.03.09 09:13) [12]
> > > Что мешает получить ключ для вставки новой записи в
> мастер-> таблицу до вставки ?До вставки записи в мастер
> таблицу помешает CONSTRAINT FK_PRI_SPISOK_1 FOREIGN KEY
> (PRI_ID) REFERENCES PRIHOD (ID) :)У авторра проблема в том,
> что забитые в детайл-гриде записи датасет пытается сразу
> засунуть в таблицу, а они должны быть вставлены после записи
> в основную, которая должна произойти только после того,
> как пользователь вобьёт несколько детайл-записей и нажмет
> кнопку "сохранить"
А как можно это тогда по другому сделать? Что можете посоветовать?
← →
ЮЮ © (2009-03-26 09:40) [16]
> Ничто ведь не мешает получить значение генератора первичного
> ключа мастер-таблицы не в триггере на вставку, а перед вставкой
> в мастер-таблицу, т.е. прямым запросом к генератору на стороне
> клиента ..
У человека проблема не с первичным ключом, а с невозможностью вставить в детайл, пока не вставлена запись в мастер.
А вставлять сразу ему не нужно. Ему нужно вставить скопом: 1-у в мастер и несколько в детайл.
← →
Виталий Панасенко (2009-03-26 09:40) [17]Установить CashedUpdates=True в обоих НД.. для мастера ОТДЕЛЬНЫМ запросом получить ИД. Добавить в мастер, подставив полученный ИД. Сделать POST(данные при этом не будут записаны в БД). Заполнить деталь, подставив полученный ИД для мастера.. сделать ApllyUpdates для мастера, затем детали. что-то в этом виде.. где-то так.. либо без кеширования: всегда постить мастера, получить его ИД и далее использовать для детали
← →
Сергей М. © (2009-03-26 09:59) [18]
> ЮЮ © (26.03.09 09:40) [16]
>
>
Как это не вставлена ?
Насколько я понял, вставлена, т.е. Post выполнен, но ТА еще не подтверждена (см. упоминание Commit)
Т.е. для вставки в подчиненную таблицу достаточно знать ID только что вставленной мастер-записи и выполнять вставку в подчиненную таблицу в той же ТА, в которой была выполнена вставка в мастер-таблицу.
← →
MsGuns © (2009-03-26 10:05) [19]>Xmen (26.03.09 09:23) [15]
>Я пользуюсь FB1.5 для связи пользуюсь InterBase компонентой.
Вполне достаточно. ФИБплас сделан для криворуких и ленивых
>А как можно это тогда по другому сделать? Что можете посоветовать?
Делать по стандартной схеме, не выдумывая велоспипеда
1. Сначала добавляется запись в таблицу заголовков приходов (хотя стОит присушаться к совету использовать единые хранилища для всех типов документов).
2. Считывается значение ее идентификатора
3. Собственно "ставится" мастер-детальная форма, при этом мастер-запись уже есть в БД. Проблемы с "привязкой" умирают естественной смертью
4. Документ должен иметь флаг "проведен", т.е. ввод документа не является основанием для правки остатков и таким образом не "участвует" в БД. После того, как он полностью введен и проверен, он проводится - в этом случае в карточки товара прописываются соответствующие строки фактуры, а остатки корректируются . Для того, чтобы документ мог быть подправлен или удален, его следует "откатить" - в результате этой операции из карточек удаляются ссылки на этот документ, а товар возвращается (для приходных документов - снимается) с остатка
Все это имеется и вполне добросоветсно работает в 1С - если так уж неодолимо желание самому написать складскую прожку, имеет смысл хотя бы внимательно ознакомиться как это сделано там.
← →
Xmen (2009-03-26 10:26) [20]> Sergey13 © (26.03.09 09:22) [14]
> + немного не по теме 8-)> [0] Xmen (26.03.09 07:16)> Сделал
> таблицы для прихода товара.Удали ее или переименуй в таблицу
> ДВИЖЕНИЯ. А то еще придется создавать таблицы расхода, списания
> и т.д. и т.п.
Как?
← →
Sergey13 © (2009-03-26 10:36) [21]> [20] Xmen (26.03.09 10:26)
Что как?
← →
MsGuns © (2009-03-26 10:46) [22]>Xmen (26.03.09 10:26) [20]
>Как?
Добавить в таблицу документов поле "Тип документа", куда помещать "П" для приходов, "У" - возврат поставщику, "Р" - реализация, "В" - возвраты от покупателей, "С" - списание, "О" - переоценка(дооценка, уценка).. и поле "Баланс", содержащее фактически знак (1 или -1), задающий приход или списание на/с карточки. (Последнее необязательно если движение фиксируется на карточке уже с правильным знаком)
← →
Sergey13 © (2009-03-26 11:00) [23]> [22] MsGuns © (26.03.09 10:46)
> куда помещать "П" для приходов, "У" - возврат поставщику
Все таки правильнее наверное будет помещать туда ссылку на таблицу операций, ИМХО.
← →
Xmen (2009-03-26 12:08) [24]Ну тогда для каждого запися нужно писать или указывать повторяющийся записей наименование поставщика, номер накладного, дату и др. для каждого запися.
← →
Sergey13 © (2009-03-26 12:11) [25]> [24] Xmen (26.03.09 12:08)
С чего бы это?
← →
Сергей М. © (2009-03-26 12:23) [26]
> для каждого запися
> номер накладного
"Запись" и "накладная"- она вообще-то женского рода).. По кр.мере, в русском языке
← →
Anatoly Podgoretsky © (2009-03-26 13:52) [27]
> 1c
dbf или ms sql или три кольца?
← →
Anatoly Podgoretsky © (2009-03-26 13:56) [28]Нет бесхозным записям!
Сначала мастера, а потом детали.
Хозяин без деталей может быть, а наоборот это уже бардак, по другому порушеная база.
И все речь вокруг транзакций, но мастера вперед.
← →
Xmen (2009-03-26 13:59) [29]
> Сергей М. © (26.03.09 12:23) [26]
> > для каждого запися> номер накладного"Запись" и "накладная"-
> она вообще-то женского рода).. По кр.мере, в русском языке
Наверно плохо знаю.
> Sergey13 © (26.03.09 12:11) [25]
> > [24] Xmen (26.03.09 12:08)С чего бы это?
Ну для склада я понимаю нужно организовать минимум 5 таблиц.
1. Приход. Номера накладных, договоров, фирмы продавца и др.
2. Приход по товаров. Наименование товаров, единицы, цен и сумма.
3. Расход.
4. Расход по товаров. Наименование товаров, единицы, цен и сумма.
5. Книга движений.
Или можно по другому?
← →
Xmen (2009-03-26 14:05) [30]
> Anatoly Podgoretsky © (26.03.09 13:56) [28]
> Нет бесхозным записям!Сначала мастера, а потом детали.Хозяин
> без деталей может быть, а наоборот это уже бардак, по другому
> порушеная база.И все речь вокруг транзакций, но мастера
> вперед.
Я тоже так думаю но как быть? Без получения id значения невозможно сохранить детаил поле. Вед id генерируется после сохранения поля в мастере.
← →
Sergey13 © (2009-03-26 14:13) [31]> [29] Xmen (26.03.09 13:59)
> Или можно по другому?
Нужно!
1. Документы на движение.
2. Товары в документах на движение
3. Операции в документах на движение - это справочник на несколько записей, где будет ИД, название операции и поле направления движения (+1 или -1), на которое надо умножить количество товара, что бы оно прибавилось или списалось с остатка.
← →
Сергей М. © (2009-03-26 14:47) [32]
> для склада .. нужно организовать минимум 5 таблиц
Если шарашкина контора, то и одной достаточно.
← →
Виталий Панасенко (2009-03-26 14:54) [33]
> Xmen (26.03.09 14:05) [30]
Так, а что мешает этот самый ИД(идентификатор) получить? по-моему, абсолютно ничего...
← →
Sergey13 © (2009-03-26 14:58) [34]> [30] Xmen (26.03.09 14:05)
> Вед id генерируется после сохранения поля в мастере.
ИД не генерируется. Генерируется значение генератора (тафтология однако 8-) которое прописывается в ИД. Когда генерируется - тебе решать.
← →
Xmen (2009-03-26 15:19) [35]
> Виталий Панасенко (26.03.09 14:54) [33]
Но для этого нужно сохранить мастер таблицу
← →
Xmen (2009-03-26 15:23) [36]
> Sergey13 © (26.03.09 14:58) [34]
> > [30] Xmen (26.03.09 14:05)> Вед id генерируется после
> сохранения поля в мастере.ИД не генерируется. Генерируется
> значение генератора (тафтология однако 8-) которое прописывается
> в ИД. Когда генерируется - тебе решать.
А как можно это сделать
← →
Виталий Панасенко (2009-03-26 15:32) [37]
> Xmen (26.03.09 15:23) [36]
>
>
См.
> Виталий Панасенко (26.03.09 09:40) [17]
← →
Виталий Панасенко (2009-03-26 15:33) [38]
> Xmen (26.03.09 15:19) [35]
>
>
> > Виталий Панасенко (26.03.09 14:54) [33]
>
> Но для этого нужно сохранить мастер таблицу
Я такого не говорил.
← →
Виталий Панасенко (2009-03-26 15:39) [39]при CashedUpdates=True НИКАКИЕ ДАННЫЕ НЕ ПИШУТСЯ В БД ДО ВЫЗОВА ApplyUpdates соответствующего НД... сделай в OnNewrecord мастер НД получение ИД (отдельным реальным запросом, который "дергает" генератор (select gen_id(gen_name, 1) from rdb$database)
begin
GenQry.Open;
Master.FieldByName("ID").AsInteger := GetQry,FieldByName("GEN_ID_NAME").AsInteger;
end;
типа такого
← →
MsGuns © (2009-03-26 15:48) [40]>Xmen (26.03.09 13:59) [29]
С ума застрелиться !
Товарысч не только писать, но и читать не умеет.
[19] вообще, а абзац про 1с в частности для кого писан был ?
Опять-таки прежде чем садиться писать всякие "мастер-деталы" неплохо бы поиметь какое-никакое представление о ПРЕДМЕТНОЙ ОБЛАСТИ ибо судя по ветке у автор в торговле не ухом, не рылом. Неплохо также подчитать что-нибудь по проектированию БД вообще, например про нормализацию (это к вопросу про "наименования" и т.д.)
Короче, лучшее решение - это 1С. Иначе это будет что-то страшное, а не прогроамма.
Ну а если нужно "поскорее" или "для папы", то эксель в зубы и вперед с песней
Страницы: 1 2 вся ветка
Текущий архив: 2009.05.10;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.012 c