Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

ХЕЛППП!!! 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.012 c
4-1134719932
Kot_
2005-12-16 10:58
2006.03.05
Бездействие пользователя в программе.


2-1139870282
Alsan
2006-02-14 01:38
2006.03.05
Как скопировать папку с файлами в Delphi ???


15-1139553043
Rouse_
2006-02-10 09:30
2006.03.05
Ну вот собственно и фсе. Сегодня у меня свадьба :)


15-1139542859
Бугага
2006-02-10 06:40
2006.03.05
Barry Manilow - Mandy


15-1139579838
tradakad
2006-02-10 16:57
2006.03.05
компиляция проекта без использования IDE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский