![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго времени суток.
Есть база данных 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; Ответа на форумах ни в книгах найти не смог. Подскажите как правильно работать, с точки зрения компонентов, при изменении данных, больше чем в одной таблице. Желательно используя стандартные компоненты. |
#2
|
||||
|
||||
![]() Транзакция может быть открыта единожды.
Должно быть чето типа такого: Код:
StartTransaction; try blablabla // много кода CommitTransaction; except RollbackTransaction; end; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
![]() Цитата:
|
#4
|
|||
|
|||
![]() Все спасибо. Решено.
Нада было проверить на if not IBTransactionWriteoffProducts.inTransaction then IBTransactionWriteoffProducts.Start; |