Здравствуйте,
Столкнулся с проблемой:
В разделе счета добавил новое поле, которое вычисляется путем вычитания из поля "сумма оплаты" поле "сумма в б.в."
Суть проблемы:
Значение нового поля вычисляется только, если в него попытаться что-нибудь вписать. А поля курс, сумма в б.в., сумма вычисляются в реальном времени при изменении одного из полей.
Подскажите куда копать?
ПС: Я этот вопрос задавал тех. поддержке, по e-mail, но они не отвечают. Входит ли такой вопрос в пакет тех. поддержки?
Нравится
"Михнюк Иван" написал:новое поле, которое вычисляется путем вычитания из поля "сумма оплаты" поле "сумма в б.в."
в скрипте датасета/карточки написали расчет значения?
"Михнюк Иван" написал:поля курс, сумма в б.в., сумма вычисляются в реальном времени при изменении одного из полей.
см функцию 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 () были ещё похожие функции, сделал по аналогии.