Добрый день,
Мне необходимо обновлять значение поля ккрточки, при добавлении/удалении записей из вложенного в карточку грида.
Не могу добиться обновления поля при выборе удаления всех записей из грида.
вот мой код:
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 есть строка
[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]