Связка при импорте из Excel в Terrasoft XRM 3.4

Добрый день,

Имеем таблицу контактов , размер таблицы ~ 262 тысячи записей.

Требуется создать им записи в таблице tbl_ContactCommunication.

При попытке обхода, на ~ 90 тысячах обойденных контактах скрипт валится с ошибкой Out Of Memory. Скрипт, обрабатывающий таблицу приведен ниже.
Как бы его модифицировать, чтобы он обошел всю таблицу?

Скрипт:

//-----------------------------------------------------------------------------
// scr_InitContactCommunication
//-----------------------------------------------------------------------------
var mailDS;

function addMail(ds){
if(ds.Values('Communication3') == null){
return;
}

mailDS.Append();

mailDS.Values('CommunicationTypeID') = '{7A628D16-D7D0-4979-B8BA-B64EF54A0366}';
mailDS.Values('Number') = ds.Values('Communication3');
mailDS.Values('Position') = 3;
mailDS.Values('ContactID') = ds.Values('ID');
mailDS.Values('IsPhone') = false;
mailDS.Values('CommunicationTypeName') = 'E-mail';

mailDS.Post();

}
function processDataset(ds){

while(! ds.IsEOF){
addMail(ds);
ds.GoToNext();
}

}

function initContactCareer(){
var contactDataset = GetSingleItemByCode('ds_Contact','init_mail');
mailDS = GetSingleItemByCode('ds_ContactCommunication');
mailDS.DisableEvents();
//var CreateDate = new Date

contactDataset.FetchRecordsCount = 1000;
contactDataset.Open();
processDataset(contactDataset);
contactDataset.Close();
mailDS.EnableEvents();
}

Нравится

4 комментария

Здравствуйте, Ирина,
Предлагаю решить задачу на уровне БД.
Получить данные с Excel файла можно следующим образом

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\test_excel\Book1.xls', [Sheet1$])

после чего вы получите все колонки с страницы Sheet1 файла Excel

Подразумевается, что есть провайдер Microsoft.Jet.OLEDB.4.0 (в Windows XP он точно есть)

Если вдруг вы получите ошибку

Msg 15281, Level 16, State 1, Line 1
SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online.

Выполните

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

Если все-таки необходимо сделать это в скрипте Террасофт, то периодически закрывайте датасет mailDS. Дело в том, что при Append|Post записи сохраняются в датасете (и висят в памяти). При закрытии датасета (Close()) память должна освободиться.

Спасибо всем большое. К сожалению пока ничего не решилось. Так как очень большой объем данных скрипт валится.

Так как у Вас данные всегда вставляются, то сделайте не через датасет, а через InsertQuery.
Создайте новый сервис для вставки данных в таблицу tbl_ContactCommunication, и используйте его подобно тому, как описано в документации:

	var ColumnsValues = InsertQuery.ColumnsValues;
	ColumnsValues.ItemsByName(IDCode).ValAsGUID = ID;
	ColumnsValues.ItemsByName(NameCode).ValAsStr = Name;
	InsertQuery.Execute();
Показать все комментарии