Изменения значение поля в обработчике изменения

Здравствуйте!
Помогите, пожалуйста, решить проблему.

Пытаюсь сделать так: при изменении ответственного задачи, проверяется, не в отпуске ли новоустановленный ответственный, и если он в отпуске - вместо него подставляется заместитель.

Как пытаюсь реализовать: в обработчике dlDataOnDatasetDataChange(DataField) на изменение поля OwnerID

В итоге не работает.

...
switch (DataFieldName){
                case ('OwnerID'):
                        var TaskDataset = dlData.Dataset;
                        var OwnerID     = dlData.Dataset.Values('OwnerID');
                        var NewOwner = getAssistanteIfExist(OwnerID);
                        dlData.Dataset('OwnerID') = NewOwnerID; // не присваивает!!!
                        //edtOwner.DataField.Value = NewOwnerID; // так тоже не присваивает
                        //DataField.Value = OwnerID; // и так не присваивает
                        break;
...

NewOwnerID получаю правильный.
При дебаге показывает, что оно, вроде бы, присваивается, но при этом в лукапконтроле не отображается.

Подскажите, где копать ошибку.

Нравится

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

Ошибка вызвана тем, что заполняя значение поля "Ответственный" ('OwnerID') в блоке case ('OwnerID') Вы вызываете зацикливание.
Попробуйте модифицировать Ваш код подобным образом:

case ('OwnerID'):		
 if (TaskEdit.EditOwner != true) {  
	var OwnerID = dlData.Dataset.Values('OwnerID');
        var NewOwnerID = getAssistanteIfExist(OwnerID);                        
              if (!IsEmptyValue(NewOwnerID)){
                           TaskEdit.EditOwner = true;
                            edtOwner.DataField.Value = NewOwnerID; 
                            return;
             }
    	} 
 TaskEdit.EditOwner = false; 
 break;
switch (DataFieldName){
   case ('OwnerID'):
   var OwnerID     = dlData.Dataset('OwnerID');
   var NewOwner = getAssistanteIfExist(OwnerID);
   if (!IsEmptyValue(NewOwnerID)){
      dlData.Dataset.DisableEvents();
      dlData.Dataset('OwnerID') = NewOwnerID;
      dlData.Dataset.EnableEvents();
   }
   break;

или так:)

"Бондарь Наталия" написал:Ошибка вызвана тем, что заполняя значение поля "Ответственный" ('OwnerID') в блоке case ('OwnerID') Вы вызываете зацикливание.

Увы, ваши варианты не очень подходят, поскольку надо проверить, не находится ли новоявленный заместитель сам в отпуске.
Немного исправил, зацикливание не при чём. При таком коде зацикливания не происходит, но значение не сохраняется.

...
switch (DataFieldName){
                case ('OwnerID'): 
                        var TaskDataset = dlData.Dataset;
                        var OwnerID     = dlData.Dataset.Values('OwnerID');
                        if(IsNotActive(OwnerID))
                        {
                                                var NewOwner = getAssistanteIfExist(OwnerID);
                                                dlData.Dataset('OwnerID') = NewOwnerID; // не присваивает!!!
                        }
                        break;
...

"netlander" написал:NewOwnerID получаю правильный.
При дебаге показывает, что оно, вроде бы, присваивается, но при этом в лукапконтроле не отображается.

Если NewOwnerID получаете правильно и его значение присваивается полю 'OwnerID', но не отображается, следовательно значение поля перезаписывается в каком-то другом месте/событии.
Попробуйте пройтись отладчиком и отловить в какой момент перезаписывается значение поля 'OwnerID'.

Новое значение просто не записывается.
Попробуйте вот такой код:

скрипт scr_TaskEdit

...
switch (DataFieldName){
                case ('OwnerID'): 
                              dlData.Dataset.DisableEvents();
                              dlData.Dataset('OwnerID') = <ID ЛЮБОГО КОНТАКТА>;
                              dlData.Dataset.EnableEvents();
                              break;
}
...

Значение тупо не меняется.
Хххеееелп.

Может вам подойдет вариант замены ответственного не в момент его простановки, а в момент перед сохранением записи на событие OnBeforePost?

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