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

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

ХЕЛППП!!! BDEError Record/Key Deleted [D7, IB6.x]


Страницы:   1 2

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]
Ну незнаю, хочется разобраться с БДЕ...
А что вариантов нету?
Один раз у меня получилось... Я добавил индекс на одно из полей для локейта. И все заработало! Затем я удалил етот индекс - и ВСЕ... все что нажито непосильным трудом...все пропало!


Страницы:   1 2

Наверх

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