Текущий архив: 2006.03.05;
Скачать: CL | DM;
Вниз
ХЕЛППП!!! BDEError Record/Key Deleted Найти похожие ветки
← →
tytus (2006-01-11 15:32) [0]Господа помогите! Уже который день пытаюсь разобраться -ничего не помогает. В модуле данных - 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...)
← →
Johnmen © (2006-01-11 15:45) [1]>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.
Вобщем, надо подчитать матчасть...:)
← →
tytus (2006-01-11 15:54) [2][1]
Спасибо, но я перепутал - все правильно, у мекня вначале локате, а уже потом Append... Просто инет на другом компе, и по-памяти мог и ошибится...
Дак в чем проблема, если не в этом?
← →
Johnmen © (2006-01-11 15:59) [3]Зачем делать локейт, если сразу потом будет аппенд???
← →
Desdechado © (2006-01-11 16:00) [4]а "по памяти" другие ошибки не закрались?
например, Append и Post в детали не делается (как и в мастере), зато дважды делается неизвестно где
← →
tytus (2006-01-11 16:07) [5][3]
Locate-для главной таблицы. Если запись уже есть, то в главную писать ее не надо, нужно получить ее ID и писать в деталь. (Обрабытываю файл, в нем значения в перемешку, нужно одному значению главной таблицы присвоить 96 записей в детали. Вот для этого и нужен Локейт!)
[4]
Все делается - первый Append Post для главной (MasterTable.Append, MasterTable.Post)-второй для детали. Суть то не в этом...
...Но и за это списибо, хоть кто-то пытается мне помочь!
← →
Johnmen © (2006-01-11 16:14) [6]Есть предположение, что после вставки новой записи в мастера ты неправильно получешь значение ID.
И, естественно, при вставке в деталь этого ID будет вышеуказанная ошибка.
← →
tytus (2006-01-11 16:18) [7][6]
Ан-нет! Делал я локейт после вставки, и ничего не помогает, БОЛЕЕ ТОГО, ругается и без локейта... Но мы забыли ГЛАВНОЕ - КОГДА БД ПУСТАЯ, ТО ВСЕ ЗАНОСИТСЯ ВЕЛЕКОЛЕПНО! и получается, в главной - около 30 записей, а в детали - соотвт. 30*96 и все работает, и со связью...!
← →
Johnmen © (2006-01-11 16:25) [8]Ну я прям не знаю....
Брось ты это БДЕ, как все нормальные люди. Используй компоненты прямого доступа. Напр. стандартные IBX.
← →
evvcom © (2006-01-11 16:30) [9]
> tytus
Ты уж сделай Copy&Paste из кода сюда, тогда будем разговаривать. А то тут читать, тут не читать, тут рыбу заворачивать. По тексту Append и Post в контексте какого класса (объекта) выполняются? В TForm1 их точно нет. И как тебе помочь, если ты сам толком не знаешь, как у тебя в оригинале написано?
← →
tytus (2006-01-11 16:31) [10][8]
Ну незнаю, хочется разобраться с БДЕ...
А что вариантов нету?
Один раз у меня получилось... Я добавил индекс на одно из полей для локейта. И все заработало! Затем я удалил етот индекс - и ВСЕ... все что нажито непосильным трудом...все пропало!
← →
tytus (2006-01-11 16:33) [11][ALL]господа, через пару минут приннесу оригинал модуля... я же с другого компа... please wait for me...
← →
evvcom © (2006-01-11 16:39) [12]
> please wait for me...
hope & wait...
← →
tytus (2006-01-11 16:49) [13][ALL]
procedure TPostProcFm.PopulateTGRPDB(AIndx:integer;ATimeStr:string);
var
s:string;
TempMID:integer;
begin
DM1.DB1.StartTransaction;
with DM1.MainTable do
with TGRP1 do begin
if not Locate("MATS;MDATE;MTGNO",VarArrayOf([MainFm.GlobalAtsName,
MainFm.GlobalDate,TGNO]),[])then begin
Append;
Fields[0].AsInteger:=1;
Fields[1].AsString:=MainFm.GlobalAtsName;
Fields[2].AsString:=MainFm.GlobalDate;
Fields[3].AsString:=TGNO;
Fields[4].AsString:=OpMode_TGRPTYP;
Post;
Locate("MATS;MDATE;MTGNO",VarArrayOf([MainFm.GlobalAtsName,
MainFm.GlobalDate,TGNO]),[]);
TempMID:=Fields[0].AsInteger;
if not TempIniFile.ValueExists(MainFm.GlobalAtsName,TGNO)then
TempIniFile.WriteString(MainFm.GlobalAtsName,TGNO,OpMOde_TGRPTYP);
end else
TempMID:=Fields[0].AsInteger;
end;
with DM1.CountersTable do begin
Append;
Fields[0].AsInteger:=1;
Fields[1].AsInteger:=TempMID;
with TGRP1 do begin
Fields[2].AsString:=ATimeStr;
Fields[3].AsInteger:=CC_I;
Fields[4].AsInteger:=TV_I;
Fields[5].AsInteger:=CCS_WITH_ANSWER_I;
Fields[6].AsInteger:=TV_ANSWER_I;
Fields[7].AsInteger:=CC_O;
Fields[8].AsInteger:=TV_O;
Fields[9].AsInteger:=CCS_WITH_ANSWER_O;
Fields[10].AsInteger:=TV_ANSWER_O;
end;
with TGRP2 do begin
Fields[11].AsInteger:=CONN_LINES;
Fields[12].AsInteger:=NO_OF_BLO_LINES;
Fields[13].AsInteger:=SEMI_BLOCK_LINES;
Fields[14].AsInteger:=TRANS_BLOCK_LINES;
Fields[15].AsInteger:=TV_SEMI_BLOLI;
Fields[16].AsInteger:=TV_TRANS_BLOLI;
Fields[17].AsInteger:=TGRP_BLO_TIME;
Fields[18].AsInteger:=ATB_TIME;
Fields[19].AsInteger:=NUMBER_OF_ATB;
end;
with TGRP3 do begin
Fields[20].AsInteger:=CCS_CONGESTION;
Fields[21].AsInteger:=CCS_INCMP_DIAL;
Fields[22].AsInteger:=CCS_LINK_FAILURE;
Fields[23].AsInteger:=CCS_UNALL_NUM;
Fields[24].AsInteger:=CCS_RELORIG_ENDTOEND;
Fields[25].AsInteger:=CCS_SUB_BUSY;
Fields[26].AsInteger:=CCS_INT_TECHN_IRREG;
Fields[27].AsInteger:=CCS_EXT_TECHN_IRREG;
Fields[28].AsInteger:=CCS_UNANSWERED;
end;
with TGRP4 do begin
Fields[29].AsInteger:=CCU_SUM_OFL_LOSS;
Fields[30].AsInteger:=CCU_LOST_CALLS;
Fields[31].AsInteger:=CCU_NM_TGRP_BLOCKING;
Fields[32].AsInteger:=CCU_TECHN_IRREGULAR;
Fields[33].AsInteger:=CCU_TGRP_BLOCKED;
Fields[34].AsInteger:=CCU_TRUNKRESERVATION;
Fields[35].AsInteger:=CCU_ALL_TRUNKS_BUSY;
end;
with TGRP5 do begin
Fields[36].AsInteger:=NUMB_CCS7_DPC_OLOAD;
Fields[37].AsInteger:=CCS7_DPC_OLOAD;
Fields[38].AsInteger:=CCS_CCS7_CALL_FAIL;
Fields[39].AsInteger:=CCU_CCS7_CCNC_OLOAD;
Fields[40].AsInteger:=CCU_CCS7_DPC_OLOAD;
Fields[41].AsInteger:=CCU_CCS7_DPC_ALL_ACC;
end;
with TGRP6 do begin
Fields[42].AsInteger:=CC_NH_DIRECT_O;
Fields[43].AsInteger:=TV_NH_DIRECT_O;
Fields[44].AsInteger:=CCS_NH_DIRECT_ANSW_O;
Fields[45].AsInteger:=CCU_NH_DIRECT_OFL;
Fields[46].AsInteger:=CC_NH_ALT1_O;
Fields[47].AsInteger:=TV_NH_ALT1_O;
Fields[48].AsInteger:=CCS_NH_ALT1_ANSW_O;
Fields[49].AsInteger:=CC_NH_ALT1_REROUTING;
Fields[50].AsInteger:=CCU_NH_ALT1_LOST;
end;
with TGRP7 do begin
Fields[51].AsInteger:=CC_NH_ALT2_O;
Fields[52].AsInteger:=TV_NH_ALT2_O;
Fields[53].AsInteger:=CCS_NH_ALT2_ANSW_O;
Fields[54].AsInteger:=CCU_NH_ALT2;
end;
with TGRP8 do begin
Fields[55].AsInteger:=CC_PRECEDENCE_I;
Fields[56].AsInteger:=CC_PRECEDENCE_O;
Fields[57].AsInteger:=CC_PREEMPTED_I;
Fields[58].AsInteger:=CC_PREEMPTED_O;
end;
Post;
end;//with DM1.CountersTable
DM1.DB1.Commit;
end;
← →
evvcom © (2006-01-11 16:56) [14]Да...а... Извращенец и только.
Ну и что отладчик показывает после присвоения TempMID := ... ?
← →
tytus (2006-01-11 16:59) [15][14]
... да.. не смотрел, хотя делал брекпоинт после него - и работает, ошибка вылетает после POST в детали. Да и бегать с 3-го на 4-ый этаж за инетом - дело тяжелое... Если проблема только в этом - то посоветуйте как правильно все сделать.
← →
tytus (2006-01-11 17:02) [16][14]
Извращенец...
...ты не видел ВЕСЬ модуль!!!(как в анекдоте - если-бы ОНО еще и работало - ему бы цены небыло)
← →
evvcom © (2006-01-11 17:09) [17]
> ... да.. не смотрел
а надо посмотреть, и посмотреть, а появилась ли такая запись с только что вставленными параметрами в таблице. Для этого должно выполниться DM1.DB1.Commit; значит ругающийся Post надо закомментарить (на время теста).
← →
mr.il © (2006-01-11 17:30) [18]Может я ослеп, но не увидел, где присваевается значение первичного ключа (его-же уникального) второй таблицы? Особо беспокоит меня вот это
with DM1.MainTable do
with TGRP1 do begin
if not Locate("MATS;MDATE;MTGNO",VarArrayOf([MainFm.GlobalAtsName,
MainFm.GlobalDate,TGNO]),[])then begin
Append;
Fields[0].AsInteger:=1;
Fields[1].AsString:=MainFm.GlobalAtsName;
Fields[2].AsString:=MainFm.GlobalDate;
Fields[3].AsString:=TGNO;
Fields[4].AsString:=OpMode_TGRPTYP;
Post;
Locate("MATS;MDATE;MTGNO",VarArrayOf([MainFm.GlobalAtsName,
MainFm.GlobalDate,TGNO]),[]);
TempMID:=Fields[0].AsInteger;
if not TempIniFile.ValueExists(MainFm.GlobalAtsName,TGNO)then
TempIniFile.WriteString(MainFm.GlobalAtsName,TGNO,OpMOde_TGRPTYP);
end else
TempMID:=Fields[0].AsInteger;
end;
В рез.выполнения этого кода TempMID всегда = 1. Это правильно?
← →
mr.il © (2006-01-11 17:38) [19]И еще, в целом корректнее писать так:
if Locate("MATS;MDATE;MTGNO",VarArrayOf([MainFm.GlobalAtsName,
MainFm.GlobalDate,TGNO]),[])then
TempMID:=Fields[0].AsInteger
else begin
Append;
Fields[0].AsInteger:=1;
Fields[1].AsString:=MainFm.GlobalAtsName;
Fields[2].AsString:=MainFm.GlobalDate;
Fields[3].AsString:=TGNO;
Fields[4].AsString:=OpMode_TGRPTYP;
Post;
Locate("MATS;MDATE;MTGNO",VarArrayOf([MainFm.GlobalAtsName,
MainFm.GlobalDate,TGNO]),[]);
TempMID:=Fields[0].AsInteger;
if not TempIniFile.ValueExists(MainFm.GlobalAtsName,TGNO)then
TempIniFile.WriteString(MainFm.GlobalAtsName,TGNO,OpMOde_TGRPTYP);
end;
И ваще зачем такие сложности, писать в стиле локальной БД для К-С.
← →
tytus (2006-01-12 13:06) [20][ALL]
Спасибо господа за внимание. Решил проблему с главной таблицей. Теперь как мне все-таки получить значение первичного ключа главной для детали (TemoMID)? Вот что получилось:
procedure TPostProcFm.PopulateTGRPDB(AIndx:integer;ATimeStr:string);
var
s:string;
TempMID:integer;
begin
DM1.DB1.StartTransaction;
with DM1.MainTable do
with TGRP1 do begin
if not Locate("MATS;MDATE;MTGNO",VarArrayOf([MainFm.GlobalAtsName,
MainFm.GlobalDate,TGNO]),[])then
begin
DM1.DB1.Execute("INSERT INTO MAINTGRP(MATS,MDATE,MTGNO,MOPMODE)"+
" VALUES(""+MainFm.GlobalAtsName+"",""+MainFm.GlobalDate+
"",""+TGNO+"",""+OpMode_TGRPTYP+"")");
end else
TempMID:=Fields[0].AsInteger;
DM1.DB1.Commit;
end;
DM1.DB1.StartTransaction;
with DM1.CountersTable do begin
Append;
Fields[0].AsInteger:=1;
Fields[1].AsInteger:=TempMID;
with TGRP1 do begin
Fields[2].AsString:=ATimeStr;
Fields[3].AsInteger:=CC_I;
Fields[4].AsInteger:=TV_I;
Fields[5].AsInteger:=CCS_WITH_ANSWER_I;
Fields[6].AsInteger:=TV_ANSWER_I;
Fields[7].AsInteger:=CC_O;
Fields[8].AsInteger:=TV_O;
Fields[9].AsInteger:=CCS_WITH_ANSWER_O;
Fields[10].AsInteger:=TV_ANSWER_O;
end;
with TGRP2 do begin
Fields[11].AsInteger:=CONN_LINES;
Fields[12].AsInteger:=NO_OF_BLO_LINES;
Fields[13].AsInteger:=SEMI_BLOCK_LINES;
Fields[14].AsInteger:=TRANS_BLOCK_LINES;
Fields[15].AsInteger:=TV_SEMI_BLOLI;
Fields[16].AsInteger:=TV_TRANS_BLOLI;
Fields[17].AsInteger:=TGRP_BLO_TIME;
Fields[18].AsInteger:=ATB_TIME;
Fields[19].AsInteger:=NUMBER_OF_ATB;
end;
with TGRP3 do begin
Fields[20].AsInteger:=CCS_CONGESTION;
Fields[21].AsInteger:=CCS_INCMP_DIAL;
Fields[22].AsInteger:=CCS_LINK_FAILURE;
Fields[23].AsInteger:=CCS_UNALL_NUM;
Fields[24].AsInteger:=CCS_RELORIG_ENDTOEND;
Fields[25].AsInteger:=CCS_SUB_BUSY;
Fields[26].AsInteger:=CCS_INT_TECHN_IRREG;
Fields[27].AsInteger:=CCS_EXT_TECHN_IRREG;
Fields[28].AsInteger:=CCS_UNANSWERED;
end;
with TGRP4 do begin
Fields[29].AsInteger:=CCU_SUM_OFL_LOSS;
Fields[30].AsInteger:=CCU_LOST_CALLS;
Fields[31].AsInteger:=CCU_NM_TGRP_BLOCKING;
Fields[32].AsInteger:=CCU_TECHN_IRREGULAR;
Fields[33].AsInteger:=CCU_TGRP_BLOCKED;
Fields[34].AsInteger:=CCU_TRUNKRESERVATION;
Fields[35].AsInteger:=CCU_ALL_TRUNKS_BUSY;
end;
with TGRP5 do begin
Fields[36].AsInteger:=NUMB_CCS7_DPC_OLOAD;
Fields[37].AsInteger:=CCS7_DPC_OLOAD;
Fields[38].AsInteger:=CCS_CCS7_CALL_FAIL;
Fields[39].AsInteger:=CCU_CCS7_CCNC_OLOAD;
Fields[40].AsInteger:=CCU_CCS7_DPC_OLOAD;
Fields[41].AsInteger:=CCU_CCS7_DPC_ALL_ACC;
end;
with TGRP6 do begin
Fields[42].AsInteger:=CC_NH_DIRECT_O;
Fields[43].AsInteger:=TV_NH_DIRECT_O;
Fields[44].AsInteger:=CCS_NH_DIRECT_ANSW_O;
Fields[45].AsInteger:=CCU_NH_DIRECT_OFL;
Fields[46].AsInteger:=CC_NH_ALT1_O;
Fields[47].AsInteger:=TV_NH_ALT1_O;
Fields[48].AsInteger:=CCS_NH_ALT1_ANSW_O;
Fields[49].AsInteger:=CC_NH_ALT1_REROUTING;
Fields[50].AsInteger:=CCU_NH_ALT1_LOST;
end;
with TGRP7 do begin
Fields[51].AsInteger:=CC_NH_ALT2_O;
Fields[52].AsInteger:=TV_NH_ALT2_O;
Fields[53].AsInteger:=CCS_NH_ALT2_ANSW_O;
Fields[54].AsInteger:=CCU_NH_ALT2;
end;
with TGRP8 do begin
Fields[55].AsInteger:=CC_PRECEDENCE_I;
Fields[56].AsInteger:=CC_PRECEDENCE_O;
Fields[57].AsInteger:=CC_PREEMPTED_I;
Fields[58].AsInteger:=CC_PREEMPTED_O;
end;
Post;
end;//with DM1.CountersTable
DM1.DB1.Commit;
end;
← →
mr.il © (2006-01-12 13:21) [21]А где у тебя идет заполнение первичного ключа? Если в триггере то перепиши триггер на ХП отправляй туда значения для всех полей генери там значение первичного ключа вызывай ее из проги и возвращай значение первичного ключа.
← →
tytus (2006-01-12 13:30) [22][21]
Нутром чуял что так и нужно было...
Как я понял, ты предлагаешь сделать ХП для детали, в ней тригер BEFORE INSERT, и забрать с нее (с ХП) значение первичного ключа для детали.
Только поля какой таблицы отправлять на ХП нужно, и зачем? Да и нужно мне не значение первичного ключа для детали, а значение ПОЛЯ В ДЕТАЛИ, value которого равно значению перв.ключа ГЛАВНОЙ.
← →
mr.il © (2006-01-12 13:35) [23]Ежли у тебя есть электронка то давай напишу подробно с примером.
← →
tytus (2006-01-12 13:50) [24][23]
tytus@ukr.net
wait for mail...
← →
Виталий Панасенко (2006-01-12 14:59) [25]Если есть DBGrid связанный с укзанными НД, И ПОЛЯ В СЕТКЕ МЕНЯЛИСЬ МЕСТАМИ, ТО М.Б.(В Д5 точно), что присвоение Fields[0].AsInteger присваивает значение НЕ ПЕРВОМУ ПОЛЮ В ПОДЧИНЕННОЙ ТАБЛИЦЕ !
Попробуй в сетке показать все поля, затем перетащить какое-то поле на место другого (жедательно разного типа) и проделать то, что делаешь ты.. Или ApeendRecord() с параметрами, указав в сроке параметров значения в том порядке, в котором поля следуют ФИЗИЧЕСКИ в таблице.
← →
Johnmen © (2006-01-12 15:07) [26]>Виталий Панасенко (12.01.06 14:59) [25]
Не-а. Порядок следования полей в гриде никак не связан с порядком полей в НД.
← →
Виталий Панасенко (2006-01-12 15:32) [27]Да вот как раз и влияет. Только что проверил..На Paradox правда, но ...
4 поля: AutoInc(Key), Integer, Date, AlphaNumeric
и делаю вот это
procedure TForm1.Button1Click(Sender: TObject);
begin
Tbl.Append;
Tbl.Fields[1].AsInteger := 1;
Tbl.Fields[2].AsDateTime := Date;
Tbl.Fields[3].AsString := "Test";
Tbl.Post;
end;
В сетке поменял 3-4 поля . Имею "Test" is not a valid date
← →
Johnmen © (2006-01-12 16:06) [28]Хочется тебе верить, но увы... Не верю (с)
:)
← →
Виталий Панасенко (2006-01-12 17:15) [29]
> Johnmen © (12.01.06 16:06) [28]
> Хочется тебе верить, но увы... Не верю (с)
> :)
Ты, случаем, не хохол ? А то у нас натура такая - "хохол не повире, докы не перевире"..:-)))
Страницы: 1 вся ветка
Текущий архив: 2006.03.05;
Скачать: CL | DM;
Память: 0.55 MB
Время: 0.01 c