Здравствуйте,
Столкнулся с проблемой:
В разделе счета добавил новое поле, которое вычисляется путем вычитания из поля "сумма оплаты" поле "сумма в б.в."
Суть проблемы:
Значение нового поля вычисляется только, если в него попытаться что-нибудь вписать. А поля курс, сумма в б.в., сумма вычисляются в реальном времени при изменении одного из полей.
Подскажите куда копать?
ПС: Я этот вопрос задавал тех. поддержке, по e-mail, но они не отвечают. Входит ли такой вопрос в пакет тех. поддержки?
Нравится
"Михнюк Иван" написал:новое поле, которое вычисляется путем вычитания из поля "сумма оплаты" поле "сумма в б.в."
в скрипте датасета/карточки написали расчет значения?
"Михнюк Иван" написал:поля курс, сумма в б.в., сумма вычисляются в реальном времени при изменении одного из полей.
см функцию function DataChange(DataField) в ds_InvoiceScript
Иван, добрый день.
Реализация зависит от того, каким образом Вы добавили поле: с помощью механизма пользовательских полей или вручную создали его в таблице, запросе и датасете раздела. Если Вы его создали с помощью механизма пользовательских полей или вручную как поле типа "Дробное число", изменять его значение необходимо при обработке события OnDatasetDataChange датасета раздела, или же при обработке аналогичного события в даталинке окна редактирования. Посмотрите, как это реализовано для других полей в скриптах ds_InvoiceScript и wnd_InvoiceEditScript.
Если Вы добавили это поле в датасет как вычисляемое, устанавливать ему значение необходимо при обработке события OnDatasetCalcFields. А вызвать это событие можно в том же обработчике OnDatasetDataChange при изменении полей, влияющих на Ваше поле. Например, так:
[javascript]
switch (FieldName) {
...
case 'PaymentAmount':
Dataset.CalcDataFields();
break;
...
}
[/javascript]
Отвечая на вопрос о Службе технической поддержки Terrasoft: да, Ваш вопрос вполне входит в любой из пакетов поддержки, и наши специалисты обязательно предоставят ответ на Ваше письмо. Заранее прошу прощения, если ответ не был предоставлен в сроки, соответствующие Вашему пакету поддержки: возможно, это произошло по техническим причинам.
Я его создал вручную, как поле типа "дробное число".
В ds_InvoiceScript / DataChange(DataField) вписал:
[javascript]
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;
[/javascript]
В scr_CurrencyUtils вписал:
[javascript]
function CalcPD(PA, BA) {
var Result = PA - BA;
return Result;
}
[/javascript]
Написал в scr_CurrencyUtils ():
[javascript]
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);
}
[/javascript]
Я делал по аналогии с другими полями и в
[javascript]
function SelfOnDatasetDataChange(DataField) {
DataChange(DataField);
}
[/javascript]
Ничего не дописано или я перемешал 2 варианта выше?
Немного не понял, где Вы используете функцию RecalcBPDInDataset. В остальном вроде всё нормально.
Аналогично нужно сделать и для поля BasicAmount, так как при его изменении поле PaymentDiff тоже должно изменяться.
"Лабьяк Олег Игоревич" написал:
Спасибо, натолкнули на ошибку, нужно было написать не [javascript]case ('PaymentDiff')[/javascript], а [javascript]case ('PaymentAmount')[/javascript]! Функцию RecalcBPDInDataset наверно нигде не использую, просто в scr_CurrencyUtils () были ещё похожие функции, сделал по аналогии.