![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ХЕЛППП!!! BDEError Record/Key Deleted [D7, IB6.x]
tytus © (2006-01-11 15:32:00)Господа помогите! Уже который день пытаюсь разобраться -ничего не помогает. В модуле данных - DataBase, два TTable мастер-деталь. В БД по одному первичному ключу на таблицу, плюс Reference Constraint в детальной - связывает поле с первичным ключем главной таблицы(ID) и не индексным в детали. Записываю данные так:
Append;
if not MasterTable.Locate('Field1;Field2;Field3',VarArrayOf([Data1,Data2,Data3]),[]) then begin//- работает 100%
MasterTable.Fields[0].AsInteger:=1;//если этого не делать, то будет ругаться Fields(ID) must have value (должно быть значение, всеравно потом генератором затрется)
MasterTable.Fields[n].AsInteger:=...;
Post;
TempID:=MasterTable.Fields[0].AsInteger;
end else
TempID:=MasterTable.Fields[0].AsInteger;
...
Append;
DetailTable.Fields[0].AsInteger:=1;
DetailTable.Fields[1].AsInteger:=TempID;//-для связи главн.-дет.
DetailTable.Fields[n].AsInteger:=...;
Post;
Ключевые поля Fields[0] записываются тригерами BEFORE INSERT.
Когда БД пустая, то все работает. Если попытаться вносить данные снова, то ругается Record/Key deleted (я так подозреваю, что не может выполнить Locate...)
evvcom (2006-01-11 16:30:00) [21]
> tytus
Ты уж сделай Copy&Paste из кода сюда, тогда будем разговаривать. А то тут читать, тут не читать, тут рыбу заворачивать. По тексту Append и Post в контексте какого класса (объекта) выполняются? В TForm1 их точно нет. И как тебе помочь, если ты сам толком не знаешь, как у тебя в оригинале написано?
Johnmen (2006-01-11 16:25:00) [22]Ну я прям не знаю....
Брось ты это БДЕ, как все нормальные люди. Используй компоненты прямого доступа. Напр. стандартные IBX.
tytus (2006-01-11 16:18:00) [23][6]
Ан-нет! Делал я локейт после вставки, и ничего не помогает, БОЛЕЕ ТОГО, ругается и без локейта... Но мы забыли ГЛАВНОЕ - КОГДА БД ПУСТАЯ, ТО ВСЕ ЗАНОСИТСЯ ВЕЛЕКОЛЕПНО! и получается, в главной - около 30 записей, а в детали - соотвт. 30*96 и все работает, и со связью...!
Johnmen (2006-01-11 16:14:00) [24]Есть предположение, что после вставки новой записи в мастера ты неправильно получешь значение ID.
И, естественно, при вставке в деталь этого ID будет вышеуказанная ошибка.
tytus (2006-01-11 16:07:00) [25][3]
Locate-для главной таблицы. Если запись уже есть, то в главную писать ее не надо, нужно получить ее ID и писать в деталь. (Обрабытываю файл, в нем значения в перемешку, нужно одному значению главной таблицы присвоить 96 записей в детали. Вот для этого и нужен Локейт!)
[4]
Все делается - первый Append Post для главной (MasterTable.Append, MasterTable.Post)-второй для детали. Суть то не в этом...
...Но и за это списибо, хоть кто-то пытается мне помочь!
Desdechado (2006-01-11 16:00:00) [26]а "по памяти" другие ошибки не закрались?
например, Append и Post в детали не делается (как и в мастере), зато дважды делается неизвестно где
Johnmen (2006-01-11 15:59:00) [27]Зачем делать локейт, если сразу потом будет аппенд???
tytus (2006-01-11 15:54:00) [28][1]
Спасибо, но я перепутал - все правильно, у мекня вначале локате, а уже потом Append... Просто инет на другом компе, и по-памяти мог и ошибится...
Дак в чем проблема, если не в этом?
Johnmen (2006-01-11 15:45:00) [29]>Append;
>if not MasterTable.Locate('Field1;Field2;Field3',VarArrayOf([Data1,Data2,Data3]),[]) then begin//- работает 100%
>MasterTable.Fields[0].AsInteger:=1;//если этого не делать, то будет ругаться Fields(ID) must have value (должно быть значение, всеравно потом генератором затрется)
>MasterTable.Fields[n].AsInteger:=...;
Вот что странно, сначала переводишь НД в режим dsInsert, а потом ищешь!!!!
А поиск, он сбрасывает режим в dsBrowse, выполняя неявный Post.
Вобщем, надо подчитать матчасть...:)