скрипт
Скрипты
Разработка

Логика DataChange

Никак не могу понять следующее:

function DataChange(DataField, ScriptObject){
...........
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 все правильно считает, как только снимаю кооментарий со строки
//Dataset.Values('TotalAmount') = Price*(1-DiscountPercent/100)+PK2-PK2*DiscountPercent/100+AB2;

она срабатывает только один раз т.е. допустим в RateAB надо ввести 10, но TotalAmount пересчитывается только при вводе первой цифры 1. Такое случается в разных case-ах, у кого какие мысли?

Нравится

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

А что происходить в обработчике 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 разделить на курс?

TotalAmount у меня несет совершенно друго смысл

В скольких case Вы пересчитываете TotalAmount? И какая логика реализована в case('TotalAmount')?

в одном, case('TotalAmount') вообще сейчас закоментировал

Судя по формуле, TotalAmount зависит от Price и DiscountPercent (а почему не DiscountAmount?). Попробуйте в case этих полей реализовать пересчет TotalAmount.

Павел, в таких случаях, когда происходят некоторые вычисления и не удается определить, где именно и по какой причине не осуществляется нужный пересчет, необходимо использовать отладчик, чтобы увидеть весь код, который срабатывает при изменении в некотором поле. Это позволит окончательно и однозначно установить причины непонятного результата вычислений. По вопросам отладки на форуме есть немало материалов, воспользовавшись поиском, Вы легко найдете нужный.

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