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

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

Ошибка при перекачке данных [D6, IB6.x]


Mike2 Kouzmine2 ©   (2003-08-13 14:34:00) 

Имеется таблица
/********************************************************************* *********/
/*** Tables ***/
/********************************************************************* *********/

CREATE TABLE REPPART (
SCLAD ID,
GRUP ID,
NNUM ARTIKUL NOT NULL COLLATE PXW_CYRL,
NEW_NNUM ARTIKUL NOT NULL COLLATE PXW_CYRL,
NAME NAME,
CNT NUMBER
);

/********************************************************************* *********/
/*** Primary Keys ***/
/********************************************************************* *********/

ALTER TABLE REPPART ADD CONSTRAINT PK_REPPART PRIMARY KEY (SCLAD, GRUP, NNUM, NEW_NNUM);

/********************************************************************* *********/
/*** Foreign Keys ***/
/********************************************************************* *********/

ALTER TABLE REPPART ADD CONSTRAINT FK_REPPART FOREIGN KEY (GRUP, SCLAD) REFERENCES GRUPS (ID, SCLAD) ON UPDATE CASCADE;

Вставка происходит так

while not rp.Eof do
begin
gr.FindKey([rpSCLAD.Value,rpGROUP.Value]);
try
if IBTransaction1.InTransaction then IBTransaction1.Rollback;
IBTransaction1.StartTransaction;
IBDataSet1.Open;
IBStoredProc1.Params[0].Clear;
IBStoredProc1.Params[1].AsInteger := rpSCLAD.AsInteger;
IBStoredProc1.Params[2].AsString := grNAME.Value;
IBStoredProc1.ExecProc;
IBDataSet1.AppendRecord([rpSCLAD.AsInteger,IBStoredProc1.Params[0].AsI nteger,
rpPartNo.Value,rpNewPartNo.Value,rpNewDescrip.Value,rpNewQuantit.Value ]);
{IBDataSet1SCLAD.Value := rpSCLAD.AsInteger;
IBDataSet1GRUP.Value := IBStoredProc1.Params[0].AsInteger;
IBDataSet1NNUM.Value := rpPartNo.Value;
IBDataSet1NEW_NNUM.Value := rpNewPartNo.Value;
IBDataSet1NAME.Value := rpNewDescrip.Value;
IBDataSet1CNT.Value := rpNewQuantit.Value;
IBDataSet1.Post;}
if IBTransaction1.InTransaction then IBTransaction1.Commit;
rp.Next;
ProgressBar1.Position := rp.RecNo;
Application.ProcessMessages;
except
on E:Exception do
begin
if IBTransaction1.InTransaction then IBTransaction1.Rollback;
memo1.Lines.Add(rpPartNo.Value + " " + rpNewPartNo.Value);
Memo1.Lines.Add(E.Message);
rp.Next;
ProgressBar1.Position := rp.RecNo;
Application.ProcessMessages;
end;
end;
end;

Ошибка - нарушение целостности первичного ключа.
Что приводит к ней: вставка записи где значения полей NNUM и NEW_NNUM разные (они везде разные), но, в итоге, записи вставляются с одинаковыми значениями в вышеназванных полях, но таких нет в источнике.


Mike2 Kouzmine2   (2003-08-13 16:15:00) [1]

Нет. Ошибка ушла когда поле NEW_NNUM переименовал в NNUM1. Видимо в IB комп. или ФБ действительно с NEW ассоциации.


Johnmen   (2003-08-13 16:11:00) [2]

Осталось определиться с

IBDataSet1NNUM.Value := ??? //rpPartNo.Value;
IBDataSet1NEW_NNUM.Value := ??? //rpNewPartNo.Value;


Mike2 Kouzmine2   (2003-08-13 16:08:00) [3]

Клоунов полно.. (Сам такой)


Reindeer Moss Eater   (2003-08-13 15:52:00) [4]

Убери весь код совсем.
Гарантирую - ошибка исчезнет.


Mike2 Kouzmine2   (2003-08-13 15:50:00) [5]

Убрал внешний ключ - ошибка та же.


Mike2 Kouzmine2   (2003-08-13 15:49:00) [6]

Заменил
IBDataSet1.Insert;
IBDataSet1SCLAD.Value := 1;
IBDataSet1GRUP.Value := 1;

IBDataSet1NNUM.Value := rpPartNo.Value;
IBDataSet1NEW_NNUM.Value := rpNewPartNo.Value;
IBDataSet1NAME.Value := rpNewDescrip.Value;
IBDataSet1CNT.Value := rpNewQuantit.Value;
IBDataSet1.Post;

И убрал Find и вызов ХП.
Ошибка таже.
Убрал из первичного ключа NEW_NNUM (вдруг у FB левые ассоциации с NEW), не помогло.


Mike2 Kouzmine2   (2003-08-13 15:41:00) [7]

Хорошо, подождем тм.


Е-Моё имя   (2003-08-13 15:31:00) [8]

Mike2 Kouzmine2 (13.08.03 15:27)
для кайфа.

для kaif"а? ;-))))
у него там приступ паранойи, не надо ему твоих вопросов)))))


Reindeer Moss Eater   (2003-08-13 15:29:00) [9]

Ну так вот, что бы не трепаться, вставь в свой цикл перед каждым инсертом сообщение с результатом FindKey.


Mike2 Kouzmine2   (2003-08-13 15:27:00) [10]

Чтобы снять этот вопрос - подставлялись изначально верные значения в лоб, без поиска, но ошибка была.
Если бы верил в чудеса, то написал бы в потрепаться для кайфа.


Reindeer Moss Eater   (2003-08-13 15:13:00) [11]

проверено в отладке и убрано за ненадобностью
А данные тоже остались отладочные?


Reindeer Moss Eater   (2003-08-13 15:12:00) [12]

Mike2 Kouzmine2
Ты веришь в чудеса?


Mike2 Kouzmine2   (2003-08-13 15:10:00) [13]

Все находит нормально - проверено в отладке и убрано за ненадобностью. Там присутствует только одно сочетание.


Reindeer Moss Eater   (2003-08-13 15:05:00) [14]

If the search is successful, FindKey positions the cursor on the matching record and returns True. Otherwise the cursor is not moved, and FindKey returns False.


Reindeer Moss Eater   (2003-08-13 15:03:00) [15]

gr.FindKey([rpSCLAD.Value,rpGROUP.Value]);

А где проверка, что FindKey был успешен?


Наверх

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