Добрый день, коллеги.

Пытаюсь решить одну проблему и столкнулся со странным поведением системы.

В нашей системе часто используется функционал загрузки данных из Excel. Наши клиенты присылают нам разнообразные данные, от банка приходит выписка в таком формате.
Загрузка данных с чтением из каждой ячейки - это медленный процесс, особенно если ячеек много.
Существует возможность сохранить диапазон листа Excel в массив и потом уже работать с массивом, что значительно ускоряет процесс. Но к сожалению, массив получается какой то странный и нормально обратиться к нему не получается. Кто нибудь сталкивался с подобной проблемой и есть ли решение?

Код примерно такой:

var ExlApp = new ActiveXObject("Excel.Application");
var WorkBook = ExlApp.Workbooks.Open(FileName);
var Sheet = WorkBook.Sheets(1);
var BankData = Sheet.UsedRange.Value;
// Вот здесь BankData и есть тот самый массив, но обратится к нему проблематично
// var Value = BankData[2][2] выдает ошибку о том что объект есть null или не является объектом
// да и BankData имеет тип Unknown. Хотя в студии его структура видна и данные как бы есть.

WorkBook.Close(false);
ExlApp.Quit();
delete ExlApp;

Возможно этот псевдомассив можно как-то в javascript сконвертировать в нормальный.
Буду благодарен, если найдется решение.

Нравится

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

Добрый день!
Это не мессив. В MSDN есть вся информация.
Sheet.UsedRange возвращает тип Range
Здесь все об этом типе
Такие вещи очень хорошо поискать снача в MSDN, а после можно найти решение на Stackoverflow

Я не писал что Sheet.UsedRange это массив.
А вот Sheet.UsedRange.Value возвращает массив, с которым чудесно можно работать в Delphi например.
Быстрая обработка данных Excel в Delphi
Благодарю за ссылку на MSDN :)

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

Коллеги, нужен совет!

Имеем COM Visible класс на C# .Net 3.5, в котором имеется массив значений
Из-под админки Terrasoft на debbuger я могу видить структуру этого массива и значения.... а вот доступ получить не удается
Как-то так: Instant.Items(1) или так Instant.Items[1] - ошибка и все тут!

Как описать этот массив в C#, что бы достучаться до него из JScript ?

Спасибо!

Нравится

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

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

А так?
Что бы получить доступ, добавьте Set аксессор.

public class Test
{
    /// <summary>
    /// String array field instance.
    /// </summary>
    string[] _elements = { "one", "two", "three" };
 
    /// <summary>
    /// String array property getter.
    /// </summary>
    public string[] Elements
    {
	get { return _elements; }
    }
 
    /// <summary>
    /// String array indexer.
    /// </summary>
    public string this[int index]
    {
	get { return _elements[ index] ; }
    }
}

Дмитрий, спасибо!

Вот этого нам и не хватало:

public string this[int index]
    {
        get { return _elements[ index] ; }
    }

:smile:

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

Версия CRM 3.3.2.127. Бизнес процесс.

В "параметры диаграммы" задаю три массива. В цикле считываю эти параметры. Проблема в том, что первый раз нужный мне массив AccountIDCurrent содержит 3 элемента, эти элементы правильные, а при втором/третьем и т. д. входе в цикл мой массив стирается, в нем ноль элементов. Сама я их нигде не обнуляю. В чем может быть причина?

параметры диаграммы
сам процесс

Заполняю массивы:

function Item3OnExecute(ScriptItem, IsComplete) {
        // скрипт до задачи
        ...
        WFSetParamValue(Diagram, 'GlobalCount', CountTask); // 3.4.0.49
       
        for (var i = 0; i BidAccountIDs.length; i++) {
                WFSetParamValue(Diagram, 'AccountIDCurrent', BidAccountIDs[i], "ArrayBid");
        }
        for (var i = 0; i BidContactIDs.length; i++) {  
                WFSetParamValue(Diagram, 'ContactIDCurrent', BidContactIDs[i], "ArrayBid");
        }
        for (var i = 0; i BidIDs.length; i++) {  
                WFSetParamValue(Diagram, 'BidIDCurrent', BidIDs[i], "ArrayBid");
        }
}

Считываю:

function Action4OnBeforeExecute(ActionItem) { //debugger // 2011
        // 1 раз помнит массив, след разы - 0 значений
        //Diagram = GetDiagramByItem(ActionItem);
        GlobCount = WFGetParamValue(Diagram, 'GlobalCount');
        GlobCountTask = WFGetParamValue(Diagram, 'GCT');
        if (GlobCountTask >= 0) {
                AccountIDCurrentScr =
                        WFGetParamValue(Diagram, 'AccountIDCurrent', "", GlobCountTask, GlobCount);
                ContactIDCurrent = WFGetParamValue(Diagram, 'ContactIDCurrent');
                BidIDCurrent = WFGetParamValue(Diagram, 'BidIDCurrent');
        }
}

где Diagram - это

function wd_BidExecute3OnBeforeItemExecute(DiagramItem) {
        // основной скрипт БП
        Diagram = GetDiagramByItem(DiagramItem);
        ...
}

Заранее спасибо за ответ.

правильно
неправильно

Нравится

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

а можно для теста получить сервисы диаграммы и скрипта?

Как вариант для решения задачи можно попробывать использовать StringList, преобразовывать и передавать его в параметр типа строки

"Яворский Алексей" написал:Как вариант для решения задачи можно попробывать использовать StringList, преобразовывать и передавать его в параметр типа строки

Если есть массивы, хотелось бы их и использовать :)

"просто Алексей" написал:а можно для теста получить сервисы диаграммы и скрипта?

Конечно :) Еще выложила Заявку, она используется в БП. Архив

Есть у меня мысль, что надо создавать датасет, но правильно ли это?

Предлагаю обратить внимание на тему http://www.community.terrasoft.ru/forum/topic/4566

[quote="Яворский Алексей"]Предлагаю обратить внимание на тему http://www.community.terrasoft.ru/forum/topic/4566[/quote]
Я видела эту тему, там нет решения.

Данный вопрос передан в департамент разработки, ориентировочный срок ответа 28.10.2011

Спс :)

Забыла дописать. Еще добавляла:

function WFGetParamValueDirect(Parameters, ParamName, DefaultValue, NumberTask, GlobCount) {
	if (ParamName == "AccountIDCurrent"	 || ParamName == "ContactIDCurrent"	
		|| ParamName == "BidIDCurrent") 
	{
		if (GlobCount != 0) {
				return Parameters.ItemsByName(ParamName).Value.Items(NumberTask);
		}
...

"Яворский Алексей" написал:Данный вопрос передан в департамент разработки, ориентировочный срок ответа 28.10.2011

Когда примерно будет ответ? Или как-то пытаться переписать, не используя массивы?

Данный вопрос требует больше времени, ориентировочный срок ответа 08.11.2011, на данный момент советую Вам воспользоваться обходным решением

Доработка выполнена, изменения войдут в сборку 3.3.2.241

Спасибо :)

Анна, добрый день!

Сообщаю, что сборка бинарных файлов 3.3.2.241 уже выпущена.
Чтобы получить ссылку для загрузки соответствующих файлов, пожалуйста, направьте запрос в службу технической поддержки на e-mail support@tscrm.com.

Спасибо.

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