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;
Обработка БД Access
Объясните, пожалуйста, почему такой код не работает:
Код:
maintableelectro
Код:
maintableelectroactive9
И еще откройте для себя
Код:
with DataModule1 do
begin
...
end;
begin
...
end;
при попытке запустить данный код вылетает error, что "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения"
Отладка показывает, что весь процесс расчета и занесения новых данных проходит норм, а рушится все на post'e.
Код:
DataModule1.MainTableElectro.Edit;
DataModule1.MainTableElectro.FieldByName('Sum9').AsInteger := CurData9 - PrevData9;
DataModule1.MainTableElectro.Post;
DataModule1.MainTableElectro.FieldByName('Sum9').AsInteger := CurData9 - PrevData9;
DataModule1.MainTableElectro.Post;
PS: 9 и 12 - это ячейки на узле учета электроэнергии
Active - это активное значение кол-ва эл-ва
Вообще это просто журнал учета расхода электроэнергии на предприятии
Код:
with DataModule1.MainTableElectro do
begin
PrevData := FieldByName('Active9').AsInteger;
Next;
CurData := FieldByName('Active9').AsInteger;
Edit;
FieldByName('Sum9').AsInteger := CurData - PrevData;
Post;
end;
begin
PrevData := FieldByName('Active9').AsInteger;
Next;
CurData := FieldByName('Active9').AsInteger;
Edit;
FieldByName('Sum9').AsInteger := CurData - PrevData;
Post;
end;
теоретически должно работать. Особо я ничего не менял, можно сказать упростил код. О результатах сообщите.
Еще имеет смысл проверить какие значения в переменных CurData и PrevData.
зы. Пост писан с мобилы ;)
Тот же эффект!
вот блин. Я чессказать не знаю из за чего такая гадость, в гугле смотрели по тексту ошибки? судя по нему, где то че то в этой записи меняется. В коде я этого не увидел. Как быдло вариант решения - скопировать датасет, читать со старого, изменения вносить в новый. Но лучше найти источник проблемы. Вы весь код дали? Неплохо бы всю функцию глянуть...
Цитата: Washington
вот блин. Я чессказать не знаю из за чего такая гадость, в гугле смотрели по тексту ошибки?
уж сколько раз твердили миру - во первых разделите просмотр и модификацию. во вторых разделите просмотр и модификацию. в третьих - РАЗДЕЛИТЕ ПРОСМОТР И МОДИФИКАЦИЮ. и будет вам счастье. :)
ну и советую просмотреть настройки кеширования в самом компоненте. вариантов может быть много - но скорей всего набор данных на момент обновления не являются валидными. По какой причине - хз - вам проще разобраться, вы же этот код писали.
ну так и есть. Мы вон все время датасеты клонировали. Просто взяли это за стандарт. И не было таких глюков.
Код:
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;
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?
У тебя скока там записей воще?
Цитата: Washington
ну так и есть. Мы вон все время датасеты клонировали. Просто взяли это за стандарт. И не было таких глюков.
А я всегда так поступаю, чего парить себе мозг то...