Здравствуйте!
Подскажите в таком вопросе.
Есть функция,
...//Выполняем вычисления
...//Вставляем записи в Detail
}
которая в зависимости от вычислений делает обновления и добавляет новые записи в разные Детали.
Вызываем её на строке грида
var MyDataset = dlData.Dataset;
OneRecord(MyDataset );
}
Все работает на данной выделенной строке.
А каким образом можно выделив более одной строки в гриде, заставить эту функцию отработать все выделенные строки? Пока она это делать не может.
Нравится
Выделить больше одной строки можно с помощью клавиш Ctrl и Shift
Ctrl - выбирает только те строки, которые вы щелкаете при нажатой клавише (так же Ctrl выполняет функцию "Перейти к", если щелкните на поле типа Lookup. Так что будьте осторожны)
Shift - выделит все строки между текущей выделенной и той, которую вы щелкните.
Функцию попробуйте переписать так:
function aOneRecordOnExecute(ActionMenuItem, Sender) { var SelectedIDs = grdData.SelectedIDs.CommaText.split(','); var MyDataset = Services.GetNEwItemByUSI(dlData.Dataset.USI); for(var i=0;i<SelectedIDs.length;++i) { MyDataset.Close(); ApplyDatasetFilter(MyDataset, 'ID', SelectedIDs[i], true); MyDataset.Open(); OneRecord(MyDataset); } }
Переделал функцию по вышеописанному способу: при отработке дебаггер пишет "grdData - Определение отсутствует". Насколько я понял не может достучаться до грида.
Функция находится в отдельном скрипте scr_OneRecord.
wnd_OneRecord, в котором находится грид лежит рядом. Как достучаться до grdData?
Пробовал так:
var wndOneRecord= Services.GetNewItemByUSI('wnd_OneRecord'); var SelectedIDs = wndOneRecord.grdData.SelectedIDs.CommaText.split(',');
Но в этом случае выдает ошибку: " 'grdData.SelectedIDs' - есть null или не является объектом".
Не понимаю, в своем варианте вы берете dlData, значит достукиваетесь до элементов окна. Проверьте, может они по другому у вас названы. Если же нет, то должен помочь этот скрипт (если все окна унаследованы от базовых):
function aOneRecordOnExecute(ActionMenuItem, Sender) { var MainWindow = Connector.Attributes('MainWindow'); var WorkspaceWindow = MainWindow.ComponentsByName('wndWorkspace').Window; var GridWindow = WorkspaceWindow.ComponentsByName('wndGridData').Window; var grdData = GridWindow.ComponentsByName('grdData'); //var dlData = GridWindow.ComponentsByName('dlData'); //если нельзя будет достучаться до dlData var SelectedIDs = grdData.SelectedIDs.CommaText.split(','); var MyDataset = Services.GetNewItemByUSI(dlData.Dataset.USI); for(var i=0;i<SelectedIDs.length;++i) { MyDataset.Close(); ApplyDatasetFilter(MyDataset, 'ID', SelectedIDs[i], true); MyDataset.Open(); OneRecord(MyDataset); } }
Выполняю действие (меняю статус) для выделенных строк грида Накладных:
var SelectedIDs = grdData.SelectedIDs.CommaText.split(','); var Dataset = dlData.Dataset; for(var i=0;i<SelectedIDs.length;++i) { Dataset.Close(); ApplyDatasetFilter(Dataset, 'ID', SelectedIDs[i], true); Dataset.Open(); var GotNoError = true; with (Dataset) { try { DisableEvents(); Edit(); Values(FieldName) = ToValue; //Set a new value Post(); } catch (err) { GotNoError = false; if (State == dstEdit) { //Rollback if still in Edit state Cancel(); } } finally { EnableEvents(); } } }
Но, статус Накладной меняется только для 1 накладной.
Подскажите что не хватает, чтобы статус Накладных поменялся для выделенных строк в гриде?
Возможно не сбрасывается старый фильтр, попробуйте:
Dataset.Close(); EnableDatasetFilters(Dataset, false); ApplyDatasetFilter(Dataset, 'ID', SelectedIDs[i], true);
И кстати, лучше создайте новый экземляр датасета, а не тот, который сейчас привязан к гриду.