Добрый день,
Мне необходимо обновлять значение поля ккрточки, при добавлении/удалении записей из вложенного в карточку грида.
Не могу добиться обновления поля при выборе удаления всех записей из грида.
вот мой код:
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.
Подскажите, как это обойти.
Заранее благодарю.
Нравится
Вот больше вам нечего делать в 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); }