Связка при импорте из 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();
}
Нравится
Здравствуйте, Ирина,
Предлагаю решить задачу на уровне БД.
Получить данные с 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();