Никак не могу понять следующее:
...........
case ('RateAB'):
var RateAB = ValAsFloat(DataFields.ItemsByName('RateAB'));
if (!ScriptObject.RateABCalculated){
ScriptObject.RateABCalculated = true;
try {
...........
Dataset.Values('BasicTotalAmount') = Price*Rate*(1-DiscountPercent/100)+DA_noTax+PK*(1-DiscountPercent/100)+AB;
Dataset.Values('BasicTaxAmount') = Price*0.18*Rate*(1-DiscountPercent/100) + Da_Tax+18*AB/100+18*PK/100;
Dataset.Values('TotalBasicAmountWithTax') = Price*Rate*(1-DiscountPercent/100) + Price*0.18*Rate*(1-DiscountPercent/100) +DostAmount+AB+PK+0.18*AB+0.18*PK;
//Dataset.Values('TotalAmount') = Price*(1-DiscountPercent/100)+PK2-PK2*DiscountPercent/100+AB2;
}
}
finally {
ScriptObject.RateABCalculated = false;
}
break;
}
}
При изменении поля RateAB все правильно считает, как только снимаю кооментарий со строки
она срабатывает только один раз т.е. допустим в RateAB надо ввести 10, но TotalAmount пересчитывается только при вводе первой цифры 1. Такое случается в разных case-ах, у кого какие мысли?
Нравится
А что происходить в обработчике case ('TotalAmount')? Изменяется в нем значение ScriptObject.RateABCalculated?
значение ScriptObject.RateABCalculated в нем не изменяется
пробовал вообще комментировать case ('TotalAmount'), тоже самое.
Попробуйте значение 'TotalAmount' реализовать в case 'DiscountAmount' и 'BasicTotalAmount', в зависимости от соответствующих полей, вместо использования формулы
[javascript]
//Dataset.Values('TotalAmount') = Price*(1-DiscountPercent/100)+PK2-PK2*DiscountPercent/100+AB2;
[/javascript]
В том-то и дело, что все поля взаимосвязанные, значение 'TotalAmount' зависит от напрямую и от RateAB. Просто не могу понять суть проблемы, почему так происходит.
Вы же в зависимости от RateAB подсчитываете BasicTotalAmount. Разве этого не достаточно, чтобы при изменении поля BasicTotalAmount пересчитать TotalAmount с учетов курса?
Обратите внимание на подобные места в скрипте:
[javascript]
if (!ScriptObject.RateABCalculated){
ScriptObject.RateABCalculated = true;
[/javascript]
и Вы поймете, когда "включается" пересчет других полей, а когда нет.
Так и поступил
[javascript]
case ('BasicTotalAmount'):
var BasicTotalAmount = ValAsFloat(DataFields.ItemsByName('BasicTotalAmount'));
if (!ScriptObject.BasicTotalAmount){
ScriptObject.BasicTotalAmount = true;
try {
var Price = Dataset.Values('Price');
var DiscountPercent = Dataset.Values('DiscountPercent');
var PK = Dataset.Values('PK');
var AB = Dataset.Values('AB');
var AB2 = 0;
if (AB > 0 ) {
var AB2 = 0.6
}
var PK2 = 0;
if (PK > 0){
var PK2 = 3;
}
Dataset('TotalAmount') = Price*(1-DiscountPercent/100)+PK2-PK2*DiscountPercent/100+AB2;
}
finally {
ScriptObject.BasicTotalAmount = false;
}
break;
}
[/javascript]
результат тотже, а можно поподробней насчет
[javascript]
if (!ScriptObject.RateABCalculated){
ScriptObject.RateABCalculated = true;
[/javascript]
Вместо [javascript]
Dataset('TotalAmount') =
[/javascript]
лучше использовать функцию
[javascript]
SetFloatDataFieldWithRound(DataField, Value) (описана в scr_DB)
[/javascript]
и значения для временных пересенных получайте так:
[javascript]
var X = ValAsFloat(DataFields.ItemsByName('X'));
[/javascript]
а не
[javascript]
var Х = Dataset.Values('Х');
[/javascript]
Попробывал Ваш вариент - результат тотже, поле пересчитывается при вводе только первой цифры
Еще раз хочу уточнить, почему Вы, имея значение BssicTotalAmount подсчитываете TotalAmount по какой-то формуле, а не с помощью функции [javascript]
function CalcNonBasicSum(BasicSum, Rate)
[/javascript]?
Грубо говоря, зачем сложная формула вместо того, чтобы BasicTotalAmount разделить на курс?
В скольких case Вы пересчитываете TotalAmount? И какая логика реализована в case('TotalAmount')?
в одном, case('TotalAmount') вообще сейчас закоментировал
Судя по формуле, TotalAmount зависит от Price и DiscountPercent (а почему не DiscountAmount?). Попробуйте в case этих полей реализовать пересчет TotalAmount.
Павел, в таких случаях, когда происходят некоторые вычисления и не удается определить, где именно и по какой причине не осуществляется нужный пересчет, необходимо использовать отладчик, чтобы увидеть весь код, который срабатывает при изменении в некотором поле. Это позволит окончательно и однозначно установить причины непонятного результата вычислений. По вопросам отладки на форуме есть немало материалов, воспользовавшись поиском, Вы легко найдете нужный.