| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Modified на ComboBox
			 
			
			Задача. На форме выбирается тип договора (ComboBox). По его значению должен сгенерироваться и отобразиться номер договора. Проблема в том, что метод modified comboBox вызывется 2 раза (после selectionChange и leave). Соответственно, номерная серия расходуется в 2 раза быстрее.  
		
		
		
		
		
		
		
	Вопрос. Как сделать? Ax 3.0.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В active() сбрасываем некоторую логическую переменную (из ClassDeclaration), например, alreadyModified = false. При первом modified() выполняем логику, которая выполняется, если alreadyModified = false, после чего устанавливаем в true. Таким образом, при втором modified() логика уже не выполняется. Как-то так...
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Хм.. а просто на selectionChange повеситься нельзя?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: sashanka (1). | |
| 
			
			 | 
		#4 | 
| 
			
			 Moderator 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 MCITP 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Ещё хорошо бы проверить в нём, что значение действительно изменилось..  
		
		
		
		
		
		
			 
		
				__________________ 
		
		
		
		
	Zhirenkov Vitaly  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Про проверку помню  
		
		
		
		
		
		
		
	  На selectionChange вешать завтра на работе буду.
		 | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Почти такая же проблема возникла. Только у меня метод modifiedField на таблице.  
		
		
		
		
		
		
		
	X++: public void modifiedField(fieldId _fieldId) { ; super(_fieldId); switch (_fieldId) { case fieldnum(DiscountCard_Cards, CardType): if (this.RecId && this.CardType != this.orig().CardType) { if (this.canModifyCardType() && Box::okCancel("Будет удалена ссылка на сотрудника или клиента.", DialogButton::Ok) == DialogButton::Ok) this.modifyCardType(); else this.CardType = this.orig().CardType; } break; Можно тут как-нибудь извернуться?  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Проверки лучше всё же делать не в modifiedField, а в validateField  
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В ValidateField точно также два раза вызывается диалог... 
		
		
		
		
		
		
		
	X++: public boolean validateField(fieldId _fieldIdToCheck) { boolean ret; ret = super(_fieldIdToCheck); switch (_fieldIdToCheck) { case fieldnum(DiscountCard_Cards, CardType): if (this.RecId && this.CardType != this.orig().CardType) ret = ret && this.canModifyCardType() && Box::okCancel("Будет удалена ссылка на сотрудника или клиента.", DialogButton::Ok) == DialogButton::Ok; break; default: break; } return ret; }  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Eldar9x
			 
 
			Почти такая же проблема возникла. Только у меня метод modifiedField на таблице.  
		
	X++: public void modifiedField(fieldId _fieldId) { ; super(_fieldId); switch (_fieldId) { case fieldnum(DiscountCard_Cards, CardType): if (this.RecId && this.CardType != this.orig().CardType) { if (this.canModifyCardType() && Box::okCancel("Будет удалена ссылка на сотрудника или клиента.", DialogButton::Ok) == DialogButton::Ok) this.modifyCardType(); else this.CardType = this.orig().CardType; } break; Можно тут как-нибудь извернуться? 
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 
			
			canModifyCardType() это ведь все таки не проверки корректности заполнения поля, а проверка того, что можно вообще его менять. Хотя тут, действительно, в validateField оно логичней будет смотреться.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Lev, ValidateWrite тут не катит, потому что по запросу диалога, должны либо очиститься, либо не очиститься именно в момент изменения поля CardType.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			сомнительное решение, тк изменение поля еще не означает, что запись будет сохранена в таком виде, она может быть вообще не сохранена
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вобщем сделал через синглтон, переключающий свое состояние при очередном обращении.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А ссылка на сотрудника, которая "будет удалена" хранится в той же таблице и в той же записи? Может, заодно проверять тот факт, что она вообще существует? 
		
		
		
		
		
		
		
	X++: if (this.RecId && this.CardType != this.orig().CardType && "Существует ссылка")  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ну это как-то уже на костыль похоже будет. Тем более что проверять придется не одно поле. Тут как получается... Мы знаем, что ModifiedField по полю будет вызываться с формы всегда два раза. Если бы диалога не было, то можно было бы и закрыть глаза на это. Причем в стандарте так и делается. Либо делают this.write() после того как вызов произойдет - тогда orig() уже вернет другое значение и повторный вызов не произойдет. Но мне сохранять запись нельзя. Следовательно, нам остается каким-то образом просто отключить повторный вызов метода. Для этого используем обычный флаг.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
	
	 | 
	
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  |