Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обработка БД Access

48K
12 июля 2009 года
sdc-alex
7 / / 28.06.2009
Объясните, пожалуйста, почему такой код не работает:

Код:
if DataModule1.MainTableElectro.Bof <> true then
 begin
  CurData9 :=   DataModule1.MainTableElectroActive9.AsInteger;
  bm1 := DataModule1.MainTableElectro.Bookmark;
  DataModule1.MainTableElectro.Prior;
  PrevData9 := DataModule1.MainTableElectroActive9.AsInteger;
  DataModule1.MainTableElectro.Bookmark := bm1;

  DataModule1.MainTableElectro.Edit;
  DataModule1.MainTableElectro.FieldByName('Sum9').AsInteger := CurData9 - PrevData9;
  DataModule1.MainTableElectro.Post;


P.S.: dbGO, Delphi 2009, Win32
6
12 июля 2009 года
George
4.1K / / 05.01.2007
а можно просто сказать че Вы хотите? А то лично мне не очень хочется разбираться в коде, где даже неясно что такое
 
Код:
maintableelectro
и
 
Код:
maintableelectroactive9
. Есть ацкое подозрение шо Вы их тупо перепутали. :)

И еще откройте для себя
 
Код:
with DataModule1 do
begin
...
end;
48K
13 июля 2009 года
sdc-alex
7 / / 28.06.2009
Необходимо сделать так чтобы при вводе данных в таблицу, содержимое ее полей Active9 и Active12 (кол-во потребленной электроэнергии), которое вводится вручную, сравнивалось с содержимым таких же полей предыдущей записи и разница между ними заносилась в поля Sum9 и Sum12 текущей записи.

при попытке запустить данный код вылетает error, что "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения"

Отладка показывает, что весь процесс расчета и занесения новых данных проходит норм, а рушится все на post'e.

 
Код:
DataModule1.MainTableElectro.Edit;
  DataModule1.MainTableElectro.FieldByName('Sum9').AsInteger := CurData9 - PrevData9;
  DataModule1.MainTableElectro.Post;


PS: 9 и 12 - это ячейки на узле учета электроэнергии
Active - это активное значение кол-ва эл-ва

Вообще это просто журнал учета расхода электроэнергии на предприятии
6
13 июля 2009 года
George
4.1K / / 05.01.2007
какая то странная структура датасета... Впрочем попробуйте так:
 
Код:
with DataModule1.MainTableElectro do
begin
  PrevData := FieldByName('Active9').AsInteger;
  Next;
  CurData := FieldByName('Active9').AsInteger;
  Edit;
  FieldByName('Sum9').AsInteger := CurData - PrevData;
  Post;
end;

теоретически должно работать. Особо я ничего не менял, можно сказать упростил код. О результатах сообщите.
Еще имеет смысл проверить какие значения в переменных CurData и PrevData.

зы. Пост писан с мобилы ;)
48K
13 июля 2009 года
sdc-alex
7 / / 28.06.2009
Тот же эффект!
6
13 июля 2009 года
George
4.1K / / 05.01.2007
вот блин. Я чессказать не знаю из за чего такая гадость, в гугле смотрели по тексту ошибки? судя по нему, где то че то в этой записи меняется. В коде я этого не увидел. Как быдло вариант решения - скопировать датасет, читать со старого, изменения вносить в новый. Но лучше найти источник проблемы. Вы весь код дали? Неплохо бы всю функцию глянуть...
1
14 июля 2009 года
kot_
7.3K / / 20.01.2000
Цитата: Washington
вот блин. Я чессказать не знаю из за чего такая гадость, в гугле смотрели по тексту ошибки?


уж сколько раз твердили миру - во первых разделите просмотр и модификацию. во вторых разделите просмотр и модификацию. в третьих - РАЗДЕЛИТЕ ПРОСМОТР И МОДИФИКАЦИЮ. и будет вам счастье. :)
ну и советую просмотреть настройки кеширования в самом компоненте. вариантов может быть много - но скорей всего набор данных на момент обновления не являются валидными. По какой причине - хз - вам проще разобраться, вы же этот код писали.

6
14 июля 2009 года
George
4.1K / / 05.01.2007
ну так и есть. Мы вон все время датасеты клонировали. Просто взяли это за стандарт. И не было таких глюков.
48K
14 июля 2009 года
sdc-alex
7 / / 28.06.2009
Вся функция:
Код:
procedure TMainForm.AddRecord(NameWnd: string; Edit: boolean );
begin

 if Edit = false then DataModule1.MainTableElectro.Insert;
 AddDataForm.Caption := NameWnd;
  if AddDataForm.ShowModal = mrOK then
   begin

     DataModule1.MainTableElectro.Post;
     CalcFields;
   end else
    begin
      DataModule1.MainTableElectro.Cancel;
    end;
end;

procedure TMainForm.CalcFields;
var
  PrevData9,
  PrevData12,
  CurData9,
  CurData12,
  CurPos: Integer;
  bm1 : TBytes;
begin
  if DataModule1.MainTableElectro.Eof <> true then
 begin

    PrevData9 := DataModule1.MainTableElectro.FieldByName('Active9').AsInteger;
    DataModule1.MainTableElectro.Next;
    CurData9 := DataModule1.MainTableElectro.FieldByName('Active9').AsInteger;
    DataModule1.MainTableElectro.Edit;
    DataModule1.MainTableElectro.FieldByName('Sum9').AsInteger := CurData9 - PrevData9;
    DataModule1.MainTableElectro.Post;
 end;

end;


Клонировать датасет - значит создать еще один Table?
50K
22 июля 2009 года
CamelTM
7 / / 22.07.2009
У тебя скока там записей воще?
56K
15 декабря 2009 года
vasileshek
1 / / 15.12.2009
Цитата: Washington
ну так и есть. Мы вон все время датасеты клонировали. Просто взяли это за стандарт. И не было таких глюков.


А я всегда так поступаю, чего парить себе мозг то...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог