Доброго времени суток.
Есть база данных Firebird.
Необходимо реализовать списание товаров со склада.
Делаю следующее.
1) создаю расходную накладную
2) заполняю ее данными из таблицы склада
3) выставляю необходимо количество товара для списания
4) жму сохранить и записи из dataSet вставляются в таблицу расходная накладная
5) со склада вычитается кол-во товара, указанное в dataSet
Проблема возникает со списанием товара со склада.
Как делаю.
Таблицы
Форма
Код:
FDataSet: TIBCustomDataSet;
ibQuery.cashedUpdate := true;
запрос для query
Код:
select ss.amount,
ss.ID,
ss.product_id,
s.title
from sales_invoice ss
join storehouse s
on s.id = ss.product_id
and ss.register_id = :idDocument
order by s.title
Последний вариант моего "мучения" был такой
Код:
procedure TForm1.Button2Click(Sender: TObject);
var Q: TIBQuery;
begin
try
IBTransactionWriteoffProducts.StartTransaction;
if FDataSet.RecordCount = 0 then begin
raise Exception.Create('Документ пуст!');
end;
Q := TIBQuery.Create(nil);
Q.Transaction := IBTransactionWriteoffProducts;
FDataSet.First;
while not FDataSet.Eof do begin
if(FDataSet.CachedUpdateStatus = cusInserted) then begin
Q.Close;
Q.SQL.Clear;
Q.SQL.Add('update storehouse set amount = amount - :amount where id = :id and amount - :amount >= 0');
Q.Prepare;
Q.ParamByName('id').AsInteger := FDataSet.FieldByName('product_id').AsInteger;
Q.ParamByName('amount').AsFloat := FDataSet.FieldByName('amount').AsFloat;
Q.ExecSQL;
if(Q.RowsAffected < 1) then begin
raise Exception.Create('Вы пытаетесь списать товаров больше чем их есть на складе. Товар "'
+ FDataSet.FieldByName('title').AsString + '" кол-во ' + FDataSet.FieldByName('amount').AsString);
end;
end;
FDataSet.Next;
end;
FDataSet.Database.ApplyUpdates([FDataSet]);
IBTransactionWriteoffProducts.Commit;
except
on E : Exception do begin
IBTransactionWriteoffProducts.Rollback;
ShowMessage(E.ClassName + ' ошибка : ' + E.Message);
end;
end;
end;
списание со склада проходит успешно, а вставка в расходную не происходит - ошибка транзакция уже активна.
Ответа на форумах ни в книгах найти не смог. Подскажите как правильно работать, с точки зрения компонентов, при изменении данных, больше чем в одной таблице.
Желательно используя стандартные компоненты.