Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка при изменении значения в базе


Автор: Jey_k 17.9.2004, 11:08
По нажатию кнопки проверка совпадений значений поля IZD если совпадает,то пересчитать поле VSEGO если нет то добавить новую запись. Проблема (cм картинку)
возникает именно при совпадении (данные берутся из ST:TStringGrid)

Код
procedure TForm3.SpeedButton2Click(Sender: TObject);
var
i:integer;
begin
For i:= 1 to ST.RowCount-1 do
begin
 Table1.First;
 If Table1.fieldbyname('izd').AsString = ST.Cells[0,i] then
  begin
   Table1.Edit;
   Table1.FieldByName('vsego').AsInteger:=Table1.FieldByName('vsego').AsInteger+strtoint(ST.Cells[2,i]);
   Table1.Post;
  end
 else
 begin
  Table1.Insert;
  Table1.FieldByName('izd').AsString:=ST.Cells[0,i];
  Table1.FieldByName('kart').AsString:=ST.Cells[1,i];
  Table1.FieldByName('vsego').AsString:=ST.Cells[2,i];
  Table1.Post;
 end;
 Table1.Next;
end;
end;

Автор: gray_k 17.9.2004, 12:22
Чегой-то я не пойму. У тебя логическая ошибка. Ты удёшь в цикле до максимального значения в СтрингГриде, а делаешь на каждом шаге Table1.Next. Так можно вылезти за границы НД. На какой именно строчке вылазит ошибка? Какой тип присваемого поля? Какой тип у сравниваемого поля? Не вылазишь ли ты за максимальное значения поля? Какой тип БД?

Автор: Chyslyvchyk 17.9.2004, 15:01
навскидку:
Код
...
begin
For i:= 1 to ST.RowCount-1 do
begin
    Table1.First;
    while not Table1.Eof do
    begin
    If Table1.fieldbyname('izd').AsString = ST.Cells[0,i] then  
        begin
        Table1.Edit;
        Table1.FieldByName('vsego').AsInteger:=Table1.FieldByName('vsego').AsInteger+strtoint(ST.Cells[2,i]);
        Table1.Post;
        Table1.Next;
        end
     else
        begin
        Table1.Insert;
        Table1.FieldByName('izd').AsString:=ST.Cells[0,i];
        Table1.FieldByName('kart').AsString:=ST.Cells[1,i];
        Table1.FieldByName('vsego').AsString:=ST.Cells[2,i];
        Table1.Post;
        Table1.Next;
        end;
     end;
end;
end;

Автор: Jey_k 20.9.2004, 09:37
Chyslyvchyk
не помогло, та же ошибка, только теперь вводимые данные заносятся в новую запись, старая не редактируется

Автор: Jey_k 20.9.2004, 10:41
При таком раскладе
Код

procedure TForm3.SpeedButton2Click(Sender: TObject);
var
i:integer;
begin
For i:= 1 to ST.RowCount-1 do
begin
 Table1.First;
 while not Table1.Eof do
  begin
    If ST.Cells[0,i]=Table1.fieldbyname('izd').AsString   then
     begin
      Table1.Edit;
      Table1Vsego.Value:=Table1vsego.Value+strtoint(ST.Cells[2,i]);
      Table1.Post;
     end
     else
      begin
       Table1.Insert;
       Table1.FieldByName('izd').AsString:=ST.Cells[0,i];
       Table1.FieldByName('kart').AsString:=ST.Cells[1,i];
       Table1.FieldByName('vsego').AsString:=ST.Cells[2,i];
       Table1.Post;
      end;
   Table1.Next;
  end;
 end;
end;

новые значения вносятся, но вот если ввести уже внесенное изделие, то пересчитывать количество не хочет, та же ошибка

Автор: Jey_k 20.9.2004, 11:54
Тема исчерпана. Вышел из положения так:
Код

procedure TForm3.SpeedButton2Click(Sender: TObject);
var
i:integer;
begin

For i:= 1 to ST.RowCount-1 do
begin
 if table1.Locate('izd',ST.Cells[0,i],[]) = false then
  begin
   Table1.Insert;
   Table1.FieldByName('izd').AsString:=ST.Cells[0,i];
   Table1.FieldByName('kart').AsString:=ST.Cells[1,i];
   Table1.FieldByName('vsego').AsString:=ST.Cells[2,i];
   Table1.Post;
  end
  else
  begin
   Table1.Edit;
   Table1.FieldByName('vsego').AsInteger:=Table1.FieldByName('vsego').AsInteger+strtoint(ST.Cells[2,i]);
   Table1.Post;
  end;
end;
end;

скорее всего ошибка была при переборе значений полей таблиц, пусть лучше стандартная функция циклы просчитывает smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)