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

Вниз

Ошибка: "Данные редактируются другим пользователем"   Найти похожие ветки 

 
Russko   (2004-12-27 12:14) [0]

После выполнения запроса:
otc.Query9.SQL.Clear;
otc.Query9.SQL.Add("delete from main_base_svod where shifr=""+shifr+"" ");
otc.Query9.RequestLive:=true;
otc.Query9.ExecSQL;
на строчке    
   otc.Query3.edit;
   otc.Query3.FieldByName("ves").AsFloat:=round(V*ro*100)/100;
   otc.Query3.Post;
выкидывает такую ошибку.
Query3 тоже подцеплен к main_base_svod.


 
Александр Иванов ©   (2004-12-27 12:21) [1]

Вот это лишнее: otc.Query9.RequestLive:=true;


 
stud ©   (2004-12-27 12:25) [2]

после выполнения otc.Query9.ExecSQL;
нужно закомитить действия


 
Russko   (2004-12-27 12:32) [3]

Каким образом закомить, если я транзакцию явням образом не открываю, а на otc.Query9.CommitUpdate говорит что не в режиме редактирвоания )


 
msguns ©   (2004-12-27 12:37) [4]

Правильно говорит. Ты путаешь открытый датасет в режиме редактирования с запросом на разовые изменения (DELETE, INSERT, UPDATE). Это во-первых. А во-вторых, не разобравшись с транзакциями, не поймешь как работает интербэйз и, как следствие, поимеешь массу "непоняток"


 
stud ©   (2004-12-27 12:52) [5]

для действий типа

> "delete from main_base_svod where shifr=""+shifr+"" "

лучше использовать TIBsql желательно с отдельной транзакцией, тогда например
TIBsql .SQL.Close;
TIBsql.transaction.starttans..;
TIBsql .SQL.Add("delete from main_base_svod where shifr=""+shifr+"" ");
TIBsql .Exe....;
TIBsql.transaction.commit;
теперь необходимо переоткрыть (обновить) набор otc.Query3 чтобы он содержал актуальные данные и пытаться его редактировать


 
PSH   (2004-12-27 13:01) [6]

Как я понимаю, набор данных Query3 устарел. Надо его Close, потом Open.
Ну и транзакции надо аккуратнее использовать, лучше явно завершать текущую, стартовать новую, делать все в рамках этой транзакции, потом подтверждать.


 
Zacho ©   (2004-12-27 13:07) [7]

stud ©   (27.12.04 12:52) [5]

Он BDE использует. Насколько я понимаю, старый проект, который сейчас переводится на IB.
Так что все эти "запись редактируется другим пользователем" - чисто BDE-шные приколы, насколько помню, никакого отношения к lock conflict в IB не имеющие.

2 Russko: Статьи и FAQ на http://www.ibase.ru/develop.htm читал ?


 
stud ©   (2004-12-27 13:22) [8]


> Zacho ©   (27.12.04 13:07) [7]

молчит ведь. партизан наверное)))


 
Russko   (2004-12-27 13:46) [9]

Читал, но ничего сущного не нарыл ))
Да работаю через BDE, т.к. прога была написана для PARADOX.
Дело в том что в проге целый цикл:
Сущесвует 2 анологичные базы (для сверки)
1.берётся запись в БД1
2.сверяется с др.записями по опр.алгоритму,
если выполняется, то записи с которыми произошли "совпадения" удаляются из БД1(чтобы дважды не встречалась) и БД2
3.цикл заканчивается и берётся следующая запись в БД1.
Так вот ошибка выскакивает потому как фактического удаления из БД1 не происходит и при повторе цикла курсор становится и пытается работать с записью, которая должна была бы быть удалена


 
Zacho ©   (2004-12-27 13:47) [10]

stud ©   (27.12.04 13:22) [8]

Он в другой ветке это говорил :) Правда, так и не сказал, что использует именно BDE, но из контекста это было понятно :)


 
msguns ©   (2004-12-27 13:49) [11]

>Russko   (27.12.04 13:46) [9]

Это, что, репликация ? Ты привел бы фрагмент кода, где это самое "не удаляется"


 
Russko   (2004-12-27 13:56) [12]

Я бы привёл, но думаю не влезет ))
Вопрос остался только один - каким образом мне обновить данные в таблице main_base_svod так, чтобы Query3 не потерял места где стоит без использования закладок.
Например:
Query3.SQL.Clear;
Query3.SQL.Add("select * from main_base_svod ");
Query3.OPen;
Query3.First;
 while not otc.Query3.Eof do begin
 .................................
Query9.SQL.Clear;
Query9.SQL.Add("delete from main_base_svod where  shifr=""+shifr+"" ");
Query9.ExecSQL;
Query3.Next;       end;


 
Zacho ©   (2004-12-27 13:58) [13]

Russko   (27.12.04 13:46) [9]

Две базы или две таблицы ? Есть у меня подозрение, что всё-таки таблицы, а не БД.

> Так вот ошибка выскакивает потому как фактического
> удаления из БД1 не происходит и при повторе цикла
> курсор становится и пытается работать с записью,
> которая должна была бы быть удалена

Вот это я не совсем понял. Объясни подробнее, по шагам.


 
Russko   (2004-12-27 14:07) [14]

Query9.SQL.Clear;
Query9.SQL.Add("delete from main_base_svod where  shifr=""+shifr+"" ");
Query9.ExecSQL;
Этим запросом я удаляю некоторую запись с shifr=""+shifr+""
затем я попадаю в цикл по Query3 и следующая запись на которую встаёт Query3 оказывается та, которую я вроде удалил Query9. ПО идее он должен был бы её пропустить, но поскольку удаления фактического не произошло (набор данных не обновился), то он пытается работать с "удалённой" записью ))


 
msguns ©   (2004-12-27 14:10) [15]

>Russko   (27.12.04 13:56) [12]
>Вопрос остался только один - каким образом мне обновить данные в таблице main_base_svod так, чтобы Query3 не потерял места где стоит без использования закладок

Никак.


 
Zacho ©   (2004-12-27 14:16) [16]

Russko   (27.12.04 13:56) [12]

Попытайся всё-таки объяснять более понятно, а то не совсем понятно, что конкретно ты пытаешься сделать, и в чём проблема.
В смысле "обновить в таблице" ? В наборе данных в приложении или где ? Почему закладки не подходят ? При чём здесь приведённый ниже код ? И зачем отдельный Query с запросом, а не просто Query3.Delete ?

>Query9.SQL.Clear;
> Query9.SQL.Add("delete from main_base_svod where  
> shifr=""+shifr+"" ");


Вместо этого лучше используй параметризированный запрос.


 
Zacho ©   (2004-12-27 14:18) [17]

Russko   (27.12.04 14:07) [14]

Просто используй один датасет и всё.
Или переоткрывай Query3 и позиционируйся locate"ом по первичному ключу.


 
stud ©   (2004-12-27 14:43) [18]


>сверяется с др.записями по опр.алгоритму,
> если выполняется, то записи с которыми произошли
> "совпадения" удаляются из БД1(чтобы дважды не
> встречалась) и БД2

т.е. чтобы вообще нигде не встречались????
а вообще это наверное можно сделать одним запросом
например
"delete from main_base_svod where shifr=(select ... from ... where условие)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.04 c
1-1105969512
AlexP11
2005-01-17 16:45
2005.01.30
Эмуляция нажатия клавиши


6-1100514038
arhis
2004-11-15 13:20
2005.01.30
Sockets Delphi 7


1-1106031306
denis24
2005-01-18 09:55
2005.01.30
Имя компьютера


1-1105653572
Alex_S
2005-01-14 00:59
2005.01.30
Label.Caption запаздывает


9-1098617715
.cpp
2004-10-24 15:35
2005.01.30
Вычислить положение откуда идёт выстрел





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский