Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизЗаклинило на примитивной вещи - не могу отредактировать запись! Найти похожие ветки
← →
Michael5 (2005-11-07 00:58) [0]
OverviewADOTable.First;
for x:=1 to OverviewADOTable.RecordCount do begin
OverviewADOTable.Edit;
OverviewADOTable.FieldByName("sheetname").AsString:=ComboBox4.Text;
OverviewADOTable.Post;
OverviewADOTable.Next;
end;
____________________________________________
Просматриваю всю выборку, и в каждой записи меняю значение.
Пусть в выборке только одна запись. Тогда после присваивания полю значения, которое в комбобоксе, при первом же проходе цикла, на строкеOverviewADOTable.Next;
выдается ошибка: BOF или EOF имеет значение true, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.
В общем, для любого количества записей, на последней происходит эта ошибка.
Всю себе голову поломал, что я делаю неправильно?
Причем, после того, как отобьешься от сообщений об ошибке, видишь, что запись произошла, правильно и туда, куда надо...
← →
Michael5 (2005-11-07 01:00) [1]Извиняюсь, только ошибка не на строке
OverviewADOTable.Next;
, а на строкеOverviewADOTable.Post;
← →
sniknik © (2005-11-07 01:26) [2]http://delphimaster.net/view/3-1130309787/
почитай для интересу. и хотя я не так критичен (пользуюсь иногда ;) но всеже в данном случае поддерживаю мнеие Johnmen-а, ... с оговоркой. не понимаеш как это работает не пользуйся. есть стандартные методы в гнигах/хелпе описаны. ну зачем сразу извращатся?
и потом ADOTable тоже не пользуйся, сделай тут поиск по ADOTable, тоже почитай. это не BDE-шная таблица, это "обманка". не пользуйся.
← →
Cardinal © (2005-11-07 09:57) [3]все работает? тогда глуши ошибку ))
--
попробуйте x := 2 что ли
← →
Michael5 (2005-11-07 13:47) [4]
> sniknik © (07.11.05 01:26) [2]
Дело в том, что это и вычитано из книг - RecordCount, First, Next, Post...
Нюансов различия между различными способами доступа к БД, к сожалению, не знаю. По мне, АДО и АДО, не хуже или лучше других. А вот, кстати, про БДЕ я уже успел тут прочитать, типа, мне как минимум, должно было бы быть стыдно, если б я им пользовался...
Потом, АДО - стандартный вариант для базы Акцесс, кажется...
В-третьих, поиск по сайту не работает...
Лучше прямо скажите, как мне этот фрагмент переписать... А я выводы для всего остального сделаю!
← →
Amoeba © (2005-11-07 17:57) [5]
> for x:=1 to OverviewADOTable.RecordCount do begin
Замени на
while not OverviewADOTable.Eof do begin
← →
sniknik © (2005-11-07 20:50) [6]Michael5 (07.11.05 13:47) [4]
по моему ты не понял, тебе не говорят не пользоваться АДО, тебе говорят не пользуйся ADOTable (тейбле с приставкой адо). т.к. то что в BDE было приличным компонентом, для локальных таблиц (Table), в ADO стало граблями для начинающих. (вернее не в ADO, в нем его нет, а в реализации борланда, его обертки для ADO)
просто смени его на ADODataSet (обьяснять почему уже достало ;), не вериш... ну как хочеш, грабли твои).
← →
Michael5 (2005-11-07 21:05) [7]Нет, это тоже не помогает.
Зато заметил, что происходит: сбой происходит на предпоследнем шаге.
Пусть записей две (RecordCount=2).
Тогда при первом проходе циклаfor x:=1 to OverviewADOTable.RecordCount do begin
OverviewADOTable.Edit;
OverviewADOTable.FieldByName("sheetname").AsString:=ComboBox4.Text;
//здесь рекордкаунт все еще равен 2
OverviewADOTable.Post;
//А после поста он становится равным 1!!!
Соответственно следующей (Next) записи уже не стало, и начинается неразбериха.
Так что, что происходит, понятно...
Но что делать-то?!
← →
Michael5 (2005-11-07 21:14) [8]
> sniknik © (07.11.05 20:50) [6]
Уважаемый sniknik: я же пользуюсь одним из вариантов (АДОТейбл в данном случае, а не датасетом, к примеру) не потому, что я такой упертый...
Просто я не знаю различий между ними. И делаю, что первое под руку попалось.
Теперь я научился на своей ошибке, буду знать.
Спасибо большое за помощь :)
Теперь все, что ли, переписывать, с тейбла на датасет?...
← →
Плохиш © (2005-11-07 23:15) [9]
> Michael5 (07.11.05 21:05) [7]
> Нет, это тоже не помогает.
>
> Зато заметил, что происходит: сбой происходит на предпоследнем
> шаге.
> Пусть записей две (RecordCount=2).
> Тогда при первом проходе цикла
> for x:=1 to OverviewADOTable.RecordCount do begin
> OverviewADOTable.Edit;
> OverviewADOTable.FieldByName("sheetname").AsString:=ComboBox4.
> Text;
> //здесь рекордкаунт все еще равен 2
> OverviewADOTable.Post;
> //А после поста он становится равным 1!!!
<Telepator on>
Филтер у таблицы включён и новое значение в него не попадает.
<Telepator off>
← →
Michael5 (2005-11-07 23:34) [10]Ессно, фильтр включен.
Логика моя такая:
не шарить же по всем записям, которых будет тысячи. Проще отфильтровать сразу нужное и скопом все отредактировать.
Теперь-то я понимаю, что ошибался! :) Спасибо, Плохиш!
Значит, вся загвоздка в фильтрованной ADOTable... А как все-таки исправить мой код, не переходя на ADODataSet? Выключать фильтр, проверять каждую запись по моему условию фильтра, редактировать, потом снова включать фильтр? (Фильтрованный вид требуется для пользователя)
← →
Плохиш © (2005-11-08 00:02) [11]
> А как все-таки исправить мой код, не переходя на ADODataSet?
Надо лечить не болезнь, а причины приводящие к ней!
← →
sniknik © (2005-11-08 00:10) [12]> не потому, что я такой упертый...
и тем не менее впечатление что очень...
в [7]
> Нет, это тоже не помогает.
а код оставлен как был, два совета [5] и [6] проигнорированы. какое же это "это тоже не помогает" если ты ничего не поменял? или ты советы как молитвы читаеш над своим кодом? так оно конечно "тоже не помогает".
> Логика моя такая:
> не шарить же по всем записям, которых будет тысячи. Проще отфильтровать сразу нужное и скопом все отредактировать.
фильтры "как в локальной логике" (работе с локальными/файл серверными таблицами), также непустимы как и ADOTable! но вовсе не потому почему у тебя ошибка идет. тут чисто твой глюк и упертость, нежелание следовать советам которые сам и спрашиваеш.
← →
Michael5 (2005-11-08 09:36) [13]Спокойно...
С ADODataSet"ом все работает, [5] и особенно [6] приняты к сведению.
[5], кстати, не помогло (впрочем, я это уже говорил).
Вывод такой (для себя сделал): ADOTable только для отображения, добавления новых записей.
Для редактирования - датасет (выборка)
← →
sniknik © (2005-11-08 11:13) [14]> Вывод такой (для себя сделал): ADOTable только для отображения
неправильный. ADOTable для помойки адназначно, тудаже за компанию ADOQuery, хотя его "вина" и поменьше. а пользоваться только тем что имеет корни в самом ADO (конект, рекордсет, команд, RDS).
главный "проступок" этих компонент в том что они "навязывают" логику аналогичную своим аналогам из BDE. но то что хорошо там, то здесь часто верх идиотизма.
если взялся за новую технологию, учи как она работает а не тяни неверные представления из другой.
совет (действительно хороший ;) залезь в палитру компонент и просто удали эту парочку, чтобы соблазнов не было.
и кстати не надо спорить, что и с ними можно работать... можно, если разбираешся, можно легко и через ADOTable запрос сделать, но смысл то не в том, что можно, а что нельзя а в психологии начинающего -> "есть одноименный компонет значит и работает аналогично... значит и учить ничего нового не будем, возьмем его, а не то что советуют и что вроде роднее".
вообще, это очень большая ошибка борланда, что она добавила этих "незаконнороженных" в палитру ADO. даже не имхо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.014 c