![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка: "Данные редактируются другим пользователем" [D7, IB6.x]
Russko © (2004-12-27 12:14:00)После выполнения запроса:
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.
stud (2004-12-27 14:43:00) [1]
>сверяется с др.записями по опр.алгоритму,
> если выполняется, то записи с которыми произошли
> "совпадения" удаляются из БД1(чтобы дважды не
> встречалась) и БД2
т.е. чтобы вообще нигде не встречались????
а вообще это наверное можно сделать одним запросом
например
'delete from main_base_svod where shifr=(select ... from ... where условие)
Zacho (2004-12-27 14:18:00) [2]Russko (27.12.04 14:07) [14]
Просто используй один датасет и всё.
Или переоткрывай Query3 и позиционируйся locate'ом по первичному ключу.
Zacho (2004-12-27 14:16:00) [3]Russko (27.12.04 13:56) [12]
Попытайся всё-таки объяснять более понятно, а то не совсем понятно, что конкретно ты пытаешься сделать, и в чём проблема.
В смысле "обновить в таблице" ? В наборе данных в приложении или где ? Почему закладки не подходят ? При чём здесь приведённый ниже код ? И зачем отдельный Query с запросом, а не просто Query3.Delete ?
>Query9.SQL.Clear;
> Query9.SQL.Add('delete from main_base_svod where
> shifr="'+shifr+'" ');
Вместо этого лучше используй параметризированный запрос.
msguns (2004-12-27 14:10:00) [4]>Russko (27.12.04 13:56) [12]
>Вопрос остался только один - каким образом мне обновить данные в таблице main_base_svod так, чтобы Query3 не потерял места где стоит без использования закладок
Никак.
Russko (2004-12-27 14:07:00) [5]Query9.SQL.Clear;
Query9.SQL.Add('delete from main_base_svod where shifr="'+shifr+'" ');
Query9.ExecSQL;
Этим запросом я удаляю некоторую запись с shifr="'+shifr+'"
затем я попадаю в цикл по Query3 и следующая запись на которую встаёт Query3 оказывается та, которую я вроде удалил Query9. ПО идее он должен был бы её пропустить, но поскольку удаления фактического не произошло (набор данных не обновился), то он пытается работать с "удалённой" записью ))
Zacho (2004-12-27 13:58:00) [6]Russko (27.12.04 13:46) [9]
Две базы или две таблицы ? Есть у меня подозрение, что всё-таки таблицы, а не БД.
> Так вот ошибка выскакивает потому как фактического
> удаления из БД1 не происходит и при повторе цикла
> курсор становится и пытается работать с записью,
> которая должна была бы быть удалена
Вот это я не совсем понял. Объясни подробнее, по шагам.
Russko (2004-12-27 13:56:00) [7]Я бы привёл, но думаю не влезет ))
Вопрос остался только один - каким образом мне обновить данные в таблице 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;
msguns (2004-12-27 13:49:00) [8]>Russko (27.12.04 13:46) [9]
Это, что, репликация ? Ты привел бы фрагмент кода, где это самое "не удаляется"
Zacho (2004-12-27 13:47:00) [9]stud © (27.12.04 13:22) [8]
Он в другой ветке это говорил :) Правда, так и не сказал, что использует именно BDE, но из контекста это было понятно :)
Russko (2004-12-27 13:46:00) [10]Читал, но ничего сущного не нарыл ))
Да работаю через BDE, т.к. прога была написана для PARADOX.
Дело в том что в проге целый цикл:
Сущесвует 2 анологичные базы (для сверки)
1.берётся запись в БД1
2.сверяется с др.записями по опр.алгоритму,
если выполняется, то записи с которыми произошли "совпадения" удаляются из БД1(чтобы дважды не встречалась) и БД2
3.цикл заканчивается и берётся следующая запись в БД1.
Так вот ошибка выскакивает потому как фактического удаления из БД1 не происходит и при повторе цикла курсор становится и пытается работать с записью, которая должна была бы быть удалена
stud (2004-12-27 13:22:00) [11]
> Zacho © (27.12.04 13:07) [7]
молчит ведь. партизан наверное)))
Zacho (2004-12-27 13:07:00) [12]stud © (27.12.04 12:52) [5]
Он BDE использует. Насколько я понимаю, старый проект, который сейчас переводится на IB.
Так что все эти "запись редактируется другим пользователем" - чисто BDE-шные приколы, насколько помню, никакого отношения к lock conflict в IB не имеющие.
2 Russko: Статьи и FAQ на http://www.ibase.ru/develop.htmчитал ?
PSH (2004-12-27 13:01:00) [13]Как я понимаю, набор данных Query3 устарел. Надо его Close, потом Open.
Ну и транзакции надо аккуратнее использовать, лучше явно завершать текущую, стартовать новую, делать все в рамках этой транзакции, потом подтверждать.
stud (2004-12-27 12:52:00) [14]для действий типа
> '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 чтобы он содержал актуальные данные и пытаться его редактировать
msguns (2004-12-27 12:37:00) [15]Правильно говорит. Ты путаешь открытыйдатасет в режиме редактирования с запросом на разовые изменения (DELETE, INSERT, UPDATE). Это во-первых. А во-вторых, не разобравшись с транзакциями, не поймешь как работает интербэйз и, как следствие, поимеешь массу "непоняток"
Russko (2004-12-27 12:32:00) [16]Каким образом закомить, если я транзакцию явням образом не открываю, а на otc.Query9.CommitUpdate говорит что не в режиме редактирвоания )
stud (2004-12-27 12:25:00) [17]после выполнения otc.Query9.ExecSQL;
нужно закомитить действия
Александр Иванов (2004-12-27 12:21:00) [18]Вот это лишнее: otc.Query9.RequestLive:=true;