Изменение значения поля в реальном времени

Здравствуйте,

Столкнулся с проблемой:

В разделе счета добавил новое поле, которое вычисляется путем вычитания из поля "сумма оплаты" поле "сумма в б.в."

Суть проблемы:

Значение нового поля вычисляется только, если в него попытаться что-нибудь вписать. А поля курс, сумма в б.в., сумма вычисляются в реальном времени при изменении одного из полей.

Подскажите куда копать?

ПС: Я этот вопрос задавал тех. поддержке, по e-mail, но они не отвечают. Входит ли такой вопрос в пакет тех. поддержки?

Нравится

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

"Михнюк Иван" написал:новое поле, которое вычисляется путем вычитания из поля "сумма оплаты" поле "сумма в б.в."

в скрипте датасета/карточки написали расчет значения?

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

см функцию function DataChange(DataField) в ds_InvoiceScript

Иван, добрый день.

Реализация зависит от того, каким образом Вы добавили поле: с помощью механизма пользовательских полей или вручную создали его в таблице, запросе и датасете раздела. Если Вы его создали с помощью механизма пользовательских полей или вручную как поле типа "Дробное число", изменять его значение необходимо при обработке события OnDatasetDataChange датасета раздела, или же при обработке аналогичного события в даталинке окна редактирования. Посмотрите, как это реализовано для других полей в скриптах ds_InvoiceScript и wnd_InvoiceEditScript.

Если Вы добавили это поле в датасет как вычисляемое, устанавливать ему значение необходимо при обработке события OnDatasetCalcFields. А вызвать это событие можно в том же обработчике OnDatasetDataChange при изменении полей, влияющих на Ваше поле. Например, так:

switch (FieldName) {
    ...
    case 'PaymentAmount':
        Dataset.CalcDataFields();
        break;
    ...
}

Отвечая на вопрос о Службе технической поддержки Terrasoft: да, Ваш вопрос вполне входит в любой из пакетов поддержки, и наши специалисты обязательно предоставят ответ на Ваше письмо. Заранее прошу прощения, если ответ не был предоставлен в сроки, соответствующие Вашему пакету поддержки: возможно, это произошло по техническим причинам.

Я его создал вручную, как поле типа "дробное число".
В ds_InvoiceScript / DataChange(DataField) вписал:

case ('PaymentDiff'):
			InvoiceScript.OnDataChangeDisabled = true;
			try {				
		  	    var BA = DataFields.ItemsByName('BasicAmount').Value;
		  	    var PA = DataFields.ItemsByName('PaymentAmount').Value;
				var PaymentDiff = CalcPD(PA, BA);
				SetFloatDataFieldWithRound(DataFields.ItemsByName('PaymentDiff'),
					PaymentDiff);
			}
			finally{
				InvoiceScript.OnDataChangeDisabled = false;
			}
			break;  

В scr_CurrencyUtils вписал:

function CalcPD(PA, BA) {
	var Result = PA - BA;
	return Result;
}

Написал в scr_CurrencyUtils ():

function RecalcBPDInDataset (Dataset, BasicFieldName, PAFieldName,
	BAFieldName) {
	var BasicAmount = Dataset.Values(BAFieldName);
	var PaymentAmount = Dataset.Values(PAFieldName);
	var PaymentDiff = CalcPD(PA, BA);
	var DataField = Dataset.DataFields(BasicFieldName);
	SetFloatDataFieldWithRound(DataField, PaymentDiff);
}

Я делал по аналогии с другими полями и в

function SelfOnDatasetDataChange(DataField) {
	DataChange(DataField);
}

Ничего не дописано или я перемешал 2 варианта выше?

Немного не понял, где Вы используете функцию RecalcBPDInDataset. В остальном вроде всё нормально.

Аналогично нужно сделать и для поля BasicAmount, так как при его изменении поле PaymentDiff тоже должно изменяться.

"Лабьяк Олег Игоревич" написал:

Спасибо, натолкнули на ошибку, нужно было написать не case ('PaymentDiff'), а case ('PaymentAmount')! Функцию RecalcBPDInDataset наверно нигде не использую, просто в scr_CurrencyUtils () были ещё похожие функции, сделал по аналогии.

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