![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при перекачке данных [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 был успешен?