Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi - Перенос из Master-Detail1 в Master-Detail2

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

DizeLyaka



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет знатокам
 
Данные:
Сервер - Firebird 1.5
Компоненты - FIBPlus
 
Дано две таблицы Master-Details1 и Master-Details2. Пользователь в гриде выбирает запись и жмет на кномку ПЕРЕНОСА данной записи.
 
Требуеться перенести текущие данные из Master-Details1 в Master-Details2 (естественно с сохранением связей)?
 
 
А если я переношу абсолюбтно все поля, типа:
 
INSERT INTO MASTER2 (...) SELECT ... FROM MASTER1 WHERE MASTER1_ID = <ID>;
INSERT INTO DETAIL2 (...) SELECT ... FROM DETAIL1 WHERE DETAIL1_MASTER = <ID>;
DROP FROM DETAIL1 WHERE DETAIL1_MASTER = <ID>;
DROP FROM MASTER1 WHERE MASTER1_ID = <ID>;
 
то все получаеться, но в будущем возникает проблема, если запись (MASTERID) переносимого Мастера или Детейла уже будет сущевствовать, то возникнет ошибка одинаковы ключей:
 
 
Напишите, как правильно написать код.
Заранне всем спасибо!

Всего записей: 170 | Зарегистр. 13-11-2005 | Отправлено: 13:19 28-07-2006 | Исправлено: DizeLyaka, 13:25 28-07-2006
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тут вот какое дело, если речь идет не о репликации, то каким образом обеспечивается уникальность в Master-Detail1? Т.е. я о чем, обычно уникальность в IB/FB легко достигается за счет использования генератора в связке с триггером или процедурой(насколько я понимаю ID это integer), поэтому  поясни pls как ID уже может существовать, может надо модель подправить? Если же речь идет о репликации из кучи подчиненных БД(ПБД) в главную(ГБД), то здесь ситуация намного сложнее и решение зависит от конкретной задачи(варианты - разбиение ID на диапазоны, использование составных ключей и т.д.)

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 15:33 28-07-2006
DizeLyaka



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да ID это integer и он создаеться генератором и используеться  в связке с триггером или процедурой.

Всего записей: 170 | Зарегистр. 13-11-2005 | Отправлено: 16:34 28-07-2006
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тогда возникает вопрос если ID формируется генератором, откуда взяться дубликату?
Далее, зачем перемещать данные между таблицами одной базы ну никак не пойму, да и СУБД думаю очень удивится так вот

Цитата:
Напишите, как правильно написать код.

правильно, это когда ПК уникален и никак иначе, все остальное от лукавого.
 
 

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 17:20 28-07-2006
DizeLyaka



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема в том, что генераторы для обоих МАСТЕРОВ  Разные (можно было взять один генератор на двоих, но я хочу сделать нормально)!
 
Я уже нашел правильный путь и сейчас бюсь над правильностью написания запроса!
 
----------------------------------------------------------------------------
После занесения из Мастера1 в Мастер2
 
st:=DataModuleMain.FIBDataSetMaster1.FieldByName('MMMID').AsString;
st1:=DataModuleMain.FIBDataSetMaster2.FieldByName('XXXID').AsString;
 
//---Где st1 значение второго Мастера
//---а,   st значение ключа первого Мастера.
 
//---------Добавление в detail2--------
with DataModuleMain.FIBQuery.SQL do begin
Add ('INSERT INTO DETAIL2 (DATA,NAZVANIE,PRIMECHANIE,XXXID)');
Add ('VALUES(:DATA, :NAZVANIE, RIMECHANIE, '''+st1+''')');
Add ('SELECT DATA,NAZVANIE,PRIMECHANIE, MMMID FROM DETAIL1 WHERE (DETAILID='''+st+''')');
end;
------------------------------------------------------------------------------
 
Но вылазит ошибка:
SQL error code -104"
Token unknow - line 3, char 1
SELECT
 
 
Кто знает ?

Всего записей: 170 | Зарегистр. 13-11-2005 | Отправлено: 18:21 28-07-2006
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DizeLyaka
Цитата:
Но вылазит ошибка:  
SQL error code -104"  
Token unknow - line 3, char 1  
SELECT  
 

1. FIBQuery выполняет только один запрос!!!!
2. Запросы нужно разделять точкой с запятой (;)
 
Ты пытаешся сделать несколько.
Либо организовывай цикл, либо ищи компоненту которая позволяет выполнять скрипт.
Когда-то они были, в данный момент не знаю, давно не интересовался...
 
Обрати внимане что в IBExpert два режима выполнения SQL запросов первый это обычный основанный на TFIBDataSet, второй это скрптовый, который позволяет выполнять весь файл за раз.
Попробуй выполнить свои запросы в Edit вкладке SQL редактора IBExpress, и ты получишь тоже самое сообщение об ошибке.
 
Кроме того обрати внимание на такое свойство ка DataModuleMain.FIBQuery.SQL.TEXT, позволяет заполнить один оператор за раз.

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 18:40 28-07-2006
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я уже нашел правильный путь

Ты уверен? Зона видимости любого селекта определяется параметрами транзакции, в контексте которой он выполняется. И тот же read_committed(а уж тем более snapshot) не гарантирует, что с момента начала  выполнения твоего запроса данные не были изменены и закомичены в другой транзакции с тем же ID, поэтому единственный возможный вариант это попытка добавления записи, с обработкой исключения либо на клиентской части, либо на сервере, в хранимой процедуре. Если же тебе так дорог ID Master1, то заведи в Master2 поле MASTER1_ID и пиши его туда, а ID второго мастера должен формироваться своим генератором и точка. Хотя все равно не пойму зачем одну и ту же сущность гонять между двумя таблицами? Ну ID, а название с примечанием за что???
vserd
Тссс! Только не говори про execute statement FB2.0, а то ж так и не заставим человека модель в порядок привести
 
 
 

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 11:15 31-07-2006 | Исправлено: OXDBA, 11:16 31-07-2006
DizeLyaka



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ! Всем спасибо за участие! Вот, кому надо измененный код:
 
st:=DataModuleMain.FIBDataSetMaster1.FieldByName('MASTER1ID').AsString;
st1:=DataModuleMain.FIBDataSetMaster2.FieldByName('MASTER2ID').AsString;
 
DataModuleOthers.FIBQuery1.SQL.Clear;
DataModuleOthers.FIBQuery2.SQL.Clear;
 
DataModuleOthers.FIBQuery1.SQL.Text:='SELECT DATA, NAZVANIE, MASTER1ID FROM DETAIL1 WHERE (MASTER1ID='''+st+''')';
DataModuleOthers.FIBQuery2.SQL.Text:='INSERT INTO DETAIL2 (DATA,NAZVANIE,MASTER2ID) VALUES (:DATA, :NAZVANIE, :MASTER2ID)';
           DataModuleOthers.FIBQuery1.Transaction.StartTransaction;
           DataModuleOthers.FIBQuery1.ExecQuery;
           if DataModuleOthers.FIBQuery1.RecordCount<>0 then
           begin
             while not DataModuleOthers.FIBQuery1.EOF do
             begin
               DataModuleOthers.FIBQuery2.Transaction.StartTransaction;
               DataModuleOthers.FIBQuery2.Params[0].Value := DataModuleOthers.FIBQuery1.Fields[0].Value;
               DataModuleOthers.FIBQuery2.Params[1].Value := DataModuleOthers.FIBQuery1.Fields[1].Value;
               DataModuleOthers.FIBQuery2.Params[2].AsString := st1;
               DataModuleOthers.FIBQuery2.ExecQuery;
               DataModuleOthers.FIBQuery1.Next;
             end;
             DataModuleOthers.FIBQuery2.Transaction.Commit;
             DataModuleOthers.FIBQuery1.Transaction.Commit;
           end;
           DataModuleOthers.FIBQuery1.Close;
           DataModuleOthers.FIBQuery2.Close;

Всего записей: 170 | Зарегистр. 13-11-2005 | Отправлено: 18:51 02-08-2006
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi - Перенос из Master-Detail1 в Master-Detail2


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru