![]() |
| ||
|
|
Новости |
Поиск |
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...)
Виталий Панасенко (2006-01-12 17:15:00) [1]
> Johnmen © (12.01.06 16:06) [28]
> Хочется тебе верить, но увы... Не верю (с)
> :)
Ты, случаем, не хохол ? А то у нас натура такая - "хохол не повире, докы не перевире"..:-)))
Johnmen (2006-01-12 16:06:00) [2]Хочется тебе верить, но увы... Не верю (с)
:)
Виталий Панасенко (2006-01-12 15:32:00) [3]Да вот как раз и влияет. Только что проверил..На 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 15:07:00) [4]>Виталий Панасенко (12.01.06 14:59) [25]
Не-а. Порядок следования полей в гриде никак не связан с порядком полей в НД.
Виталий Панасенко (2006-01-12 14:59:00) [5]Если есть DBGrid связанный с укзанными НД, И ПОЛЯ В СЕТКЕ МЕНЯЛИСЬ МЕСТАМИ, ТО М.Б.(В Д5 точно), что присвоение Fields[0].AsInteger присваивает значение НЕ ПЕРВОМУ ПОЛЮ В ПОДЧИНЕННОЙ ТАБЛИЦЕ !
Попробуй в сетке показать все поля, затем перетащить какое-то поле на место другого (жедательно разного типа) и проделать то, что делаешь ты.. Или ApeendRecord() с параметрами, указав в сроке параметров значения в том порядке, в котором поля следуют ФИЗИЧЕСКИ в таблице.
tytus (2006-01-12 13:50:00) [6][23]
tytus@ukr.net
wait for mail...
mr.il (2006-01-12 13:35:00) [7]Ежли у тебя есть электронка то давай напишу подробно с примером.
tytus (2006-01-12 13:30:00) [8][21]
Нутром чуял что так и нужно было...
Как я понял, ты предлагаешь сделать ХП для детали, в ней тригер BEFORE INSERT, и забрать с нее (с ХП) значение первичного ключа для детали.
Только поля какой таблицы отправлять на ХП нужно, и зачем? Да и нужно мне не значение первичного ключа для детали, а значение ПОЛЯ В ДЕТАЛИ, value которого равно значению перв.ключа ГЛАВНОЙ.
mr.il (2006-01-12 13:21:00) [9]А где у тебя идет заполнение первичного ключа? Если в триггере то перепиши триггер на ХП отправляй туда значения для всех полей генери там значение первичного ключа вызывай ее из проги и возвращай значение первичного ключа.
tytus (2006-01-12 13:06:00) [10][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-11 17:38:00) [11]И еще, в целом корректнее писать так:
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;
И ваще зачем такие сложности, писать в стиле локальной БД для К-С.
mr.il (2006-01-11 17:30:00) [12]Может я ослеп, но не увидел, где присваевается значение первичного ключа (его-же уникального) второй таблицы? Особо беспокоит меня вот это
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. Это правильно?
evvcom (2006-01-11 17:09:00) [13]
> ... да.. не смотрел
а надо посмотреть, и посмотреть, а появилась ли такая запись с только что вставленными параметрами в таблице. Для этого должно выполниться DM1.DB1.Commit; значит ругающийся Post надо закомментарить (на время теста).
tytus (2006-01-11 17:02:00) [14][14]
Извращенец...
...ты не видел ВЕСЬ модуль!!!(как в анекдоте - если-бы ОНО еще и работало - ему бы цены небыло)
tytus (2006-01-11 16:59:00) [15][14]
... да.. не смотрел, хотя делал брекпоинт после него - и работает, ошибка вылетает после POST в детали. Да и бегать с 3-го на 4-ый этаж за инетом - дело тяжелое... Если проблема только в этом - то посоветуйте как правильно все сделать.
evvcom (2006-01-11 16:56:00) [16]Да...а... Извращенец и только.
Ну и что отладчик показывает после присвоения TempMID := ... ?
tytus (2006-01-11 16:49:00) [17][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:39:00) [18]
> please wait for me...
hope & wait...
tytus (2006-01-11 16:33:00) [19][ALL]господа, через пару минут приннесу оригинал модуля... я же с другого компа... please wait for me...
tytus (2006-01-11 16:31:00) [20][8]
Ну незнаю, хочется разобраться с БДЕ...
А что вариантов нету?
Один раз у меня получилось... Я добавил индекс на одно из полей для локейта. И все заработало! Затем я удалил етот индекс - и ВСЕ... все что нажито непосильным трудом...все пропало!