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

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

Delphi + Access [D7, Access]


Страницы:   1 2

Jet ©   (2005-10-31 10:43:00) 

Приветствую!
Ситуация: нужно скопировать данные из одной базы в другую, имеющую такую же структуру. В базе достаточно много таблиц.
К примеру: копирую таблицу 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.
--
Подскажите пожалуйста как избавиться от данной ошибки?


Jet   (2005-11-02 19:15:00) [1]

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


Jet   (2005-11-01 18:25:00) [2]

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


msguns   (2005-11-01 18:15:00) [3]

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


sniknik   (2005-11-01 16:14:00) [4]

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

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


Jet   (2005-11-01 15:28:00) [5]

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


sniknik   (2005-11-01 14:13:00) [6]

ошибки по коду...
вот так
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 12:50:00) [7]

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

// заполнение таблицы 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 12:26:00) [8]

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] ничего это не изменит.


msguns   (2005-11-01 10:07:00) [9]

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


Anatoly Podgoretsky   (2005-11-01 09:56:00) [10]

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


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

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


Jet   (2005-10-31 23:23:00) [12]

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


sniknik   (2005-10-31 20:55:00) [13]

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

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

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


Jet   (2005-10-31 19:28:00) [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’”
--
Подскажите как избавиться от нее?


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


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

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


Anatoly Podgoretsky   (2005-10-31 15:21:00) [16]

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


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

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


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

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


msguns   (2005-10-31 14:59:00) [19]

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

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


Anatoly Podgoretsky   (2005-10-31 14:16:00) [20]

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


Страницы:   1 2

Наверх

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