Никак не могу понять следующее:
...........
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', в зависимости от соответствующих полей, вместо использования формулы
//Dataset.Values('TotalAmount') = Price*(1-DiscountPercent/100)+PK2-PK2*DiscountPercent/100+AB2;
В том-то и дело, что все поля взаимосвязанные, значение 'TotalAmount' зависит от напрямую и от RateAB. Просто не могу понять суть проблемы, почему так происходит.
Вы же в зависимости от RateAB подсчитываете BasicTotalAmount. Разве этого не достаточно, чтобы при изменении поля BasicTotalAmount пересчитать TotalAmount с учетов курса?
Обратите внимание на подобные места в скрипте:
if (!ScriptObject.RateABCalculated){ ScriptObject.RateABCalculated = true;
и Вы поймете, когда "включается" пересчет других полей, а когда нет.
Так и поступил
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; }
результат тотже, а можно поподробней насчет
if (!ScriptObject.RateABCalculated){ ScriptObject.RateABCalculated = true;
Вместо
Dataset('TotalAmount') =
лучше использовать функцию
SetFloatDataFieldWithRound(DataField, Value) (описана в scr_DB)
и значения для временных пересенных получайте так:
var X = ValAsFloat(DataFields.ItemsByName('X'));
а не
var Х = Dataset.Values('Х');
Попробывал Ваш вариент - результат тотже, поле пересчитывается при вводе только первой цифры
Еще раз хочу уточнить, почему Вы, имея значение BssicTotalAmount подсчитываете TotalAmount по какой-то формуле, а не с помощью функции
function CalcNonBasicSum(BasicSum, Rate)
?
Грубо говоря, зачем сложная формула вместо того, чтобы BasicTotalAmount разделить на курс?
В скольких case Вы пересчитываете TotalAmount? И какая логика реализована в case('TotalAmount')?
в одном, case('TotalAmount') вообще сейчас закоментировал
Судя по формуле, TotalAmount зависит от Price и DiscountPercent (а почему не DiscountAmount?). Попробуйте в case этих полей реализовать пересчет TotalAmount.
Павел, в таких случаях, когда происходят некоторые вычисления и не удается определить, где именно и по какой причине не осуществляется нужный пересчет, необходимо использовать отладчик, чтобы увидеть весь код, который срабатывает при изменении в некотором поле. Это позволит окончательно и однозначно установить причины непонятного результата вычислений. По вопросам отладки на форуме есть немало материалов, воспользовавшись поиском, Вы легко найдете нужный.