Логика 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', в зависимости от соответствующих полей, вместо использования формулы

//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 разделить на курс?

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

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

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

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

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

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