Копировать Dataset в Dataset

Добрый день!

Подскажите, пожалуйста, правильный (наиболее эффективный в плане производительности) способ копирования данных из одного Dataset'a в другой, при условии, что копировать нужно все подряд данные, но только часть полей (объём данных достаточно большой).

Спасибо.

Нравится

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

А какая предыстория у этой задачи. То есть, какой функционал хотите реализовать?

Первый из датасетов создается динамически при импорте заявок из xml файлов. Второй - лог операций после обработки заявок из первого датасета, и привязан к физической таблице.

И другая задача (тоже ждет своей оптимизации) - первый датасет, сформированный на основе динамического фильтра, второй - таблица, в которую нужно сохранить результат фильтрации.

Ну если смотреть в сторону производительности, то я думаю в вашем случаю будет удобно использовать insertquery как в первой так и второй задаче.
Если ветка относится ко второй задаче, то я ответил по варианту получения текста запроса для обработки его результатов напрямую на сервере.

За подсказку с insertquery большое спасибо :)

Все же, а что если требуется скопировать и потом по некоторым полям тут же внести изменения?
(Все операции логируются, не хотелось бы выполнять Insert а потом Update, а перед вставкой модифицировать некоторые поля)?

Можно примерчик кода, пожалуйста?

Здравствуйте,
1)Например так :

function Main()
{
var ds_to = Services.GetNewItemByUSI('ds_to');
var ds_from = Services.GetNewItemByUSI('ds_from');
 
 
	ds_from.Open();
 
	ds_to.Open();
	while(!ds_from.IsEOF) {
	ds_to.Edit();
	ds_to('ID')  = ds_from('ID');
	ds_to('Name') = ds_from('Name');
	ds_to.Post();
	ds_to.Close();
	ds_from.GotoNext();
	}	
 
	ds_from.Close();
}

В случае если Вы хотите генерировать новые ID, используйте Connector.GenGUID();

ds_to('ID')  = Connector.GenGUID();

2) Второй способ, это подключить scr_DB и воспрользоваться функцией CopyFullData(SourceDataset, DestinationDataset)
При этом вы получите точную копию данных датасетов
Пример:

var ds_to = Services.GetNewItemByUSI('ds_to');
var ds_from = Services.GetNewItemByUSI('ds_from');
ds_to.Open();
ds_from.Open();
CopyFullData(ds_from, ds_to);

Спасибо, Алексей,

Я сделал комбинацию из функционала, реализованного в скрипте scr_DB и предложенного Вами.
Т.к. нужно было именно 1 операция сохранения для каждой записи с уже измененными значениями, а столбцов довольно много, чтобы их перебирать вручную по названиям.

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