Выполнить действие по выделенным строкам

Здравствуйте!

Подскажите в таком вопросе.
Есть функция,

function OneRecord(MyDataset ) {
...//Выполняем вычисления
...//Вставляем записи в Detail
}

которая в зависимости от вычислений делает обновления и добавляет новые записи в разные Детали.
Вызываем её на строке грида
function aOneRecordOnExecute(ActionMenuItem, Sender) {
        var MyDataset = dlData.Dataset;
        OneRecord(MyDataset );     
}

Все работает на данной выделенной строке.
А каким образом можно выделив более одной строки в гриде, заставить эту функцию отработать все выделенные строки? Пока она это делать не может.

Нравится

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

Выделить больше одной строки можно с помощью клавиш 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);

И кстати, лучше создайте новый экземляр датасета, а не тот, который сейчас привязан к гриду.

Никакие манипуляции с фильтрами не помогли.
Помогло, когда вместо

 var Dataset = dlData.Dataset; 

стал использовать

 var Dataset = Services.GetNewItemByUSI('ds_OfferingMovement')
Показать все комментарии