Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.038 c
15-1139650945
Yanis
2006-02-11 12:42
2006.03.05
Вот это война :)


15-1139654316
s65
2006-02-11 13:38
2006.03.05
тест мини оперы


6-1132775136
Николай2005
2005-11-23 22:45
2006.03.05
формирование POST запроса в TIdHTTP


2-1139896114
Emik
2006-02-14 08:48
2006.03.05
Таблици InterBase


2-1139640073
Интересующийся
2006-02-11 09:41
2006.03.05
Обработка сервером формы пришедшей от клиента