Добрый день,

Мне необходимо обновлять значение поля ккрточки, при добавлении/удалении записей из вложенного в карточку грида.
Не могу добиться обновления поля при выборе удаления всех записей из грида.

вот мой код:

function amiDeleteAllOnExecute(ActionMenuItem, Sender) {
   scr_BaseGridArea.amiDeleteAllOnExecute(ActionMenuItem, Sender);
   var TotalTranslations = CalcTranslations(NShowID);
   SendNotifyForChangeParentField(TotalTranslations);
}

При базовой функции
scr_BaseGridArea.amiDeleteAllOnExecute(ActionMenuItem, Sender);
должно появляться сообщение о подтверждении, затем прогресс.

По идее, это все должно произойти до выполенения
var TotalTranslations = CalcTranslations(NShowID);
SendNotifyForChangeParentField(TotalTranslations);

Но происходит наоборот, и получается, что значение пересчитываемого поля остается прежним, а должно быть 0.
Я могла бы просто присвоить 0, но вдруг пользователь в подтверждающем сообщении откажется от удаления записей, и тогда поле не должно быть 0.

Подскажите, как это обойти.

Заранее благодарю.

Нравится

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

Вот больше вам нечего делать в 16.52 в предверии 8-го марта, кроме как сидеть на этом форуме :) С наступающим вас :)
Теперь по делу. В scr_BaseGridArea в функции amiDeleteAllOnExecute есть строка

var ShowModal = false;

Может ее заменить на

var ShowModal = (Self.Attributes('DeleteAllInModalMode') == true);

и передавать параметр DeleteAllInModalMode родительской карточки.

А может просто сделать поле TotalTranslations подзапросом?

Спасибо за поздравление :) !!!

Изменила код:

function amiDeleteAllOnExecute(ActionMenuItem, Sender) {
   SetAttribute(Self, 'DeleteAllInModalMode', true);
   scr_BaseGridArea.amiDeleteAllOnExecute(ActionMenuItem, Sender);
   var TotalTranslations = CalcTranslations(NShowID);
   SendNotifyForChangeParentField(TotalTranslations);
}

Добавила строку в стандартную функцию, как Вы описали.
1) Появляется диалог для подтверждения - кликаю ОК, и зависает окошечко с надписью "Идет процесс...". Нажимаю на единственную кнопочку "Закрыть" и все, ничего не удалилось((

2) А каким образом такое изменени отразится на других окнах, где нет параметра "DeleteAllInModalMode"?

1) Да, действительно как-то оно странно работает. И вообще, это удаление с прогрессом странно сделано. Я бы его немного подправил.

В scr_BaseGridArea меняем

function wnd_BaseGridAreaOnNotify(ScriptableService, Sender, Message, Data) {
//...
	if (Message == MSG_DELETEALL) {
		DeleteAllRecordsFromOpenedDataset(Sender, Self, BaseGridArea, 
			dlData.Dataset);
	}
}
 
 
function amiDeleteAllOnExecute(ActionMenuItem, Sender) {
	var Caption = '';
	var Prompt = '';
	var WithCancel = false; // For DeleteAll progress window WithCancel parameter is not used
	var ShowModal = Self.Attributes('DeleteAllInModalMode');
	var ProgressWindowType = pwt_DeleteAll;
	var ProgressWindow = BeginProcessingProgress(Self, Caption, Prompt,
		WithCancel, ShowModal, ProgressWindowType);
	if (!ShowModal) {
		SetAttribute(ProgressWindow, 'NotifyObject', Self);
		SetPromptForProcessingProgress(Self, ProccessingHelp, '',
			ProgressWindowType);
		SetCaptionForProcessingProgress(Self, ProccessingCaption, '', 
			ProgressWindowType);
	}
}

В scr_Processings пишем

function InternalBeginProcessingProgress(ProcessingProgressWindow, Window, 
	Caption, Prompt, ShowModal) {
	if (ShowModal){
		ProcessingProgressWindow.Attributes('NotifyObject') = Window;
	}
	//...
}

2) Отразится не должно - там же ShowModal будет false.

Теперь совсем ничего не происходит, даже не появляется диалог с подтверждением на удаление записей...
Вроде, все исправила, как Вы описали. У Вас работает?

Работает. Но посмотрев внимательно я понял, что можно еще немного все улучшить. В итоге у меня получилось следующее

function wnd_BaseGridAreaOnNotify(ScriptableService, Sender, Message, Data) {
	//...
	if (Message == MSG_DELETEALL) {
		DeleteAllRecordsFromOpenedDataset(Sender, Self, BaseGridArea, 
			dlData.Dataset);
	}
}
 
function amiDeleteAllOnExecute(ActionMenuItem, Sender) {
//Вот так все сократилось. Проверил - работает и для содального и для немодального режимов.
	var WithCancel = false; // For DeleteAll progress window WithCancel parameter is not used
	var ShowModal = Self.Attributes('DeleteAllInModalMode');
	var ProgressWindow = BeginProcessingProgress(Self, ProccessingCaption, 
		ProccessingHelp, WithCancel, ShowModal, pwt_DeleteAll);
}
 
function InternalBeginProcessingProgress(ProcessingProgressWindow, Window, 
	Caption, Prompt, ShowModal) {
	ProcessingProgressWindow.Attributes('NotifyObject') = Window;
	if (ShowModal) {
		ProcessingProgressWindow.ShowModal();
	} else {
	    ProcessingProgressWindow.Show();
	}
	//Далее первые две строки понятно зачем, но для ShowModal они не отработают. Переносить их в начало функции нельзя - OnNotify почему-то не отрабатывает, если еще не было показа окна. Т.о. первый раз заголовок и промпт будут не правильный.  Зачем нужна третья строка я так и не понял. Возможно ее можно и удалить, но на всякий случай я ее оставил.
	ProcessingProgressWindow.Notify(Window, MSG_SetCaptionProgress, Caption);
	ProcessingProgressWindow.Notify(Window, MSG_SetPromptProgress, Prompt);
	ProcessingProgressWindow.Notify(Window, MSG_BeginProcessingProgress, null);
	return(ProcessingProgressWindow);
}

Сейчас работает. Спасибо за помощь :)

Заходите, если что :)

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