![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите!!!! Задолбался с ADOTable [D5, MSSQL]
denmin © (2004-03-09 10:24:00)Здравствуйте. Дело вот в чем. Есть программа на Delphi5, использую ADO. В гриде высвечиваются данные отфильтрованные по фильтру. На гриде есть попупменю, где одним из пунктов яв-ся удаление записи. Удаление происходит так, в двух таблицах
Table5.Filter:='';
Table5.Open;
If Table5.Locate('docnum;docdate',VarArrayOf([Table4['docnum'],Table4['docdate']]),[]) then
begin
While (not Table5.Eof)and(Table5['docnum']=Table4['docnum'])and(Table5['docdate']=Table4['docdate']) do
Table5.Delete;
end;
Table5.Close;
Table4.Delete;
так вот все проходит а на Table4.Delete говорит "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения".
Может что не так я делаю, а может есть патч на ADO какой-нибудь?
Stas (2004-03-09 12:22:00) [1]Да у меня и с ключем при локальном курсоре такие проблемы были.
Пока не поменял курсор на серверный.
А грид у меня тоже напрямую подключен.
Если знаешь как это обойти напиши.
sniknik (2004-03-09 12:15:00) [2]stas © (09.03.04 12:05) [10]
зачем? первое для MSSQL возникнут проблемы с букмарками если попытатся напрямую грид присоеденить (грид используется), а второе делается же полное сканирование т.е. все одно все тащится на локаль а приташить все куском как при локальном быстрее (сжатие используется) чем позаписьно (по мере надобности и несжато) как при серверном делается. и в третьих ключь от этого менее необходим не станет.
лутше сразу менять логику пока не написал большого куска который влом менять будет.
stas (2004-03-09 12:05:00) [3]Если возможно, то сделай
CursorLocation:=clUseServer
CursorType:=ctKeySet
sniknik (2004-03-09 11:09:00) [4]> а если ключи так необходимы и без них никак нельзя на SQL Server, то я так и сделаю.
если с таблицей работаеш то обязательны, есть варианты когда без них можно обойтись но даже в этом случае чаще добавляют поле с ключом на всякий случай.
ты лутше про sql почитай. и если сможеш сам составить запрос не используя уникального идентификатора (ключа) то значит он и не нужен, если хоть раз в работе с таблицей он понадобится то.... а от компонентов генерирующих sql команды в этом случае бедеш получать "Не удается найти строку для обновления. ..."
sniknik (2004-03-09 11:03:00) [5]Плохиш (09.03.04 10:45) [5]
это только один из вариантов, другой не менее вероятный
таблици связаны по FOREIGN KEY ... ON DELETE CASCADE, и удаление идет сначала с главной таблицы а после пытается с подчиненной.
но это не главное, главное как это далается, перегонять на клиента все данные чтобы просканировать и удалить пару, ... нонсенс.
Плохиш (2004-03-09 10:59:00) [6]
> denmin © (09.03.04 10:55) [6]
> да, ключа у таблицы нет.
Вот сам подумай, по какому критерию должен создаться запрос на удаление записи?
denmin (2004-03-09 10:55:00) [7]да, ключа у таблицы нет. но неужели у каждой таблицы на сиквеле должны быть ключи? извините, если что не понимаю, но я только начинаю с сиквелом работу. а если ключи так необходимы и без них никак нельзя на SQL Server, то я так и сделаю.
Плохиш (2004-03-09 10:45:00) [8]В sniknik © (09.03.04 10:41) [3] были ключевые слова ключа у таблици нет. Советую над ними своей думалкой подумать.
denmin (2004-03-09 10:42:00) [9]прошу прощения если не понятно. короче в гриде высвечивается Table4, и из этого грида по попупменю удаляется эта запись из T4 и T5
sniknik (2004-03-09 10:41:00) [10]самый главный глюк в ADOTable, и использовании локальных методов для sql сервера.
по "глюку" на Table4
можно предположить что ключа у таблици нет а повторяющиеся записи есть. измени чтонибудь.
denmin (2004-03-09 10:39:00) [11]2 Романов Р.В. ©
здесь та все нормально, только вот Table4.Delete это самое говорит
Романов Р.В. (2004-03-09 10:37:00) [12]А так?
While Table5.Locate('docnum;docdate',VarArrayOf([Table4['docnum'],Table4['docdate']]),[]) do
Table5.Delete;