Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

Delphi + Access   Найти похожие ветки 

 
Jet ©   (2005-10-31 10:43) [0]

Приветствую!
Ситуация: нужно скопировать данные из одной базы в другую, имеющую такую же структуру. В базе достаточно много таблиц.
К примеру: копирую таблицу PPERSON из одной базы в другую. Ключ по ID. Никаких проблем. Затем начинаю копировать данные (на любого человека из таблицы PPERSON) из таблицы ADDRESS (ключевое поле ID), в которой есть привязка к таблице PPERSON через поле PPERSON_ID, которое не является обязательным полем. Во время копирования возникает следующая ошибка:
“Key violation
[Microsoft][ODBC Microsoft Access Driver] You cannot add or change a record because a related record is required in table
General SQL error.
‘PPERSON’”
Эта ошибка, в данном случае, возникает именно при копировании поля PPERSON_ID.
--
Подскажите пожалуйста как избавиться от данной ошибки?


 
msguns ©   (2005-10-31 11:26) [1]

Таблица PPERSON в новой БД полностью агналогична оригиналу, в т.ч. ID ?


 
Desdechado ©   (2005-10-31 11:26) [2]

на 2 поста ниже слабО глянуть?
http://delphimaster.net/view/3-1130594032/

Key violation - это у тебя ключи и FK сбились, видимо, автоинкремент не отключил при переливе и стартовые значения полей с автоинкрементом неодинаковые


 
Jet ©   (2005-10-31 12:09) [3]

Структура PPERSON полностью аналогичная


 
Jet ©   (2005-10-31 12:10) [4]

Desdechado, мне не нужно копировать все данные. Необходимые данные я сам выбираю.


 
sniknik ©   (2005-10-31 12:19) [5]

> Необходимые данные я сам выбираю.
ну так. выбирай.
WHERE ... условие необходимости ...


 
Jet ©   (2005-10-31 13:54) [6]

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


 
Jet ©   (2005-10-31 14:04) [7]

Попытаюсь еще раз поподробней объяснить проблему. Есть база со множеством таблиц.
--
Таблица PPERSON: ID, INN, FAMILY, NAME, OTCHESTVO, BIRTHDAY
Таблица ADDRESS: ID, PPERSON_ID, TYPE_ADDR, COUNTRY, TOWN
...
--
Эти две таблицы связаны между собой через ID из PPERSON и PPERSON_ID из ADDRESS. Мне нужно скопировать данные из одной базы в другую, причем ID из PPERSON автоинкремент, а PPERSON_ID из ADDRESS не автоинкремент.
Я выбираю данные на человека из PPERSON и заношу их в таблицу PPERSON в другой базе, с этим проблем нет. Затем я выбираю данные из таблицы ADDRESS по PPERSON_ID и пытаюсь их занести в таблицу ADDRESS другой базы, на что возникает ошибка
--
“Key violation
[Microsoft][ODBC Microsoft Access Driver] You cannot add or change a record because a related record is required in table
General SQL error.
‘PPERSON’”
--
Подскажите как избавиться от нее?


 
Anatoly Podgoretsky ©   (2005-10-31 14:16) [8]

PPersonID должен уже существовать в PPERSON, у тебя его нет


 
msguns ©   (2005-10-31 14:59) [9]

>Jet ©   (31.10.05 12:09) [3]
>Структура PPERSON полностью аналогичная

В [1] вопрос был об аналогичности данных, а не структур (это и так ясно)


 
Jet ©   (2005-10-31 15:00) [10]

ID из PPERSON и PPERSON_ID из ADRRESS - одно и тоже
--
Данные аналогичные


 
Anatoly Podgoretsky ©   (2005-10-31 15:17) [11]

Jet ©   (31.10.05 15:00) [10]
Есть большое подозрение, что это не так, особенно учитывая что ты не хочешь указывать структуру таблиц, связей и ограничений.


 
Anatoly Podgoretsky ©   (2005-10-31 15:21) [12]

Чувствую пора в Начинающие.


 
Jet ©   (2005-10-31 15:53) [13]


> Есть большое подозрение, что это не так, особенно учитывая
> что ты не хочешь указывать структуру таблиц, связей и ограничений.
>

В чем именно подозрения? Я не совсем понял.
Связь двух таблиц описана.


 
Jet ©   (2005-10-31 19:28) [14]

Попытаюсь еще раз поподробней объяснить проблему. Есть база со множеством таблиц.
--
Таблица PPERSON: ID, INN, FAMILY, NAME, OTCHESTVO, BIRTHDAY
Таблица ADDRESS: ID, PPERSON_ID, TYPE_ADDR, COUNTRY, TOWN
...
--
Эти две таблицы связаны между собой через ID из PPERSON и PPERSON_ID из ADDRESS. Мне нужно скопировать данные из одной базы в другую, причем ID из PPERSON автоинкремент, а PPERSON_ID из ADDRESS не автоинкремент.
Я выбираю данные на человека из PPERSON и заношу их в таблицу PPERSON в другой базе, с этим проблем нет. Затем я выбираю данные из таблицы ADDRESS по PPERSON_ID и пытаюсь их занести в таблицу ADDRESS другой базы, на что возникает ошибка
--
“Key violation
[Microsoft][ODBC Microsoft Access Driver] You cannot add or change a record because a related record is required in table
General SQL error.
‘PPERSON’”
--
Подскажите как избавиться от нее?


 
sniknik ©   (2005-10-31 20:55) [15]

> Попытаюсь еще раз поподробней объяснить проблему.
чем подробность в [7] отличается от в [14]?

скажи лучше, если запросом из ссылки в [2] копировать. всю таблицу(две по очереди) и в пустую базу, тогда ошибка возникает?

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


 
Jet ©   (2005-10-31 23:23) [16]

Мне нужно копировать не всю базу, а лишь некоторые записи.
Вылетает на копировании поля PPERSON_ID


 
Jet ©   (2005-11-01 09:20) [17]

Кто-нибудь подскажет?


 
Anatoly Podgoretsky ©   (2005-11-01 09:56) [18]

Пока не приведешь всю информацию, никто не подсжет. По приведеной информации ошибка в принципе возникнуть не может.


 
msguns ©   (2005-11-01 10:07) [19]

Каким способом выполняется "копирование" (Запрос, Скрипт, что-то еще) ?


 
sniknik ©   (2005-11-01 12:26) [20]

Jet ©   (31.10.05 23:23) [16]
> Мне нужно копировать не всю базу, а лишь некоторые записи.
тебя не просят копировать все у себя в программе, тебя просят проверить копируется ли все этим способом. и не просто так просят, это даст дополнительную инфу по проблемме...

пока что ее мало. фактически ты ни на байт инфы больше чем [0] не дал, и только повторяеш тоже самое (даже не трудясь написать другими словами (обьяснить если так не понимают), а просто копируя...).

вот это
sniknik ©   (31.10.05 20:55) [15]
> и как сам копируеш, и на какой строке кода ошибка "возникает". тоже хотелось бы знать.
тоже необходимая инфа для определения проблеммы.

Jet ©   (01.11.05 09:20) [17]
> Кто-нибудь подскажет?
возможно. но врядли. в принципе догадатся что у тебя там происходит можно, даже не сложно. но вот пытатся дать диагноз по догадкам... ну это занятие для мазохистов, т.к. любое предположение должно будет начинатся словами "возможно" должно подкреплятся обьяснением почему решил, что у тебя это соответствует догадке, и причин устраняющих возможную ошибку в возможной причене... а так как этих возможностей всегда бывает не одна... то это уже небольшой трактат получается, брошура для тебя с названием "как устранить вот эту ошибку...".
не стоит это усилий. имхо.
а если всетаки хочеш решить проблему то или сам пытайся(у петя вся инфа по проблеме полная), или см.
Anatoly Podgoretsky ©   (01.11.05 09:56) [18]
причем прочитать мало, надо еще и сделать выводы, и начать отвечать адекватно на дополнения, а пока не сделал... да хоть сто раз скопируй [7]/[14] ничего это не изменит.


 
Jet ©   (2005-11-01 12:50) [21]

Привожу кусок кода:
--

// заполнение таблицы PPERSON

DMB.Table1.Open;
DMB.Table1.Insert;

DMB.Table1FAMILY.Value := DMB.Query1FAMILY.AsString;
DMB.Table1NAME.Value := DMB.Query1NAME.AsString;
DMB.Table1OTCHESTVO.Value := DMB.Query1OTCHESTVO.AsString;
DMB.Table1SEX_CODE.Value := DMB.Query1SEX_CODE.AsInteger;
DMB.Table1BIRTHDAY.Value := DMB.Query1BIRTHDAY.AsDateTime;
DMB.Table1TYPEDOC_CODE.Value := DMB.Query1TYPEDOC_CODE.AsInteger;
DMB.Table1PASSPORT_SER.Value := DMB.Query1PASSPORT_SER.AsString;
DMB.Table1PASSPORT_NUM.Value := DMB.Query1PASSPORT_NUM.AsString;
DMB.Table1PASSPORT_DATE.Value := DMB.Query1PASSPORT_DATE.AsDateTime;
DMB.Table1PASSPORT_OVD.Value := DMB.Query1PASSPORT_OVD.AsString;

DMB.Table1.Post;
DMB.Table1.Close;

DMB.Table1.Open;
DMB.Table1.Last;
LPPID := DMB.Table1ID.AsInteger; // Last Person_ID

// заполнение таблицы ADDRESS

T1PPERSON_ID := DMB.Query1ID.AsInteger;

//// ZIT

DMB.Query2.SQL[1] := "where PPERSON_ID = " + IntToStr(T1PPERSON_ID) + " and TYPE_ADDR= " + quotedstr("ZIT");
DMB.Query2.Open; // Выбор адреса для человека по ID

DMB.Table2.Open;
DMB.Table2.Insert;

DMB.Table2PPERSON_ID.AsInteger := LPPID + 1; // !!!! При копировании этой строки происходит ошибка !!!
DMB.Table2TYPE_ADDR.AsString := DMB.Query2TYPE_ADDR.AsString;
DMB.Table2COUNTRY_CODE.AsInteger := DMB.Query2COUNTRY_CODE.AsInteger;
DMB.Table2REGION_CODE.AsInteger := DMB.Query2REGION_CODE.AsInteger;
DMB.Table2REGION_DEPT.AsString := DMB.Query2REGION_DEPT.AsString;
DMB.Table2TOWN.AsString := DMB.Query2TOWN.AsString;
DMB.Table2STREET.AsString := DMB.Query2STREET.AsString;
DMB.Table2HOUSE.AsString := DMB.Query2HOUSE.AsString;
DMB.Table2CORPUS.AsString := DMB.Query2CORPUS.AsString;
DMB.Table2ROOM.AsString := DMB.Query2ROOM.AsString;
DMB.Table2POLICE.AsString := DMB.Query2POLICE.AsString;

DMB.Table2.Post;
DMB.Table2.Close;

DMB.Query2.Close;

--


 
sniknik ©   (2005-11-01 14:13) [22]

ошибки по коду...
вот так
DMB.Table1.Last;
LPPID := DMB.Table1ID.AsInteger; // Last Person_ID
значение автоинкремента не получают... т.к. .... а .... а надоело обьяснять... не получают и все.
но даже допустим получил верное значение, дальше
DMB.Table2PPERSON_ID.AsInteger := LPPID + 1; ??? сам говорил между таблицами связь по этому полю, т.е. внешний ключь. а ты получил ключевое значение 5 к примеру а в ссылку на него пишеш 6, и думаеш найдет?

и в общем по коду (наверное правильно не хотел показывать ;о))) - т.к. убожество. для того чтобы положить одну только запись 2 раза переоткрываются полностью 2 таблицы (что сравнимо с переписыванием таблиц 2 раза по полной тем запросом). и плюс еще привлечены еще 2 дополнительных запроса. (еще время)
пока что тебя спасает то, что таблици еще очень маленькие... вот станут по паре лимонов записей... ;)

p.s.
>sniknik ©   (31.10.05 12:19) [5]
>> Необходимые данные я сам выбираю.
> ну так. выбирай.
> WHERE ... условие необходимости ...
сделай так, будет в сотни раз лучше.


 
Jet ©   (2005-11-01 15:28) [23]

sniknik, вроде разобрался. Завтра проверю, отпишусь.
--
where - не прокатит, пользователь визуально выбирает данные.


 
sniknik ©   (2005-11-01 16:14) [24]

> where - не прокатит, пользователь визуально выбирает данные.
ну и что? ну выбрал, ну составь список выбранного с ID (ключь вроде) а после составляй условие where по нему. будет быстрее раз в тыцщу если не в мульен. ;)
(зависит от размера таблици конечно, и д.р., так просто не сосчитаеш во сколько)

потом (не знаю достоинством этобудет или недостатком... зависит от задачи) если ничего не менять в запросе то там ID - автоинкремент, будет такой же как в таблице "предке", а не перерасчитанный. т.е. если данные в эту таблицу добавляются только переносом (нет своего добавления) то это явное преимущество (легко и гарантированно можно найти оригинал по ключевому полю), если же вносятся и самостоятельно (ID могут "пересечся") то все одно вместо переоткрытий таблиц надо переделывать на запросы, в пару запросов на пару таблиц (пусть в цикле) легко можно уложится.


 
msguns ©   (2005-11-01 18:15) [25]

Так и знал. Счетчик разруливается не ручками ;)


 
Jet ©   (2005-11-01 18:25) [26]

sniknik, да тут скорость не важна, таблица не будет большой. Оптимизация по времени не нужна.


 
Jet ©   (2005-11-02 19:15) [27]

Всем спасибо, ошибку нашел, все работает.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.046 c
2-1131164479
zaN0za
2005-11-05 07:21
2005.11.20
Вопрос по RasAPI


6-1123645641
Big Joe
2005-08-10 07:47
2005.11.20
Помогите с сокетом


2-1131018738
Woolen
2005-11-03 14:52
2005.11.20
Непонятное поведение строк


1-1130312278
sergg
2005-10-26 11:37
2005.11.20
Измение размера двумерного VarArray


4-1127037100
Илья Бобров
2005-09-18 13:51
2005.11.20
Как програмно узнать местоположение папки ProgramFiles





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский