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

amiDeleteAllOnExecute

Добрый день,

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

вот мой код:

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 есть строка

[javascript]
var ShowModal = false;
[/javascript]

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

[javascript]
var ShowModal = (Self.Attributes('DeleteAllInModalMode') == true);
[/javascript]

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

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

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

Изменила код:
[javascript]
function amiDeleteAllOnExecute(ActionMenuItem, Sender) {
SetAttribute(Self, 'DeleteAllInModalMode', true);
scr_BaseGridArea.amiDeleteAllOnExecute(ActionMenuItem, Sender);
var TotalTranslations = CalcTranslations(NShowID);
SendNotifyForChangeParentField(TotalTranslations);
}
[/javascript]

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

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

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

В scr_BaseGridArea меняем
[javascript]
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);
}
}
[/javascript]

В scr_Processings пишем

[javascript]
function InternalBeginProcessingProgress(ProcessingProgressWindow, Window,
Caption, Prompt, ShowModal) {
if (ShowModal){
ProcessingProgressWindow.Attributes('NotifyObject') = Window;
}
//...
}
[/javascript]
2) Отразится не должно - там же ShowModal будет false.

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

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

[javascript]
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);
}
[/javascript]

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

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

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