Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Заклинило на примитивной вещи - не могу отредактировать запись!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
1-1130919416
Иванов__
2005-11-02 11:16
2005.11.27
Напомните пож. как запустить внеш. программу с параметром.


2-1127211373
V.I.P.er
2005-09-20 14:16
2005.11.27
Fullscreen


2-1131608134
Wano
2005-11-10 10:35
2005.11.27
Запрос Access не работает в delphi


9-1121156030
n0p
2005-07-12 12:13
2005.11.27
ArcTan


4-1127744726
XGarik
2005-09-26 18:25
2005.11.27
Убить процесс на КПК