Технические вопросы
Разработка

Расчет суммы операций

Добрый день, помогите решить задачку

Нужно в карточку редактирования Договора (wnd_ContractEdit) добавить поле, в котором будет просчитываться сумма всех Операций по данному договору (из раздела Cashflow) c состоянием Выполнена (StatusID).

Нравится

8 комментариев

Можно так:
Добавляете обычное поле с галкой "только для чтения", затем пишете триггеры на добавление, удаление, изменение в таблице операций, которые при каждом срабатывании пересчитывают сумму по указанному договору.

Не могли б более подробно рассказать о том как это сделать?

Пример, в таблице договоров есть поле "FactTotalAmount", которое является суммой поля "AmountToPay" счетов по договору. Триггеры:
[sql]
CREATE TRIGGER [dbo].[tr_UpdateContractFactTotalAmount_AU]
ON [dbo].[tbl_Invoice]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE c
SET c.FactTotalAmount = (
SELECT SUM(i2.AmountToPay)
FROM tbl_Invoice i2
WHERE i2.ContractID = c.ID
)
FROM tbl_Contract c
INNER JOIN inserted i ON i.ContractID = c.ID
INNER JOIN DELETED d ON d.Id = i.Id AND ISNULL(i.AmountToPay,0) <> ISNULL(d.AmountToPay,0)
END
[/sql]
[sql]
CREATE TRIGGER [dbo].[tr_UpdateContractFactTotalAmount_AI]
ON [dbo].[tbl_Invoice]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE c
SET c.FactTotalAmount = (
SELECT SUM(i2.AmountToPay)
FROM tbl_Invoice i2
WHERE i2.ContractID = c.ID
)
FROM tbl_Contract c
INNER JOIN inserted i ON i.ContractID = c.ID
END
[/sql]
[sql]
CREATE TRIGGER [dbo].[tr_UpdateContractFactTotalAmount_AD]
ON [dbo].[tbl_Invoice]
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
UPDATE c
SET c.FactTotalAmount = (
SELECT SUM(i2.AmountToPay)
FROM tbl_Invoice i2
WHERE i2.ContractID = c.ID
)
FROM tbl_Contract c
INNER JOIN DELETED d ON d.ContractID = c.ID
END
[/sql]

Вам нужно то же самое, только по другому полю, другой таблице и добавить в условие проверку на состояние операции.

Александр, большое спасибо за помощь!!! все получилось=)))

а как здесь добавить проверку на состояние операции?

В условие WHERE везде дописать:
[sql]
and i2.StatusID = '{GUID_нужного_состояния}'
[/sql]

Добрый день. А где триггеры писать? В каком скрипте?

Триггеры пишутся в базе данных.

Показать все комментарии