Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2007, 15:44   #1
Камикадзе
 
Регистрация: 24.10.2007
Сообщений: 8
По умолчанию Ошибка при "прочесывании" БД

Люди добрые, выручайте. Курсовая - учет работников на предприятии, в которой должен быть поиск по возрасту. Но возраст - вычисляемое поле, считается по дате рождения, и никакого поиска по нему делать нельзя. Придумал решение - сделал кнопку "Обновить", при нажатии на которую указатель проходит по всем записям БД и переписывает значение из вычисляемого поля в постоянное. Но появляется ошибка "Table is not in edit or write mode", хотя при добавлении новой записи все нормально.

БД организована следующим образом:
Создана в MS Access. Исбользую DataModule и на нем объекты:
KursD: TDatabase;
MainTab :TTable;
SourceEdit :TDataSource; (Настроена на MainTab)

Отображается все в DBGrid.

Код, выполняемый по нажатию кнопки "Обновить"
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
 DataModule2.MainTab.First;
 Max:=DataModule2.MainTab.RecordCount;
 For i:=1 to Max do
  with DataModule2 do
   begin
    MainTabAge:=MainTabAgeTemp; //Вот оно, присваивание 
    MainTab.Post;                         //постоянному полю
    MainTab.Next;
   end;
 DataModule2.MainTab.First;
end;
Подскажите, в чем моя ошибка?
Камикадзе вне форума Ответить с цитированием
Старый 11.11.2007, 16:03   #2
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

ошибка происходит потому что у тебя DataSet закрыт от редактирования...
Цитата:
procedure TForm1.Button6Click(Sender: TObject);
begin
DataModule2.MainTab.First;
Max:=DataModule2.MainTab.RecordCoun t;
For i:=1 to Max do
with DataModule2 do
begin
MainTab.Edit; // переводт DataSet в режим редактирования
MainTabAge:=MainTabAgeTemp; //Вот оно, присваивание
MainTab.Post; //постоянному полю
MainTab.Next;
end;
DataModule2.MainTab.First;
end;
dron-s вне форума Ответить с цитированием
Старый 11.11.2007, 16:30   #3
Камикадзе
 
Регистрация: 24.10.2007
Сообщений: 8
По умолчанию

Ну спасибо! Все работает! только странно, что мне это раньше нигде не попадалось... Таким же макаром я исправил еще один баг. И еще нашел ошибку. Надо присваивание делать так:
MainTabAge.AsInteger:=MainTabAgeTemp.AsInteger;
Если оставить как раньше, никаких изменений не происходит, хотя ошибок нет.
В итоге код выглядит так:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
 DataModule2.MainTab.First;
 Max:=DataModule2.MainTab.RecordCount;
 For i:=1 to Max do
  with DataModule2 do
   begin
    MainTab.Edit; // переводт DataSet в режим редактирования
    MainTabAge.AsInteger:=MainTabAgeTemp.AsInteger; //Вот оно, присваивание
    MainTab.Post;
    MainTab.Next;
   end;
 DataModule2.MainTab.First;
end;
Камикадзе вне форума Ответить с цитированием
Старый 11.11.2007, 16:48   #4
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

Цитата:
MainTabAge.AsInteger:=MainTabAgeTem p.AsInteger;
молодец, сам разобрался!
dron-s вне форума Ответить с цитированием
Старый 11.11.2007, 17:50   #5
Камикадзе
 
Регистрация: 24.10.2007
Сообщений: 8
По умолчанию

Стараюсь!
Камикадзе вне форума Ответить с цитированием
Старый 11.11.2007, 19:55   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
должен быть поиск по возрасту. Но возраст - вычисляемое поле, считается по дате рождения, и никакого поиска по нему делать нельзя
Какая ерунда, простите...
Это делается вполне тривиально:
1 - Пусть нужно выбрать сотрудников с возрастом 30 лет. На текущую дату вычисляются "крайние" даты рождения. То есть, год рождения может быть и в прошлом году, и в текущем. Все наши 30-летние родились не ранее, чем текущая дата минус 1 день минус 30 лет, и не позже, чем сегодня плюс 29 лет. Вот вам и крайние даты.
2 - выбираем всех сотрудников с датами рождения между этими датами.

Здесь может возникнуть только один нюанс - из-за формата представления даты в конкретной БД. Поэтому те самые "крайние" даты, возможно, придется перевести в соответствующую форму и сравнение производить именно в этом формате.

Последний раз редактировалось mihali4; 12.11.2007 в 14:25.
mihali4 вне форума Ответить с цитированием
Старый 12.11.2007, 10:26   #7
Камикадзе
 
Регистрация: 24.10.2007
Сообщений: 8
По умолчанию

Мдаа... Что-то я, видать, совсем заучился... Чуть-чуть бы пораньше мне это увидеть. Ну да ладно, оставлю пока как есть, там - посмотрим.
Камикадзе вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
"Ошибка приложения" при запуске мидлета hotman Общие вопросы по Java, Java SE, Kotlin 0 04.09.2008 15:16
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49