AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.06.2006, 18:16   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1149 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент)
Уважаемые коллеги,

Поводом для организации данной ветки послужила дисскуссия отсюда: Какой способ для связи Axapta с Excel вы предпочитаете?

Так вот. Предлагается количественно сравнить скорость экспорта данных из Axapta в Excel при использовании различных способов выгрузки. Все желающие могут поучаствовать в эксперименте. Каждый участник выбирает свой любимый (или нелюбимый – как кому нравится) способ (или способы), «прогоняет» его (их) и вкратце информирует остальных о результатах своих изысканий (можно приложить джоб или проект). Если есть возможность проверить свои способы на разных по характеристикам компьютерах – всячески приветствуется!

Сравнение предлагается производить в сходных (по объему экспортируемых данных) условиях. Вот эти условия:

1. Выводим в Excel данные из двух связанных таблиц: LedgerTrans и LedgerTable.

2. Объем вывода – примерно 50 тысяч записей, 10 полей (список ниже).

3. В Аксапте данные получаем в цикле:
Код:
    LedgerTrans ledgerTrans;
    LedgerTable ledgerTable;
    int timeFullStart, timeFullFinish, timeFullTotal;
    ……………………………
    // засекаем время
    timeFullStart = timenow();
    ……………………………
    while select  ledgerTrans
            join  ledgerTable
            where ledgerTrans.AccountNum == ledgerTable.AccountNum
               && ledgerTrans.TransDate >= str2date('dd.mm.yy',123) && ledgerTrans.TransDate <= str2date('DD.MM.YY',123)
    {
            // 10 полей
            ledgerTrans.RecId  --- >  в Excel, столбец 1
            ledgerTrans.AccountNum --- >  в Excel, столбец 2
            ledgerTable.AccountName --- >  в Excel, столбец 3
            ledgerTable.AccountPlType  --- >  в Excel, столбец 4   
            ledgerTrans.BondBatchTrans_RU ) --- >  в Excel, столбец 5
            ledgerTrans.BondBatch_RU  --- >  в Excel, столбец 6
            ledgerTrans.TransDate  --- >  в Excel, столбец 7
            ledgerTrans.Txt  --- >  в Excel, столбец 8
            ledgerTrans.AmountMST  --- >  в Excel, столбец 9
            ledgerTrans.Crediting  --- >  в Excel, столбец 10
    }
    ……………………………
    timeFullFinish = timenow();
    timeFullTotal = timeFullFinish - timeFullStart;
    info('Время выполнения, сек');
    info(int2str(timeFullTotal));
4. Конкретная реализация алгоритма выгрузки в Excel – естественно, ваша. Куда данные пойдут из цикла – скажем, сразу напрямую в Excel или сначала во временную таблицу – тоже ваша забота.

5. Кол-во выгружаемых записей неявно «задается» путем выполненного заранее подбора начальной и конечной дат в запросе: dd.mm.yy и DD.MM.YY – вы просто подбираете себе такой конкретный диапазон дат, который бы возвращал из вашего LedgerTrans-a примерно 50000 записей (плюс-минус 2-3 тысячи – не вопрос!). Поскольку бизнесы у всех разные, то и разные по жизни темпы наполнения LedgerTrans-a. Про ваши конкретные даты вы, естественно, никому из нас не рассказываете (чтобы шпиёны не могли оценить интенсивность вашей бухгалтерии J) – если только сами не захотите.

6. Рассматриваем только выгрузку средствами самой Аксапты. Доступ напрямую к таблицам БД средствами СУБД (MS SQL Server или Oracle), минуя Аксапту – не рассматриваем.

7. Данные выводим в новую книгу Excel без форматирования, только строка заголовка и дальше данные (начиная с ячейки A2 J). Моментом окончанием исследуемого процесса считается появление всех данных в открытом окне Excel. Время последующего сохранения этой новой книги на диске не учитываем. Если же алгоритм построен так, что данные сначала выводятся на диск (например, как текстовый файл), то этот файл следует открыть и «предъявить» в открытом окне Excel – это время уже учитываем!

Какие результаты интересны? (обсуждаемо):

1. Общее время процесса, в секундах – от момента запуска метода до момента появления всех данных в окне Excel.
2. Время непосредственного вывода в Excel, в секундах - если есть возможность подсчитать время непосредственного вывода в Excel, отделив его от времени выборки данных из таблиц в цикле, то просьба указать это время.
3. Фактическое кол-во выведенных записей (с точностью до 100 вполне достаточно).
4. Версия Excel – 97, 2000, 2002, 2003 (в способе, который буду иллюстрировать я, это оказалось существенным параметром)
5. Версия Axapta.
6. Характеристики компьютера: частота процессора, размер оперативной памяти, «реальная тачка или виртуальная»… что еще?
7. Характеристики локальной сети – пропускная способность… что еще?
8. Конечно, любые ваши дополнительные комментарии.
9. Что еще?

Ну что, изобразим?

Заранее спасибо всем, кто откликнется. Пошёл готовиться и сам…

P.S. Все условия эксперимента обсуждаемы, включая запрос, таблицы, кол-во записей и полей.

Последний раз редактировалось Gustav; 07.06.2006 в 18:27.
За это сообщение автора поблагодарили: mazzy (9), sukhanchik (4), konopello (1).
Старый 07.06.2006, 18:25   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,051 / 3940 (190) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Gustav
1. Выводим в Excel данные из двух связанных таблиц: LedgerTrans и LedgerTable.
В эксперимент нужно обязательно добавить какое-нибудь вычисляемое поле.

Иначе самый быстрый вариант - передать в Excel запрос в инструмент Excel \ Data \ Import External Data \ New Database Query (спасибо Константину, который подсказал этот способ)

Проблемы начинаются, если в Excel'е нужно отобразить данные, которые вычисляются на X++ в коде Аксапты...

Кроме того, нужно определить что должен делать алгоритм, если получилось больше 65 тысяч строк...
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 07.06.2006, 18:54   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,601 / 5289 (184) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от mazzy
самый быстрый вариант - передать в Excel запрос в инструмент Excel \ Data \ Import External Data \ New Database Query
Разве этот вариант согласуется с этим пунктом условий?
Цитата:
Сообщение от Gustav
6. Рассматриваем только выгрузку средствами самой Аксапты. Доступ напрямую к таблицам БД средствами СУБД (MS SQL Server или Oracle), минуя Аксапту – не рассматриваем.
Старый 07.06.2006, 19:07   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1149 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от mazzy
Excel \ Data \ Import External Data \ New Database Query
Можно считать, что этот способ отклоняется пунктом "6. Рассматриваем только выгрузку средствами самой Аксапты. Доступ напрямую к таблицам БД средствами СУБД (MS SQL Server или Oracle), минуя Аксапту – не рассматриваем."

Способы доступа к таблицам Аксапты внешними средствами безусловно интересны и, как правило, быстры. За исключением одного НО - они плюют на рогатки безопасности Аксапты, в частности, на RLS, и предъявляют все данные запроса без учета профиля пользователя, их запрашивающего. Недавно как раз этот момент обсуждался здесь: Альтернативные конструкторы отчетов в Axapta
Цитата:
Сообщение от mazzy
Кроме того, нужно определить что должен делать алгоритм, если получилось больше 65 тысяч строк...
Должен переходить на следующий лист Excel. Я уже выводил и 500 тысяч, и больше. Но в "Условиях конкурса" мы говорим о 50 тыс.
К тому же, тестируется скорость вывода. Скорость же "переворачивания" алгоритмом очередного эксельного шита пренебрежима мала

Раз уж заговорили об этом, процитирую себя, любимого, из письма к своим благодарным пользователям (речь о неком местном эксельном репортере):
Цитата:
Данная версия Репортера приспособлена для вывода больших
выборок (свыше 65 тыс.строк) на несколько листов рабочей
книги Excel. Каждый очередной переход на следующий лист
происходит автоматически по достижении очередных 65 тыс.
Нужное количество листов также автоматически добавляется.

Не стоит, однако, увлекаться слишком большими объемами
выводимых в отчет данных, т. к. могут возникнуть ограничения
со стороны оперативной памяти Вашего компьютера
и размера получающегося файла Excel, причем, даже если
Вам удастся сохранить такой огромный файл Excel
(много листов по 65 тыс.строк), в будущем Вы можете просто
его не открыть.
Цитата:
Сообщение от gl00mie
Разве этот вариант согласуется с этим пунктом условий?
и я про то же

Последний раз редактировалось Gustav; 07.06.2006 в 19:28.
Старый 07.06.2006, 19:20   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,051 / 3940 (190) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie
Разве этот вариант согласуется с этим пунктом условий?
ок. согласен, пропустил.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 07.06.2006, 20:20   #6  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1149 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Небольшой офф-топик: вывод на несколько листов Excel по 65 тыс. строк
"Раз уж заговорили об этом..."

Может, кому пригодится. Привожу фрагменты из рабочего кода на VBA, включающего в себя алгоритм перехода на следующий лист. Это НЕРАБОЧАЯ процедура, т.е. она взята из моего работающего приложения и из нее удалены отдельные фрагменты. Поэтому не пытайтесь запускать ее в Excel в том виде, в каком она здесь представлена. Однако, список переменных процедуры сохранен полностью. Не пытайтесь его понять полностью - там много ненужного, т.е. не имеющего отношения к переходу на след.лист. В принципе там всё несложно, другое дело, что часто такие вещи бывает делать лениво и они всё откладываются, откладываются...

Словом, если есть желание - воспользуйтесь. Если будут вопросы - с удовольствием отвечу.
Код:
'Код - Excel VBA

'ВНИМАНИЕ: запускать не надо, он все равно не запустится!
'А поизучать можно :)
'Может, кому-нибудь пригодится.

Option Explicit

Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset

Const MaxRowsPerSheet As Long = 65000 'максимальное количество, выводимое на один лист

Sub GenerateReport()
'эта процедура запускается, когда пользователь жмет на листе кнопку "Создать файл отчета"
'т.е. с нее всё и начинается
    Dim Id As Long
    Dim Rep_Id As Long
    Dim NewFile As Workbook
    Dim Res As Object
    Dim stmt As String
    Dim Title As String
    Dim flds() As Object
    Dim fldsNames() As String 'массив заголовков колонок
    Dim fldcount As Long
    Dim Colnum As Long
    Dim Rownum As Long 'строка Excel
    Dim HeaderRows As Long 'количество строк заголовков перед данными (2 штуки)
    
    Dim dtmProcStart As Date
    Dim lngProcSeconds As Long
    Dim strProcInfo As String
    
    Dim dtmQueryStart As Date
    Dim lngQuerySeconds As Long
    Dim strQueryInfo As String
    
    Dim dtmOutputStart As Date
    Dim lngOutputSeconds As Long
    Dim strOutputInfo As String
    
    Dim TitleOfPart As String
    
    Dim intOutputKind As Integer 'Вариант вывода: 1 - Традиционный, 2 - Быстрый
    Dim Recordnum As Long 'сквозной счетчик записей через все листы
    
    Dim func_needed As Integer
    Dim func_len As Long
    Dim func_name As String
    
    Dim rng As Range
    
    Dim actSheet As Worksheet
    Dim intSheetsCounter As Integer
        
        
    dtmOutputStart = Now
    Debug.Print "Начало вывода результатов: " & dtmOutputStart
    
    Set NewFile = Application.Workbooks.Add
    
    Application.ScreenUpdating = False
    
    intSheetsCounter = 1
    Set actSheet = NewFile.Worksheets(intSheetsCounter)
    actSheet.Select
    
    HeaderRows = 2
    
    Rownum = HeaderRows
    Recordnum = 0
    
    lngQuerySeconds = DateDiff("s", dtmQueryStart, Now)
    strQueryInfo = "Запрос был выполнен за " & CStr(lngQuerySeconds) & " сек (" & CStr(fldcount) & " полей). "
    Application.StatusBar = strQueryInfo & strProcInfo
    Debug.Print strProcInfo & strQueryInfo
    
    'собственно главный цикл вывода результатов
    '------------------------------------------------------------------------------------------------------------------
    Select Case intOutputKind
        Case 1
            '--- ORA
            Do While Not EmpDynaset.EOF
            
                Rownum = Rownum + 1
                Recordnum = Recordnum + 1
                
                For Colnum = 0 To fldcount - 1
                    actSheet.Cells(Rownum, Colnum + 1) = flds(Colnum).Value
                Next Colnum
                
                If (Recordnum Mod 100) = 0 Then
                    GoSub Every100rows
                End If
                
                EmpDynaset.DbMoveNext
            Loop
            
        Case 2
            '--- ADO
            Do While Not rst.EOF
            
                Recordnum = Recordnum + 100
                
                Set rng = actSheet.Cells(Rownum + 1, 1)
                rng.CopyFromRecordset Data:=rst, MaxRows:=100
                
                Rownum = Rownum + 100
                
                GoSub Every100rows
            Loop
            
    End Select
    
    '------------------------------------------------------------------------------------------------------------------
    
    Select Case intOutputKind
        Case 1
            '--- ORA
            Recordnum = EmpDynaset.RecordCount
            EmpDynaset.Close
            Set EmpDynaset = Nothing
        Case 2
            '--- ADO
            'rst.RecordCount - данный провайдер MSDAORA возвращает -1 для любого типа курсора, поэтому извращаемся на последнем листе
            Recordnum = (NewFile.Worksheets(intSheetsCounter).Range("A1").SpecialCells(xlCellTypeLastCell).Row - HeaderRows) _
                        + (intSheetsCounter - 1) * MaxRowsPerSheet
            rst.Close
            Set rst = Nothing
    End Select
    
    'форматирование последнего (или единственного) листа
    If intSheetsCounter > 1 Then
        TitleOfPart = "Ч." & CStr(intSheetsCounter) & ". " & Title
    Else
        TitleOfPart = Title
    End If
    
    Rownum = (Recordnum Mod MaxRowsPerSheet) + HeaderRows
    
    Call FormatResults(actSheet, TitleOfPart, fldcount, fldsNames, Rownum)
    
    strOutputInfo = "Вывод " & CStr(Recordnum) & " строк за " & CStr(lngOutputSeconds) & " сек. "
    Application.StatusBar = strOutputInfo & strQueryInfo & strProcInfo
    Debug.Print strProcInfo & strQueryInfo & strOutputInfo
    
'-- сделать возможность запуска того же запроса -- с дефолтно выключенной опцией "с теми же параметрами" -- а то упарился при тестировании
    

    Application.StatusBar = False
    Application.ScreenUpdating = True
    
    With NewFile.Worksheets(1)
        .Select
        .Range("A1").Select
    End With
    
    Exit Sub
    
Every100rows:
    'фрагмент вынесен в подпрограмму внутри процедуры - чтобы не создавать отдельную абстрактную процедуру
    'хоть это и ругаемый устаревший синтаксис, зато, блин, получилось весьма удобно :)))
    
    'каждые 100 строк обновляем StatusBar
    lngOutputSeconds = DateDiff("s", dtmOutputStart, Now)
    strOutputInfo = "Вывод " & CStr(Recordnum) & " строк за " & CStr(lngOutputSeconds) & " сек. "
    Application.StatusBar = strOutputInfo & strQueryInfo & strProcInfo
    
    If (Recordnum Mod MaxRowsPerSheet) = 0 Then
    'каждые 65000 строк переходим на след.лист
        'если сюда попали, то листов у нас точно больше одного
        
        'форматирование только что заполненного листа
        TitleOfPart = "Ч." & CStr(intSheetsCounter) & ". " & Title
        Call FormatResults(actSheet, TitleOfPart, fldcount, fldsNames, Rownum)
        
        If intSheetsCounter = 1 Then
            actSheet.Name = "Part_" & CStr(intSheetsCounter) 'переименовываем только что заполенный лист
        End If
        
        intSheetsCounter = intSheetsCounter + 1
        
        If intSheetsCounter > NewFile.Worksheets.Count Then
            'если листов не хватает, то добавляем в конец
            NewFile.Worksheets.Add.Move after:=NewFile.Worksheets(NewFile.Worksheets.Count)
        End If
        
        Set actSheet = NewFile.Worksheets(intSheetsCounter)
        actSheet.Name = "Part_" & CStr(intSheetsCounter) 'переименовываем вновь добавленный
        actSheet.Select 'это нужно в основном для версии 2 -- вывод через CopyFromRecordset (да и то не сильно обязательно)
        
        Rownum = HeaderRows 'сбрасываем счетчик строк Excel для следующего листа
    End If
    Return
    
End Sub
Старый 07.06.2006, 23:57   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,555 / 2408 (86) +++++++++
Регистрация: 20.08.2005
Первый результат (предварительный)

Ч/з xml - время 56 с (просто пробег по данным занимает 38 с)
Клиент, AOS, сервер БД на одной машине
Процессор - Athlon 2500+, память - 500Мб
Кол-во записей == 50000
Excel XP

Завтра попробую на другой конфигурации (сетевой)
__________________
Axapta v.3.0 sp5 kr2
Старый 08.06.2006, 09:49   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,460 / 2576 (94) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Записей в блоге: 5
>>>Ч/з xml - время 56 с

Это как конкретно?
Чем формируется XML - AsciiIO или XMLDocument?
Что за XML формируется SpreadSheetML или данные, которые затем как-то (как?) переписываются в лист?
__________________
blog | twitter
Старый 08.06.2006, 10:22   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,555 / 2408 (86) +++++++++
Регистрация: 20.08.2005
Новый результат

Опять же ч/з xml (без использования XMLDocument)
Два режима - выгрузка в файл с последующим открытием в Excel и прямая загрузка ч/з COM-интерфейс. В первом случае скорость - 26 с, во втором - 29-30 с
Скорость выборки данных - 19 с
Клиент на отдельной машине, AOS и сервер БД - на отдельной
Конфигурация клиента - Athlon 64 3000+, 1Гб памяти
Кол-во записей == 50000
Сеть - 100Мб, сервер и клиент в одном сегменте
Excel 2003

В кач-ве практически бесплатного бонуса (по скорости) - заодно рисую сетку и устанавливаю фон (ч/з строку)

Тестовый джоб выложу позже
__________________
Axapta v.3.0 sp5 kr2
Старый 08.06.2006, 10:36   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1149 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от AndyD
В первом случае скорость - 26 с, во втором - 29-30 с
Скорость выборки данных - 19 с
19 c это внутри общих 26 с ? или общее = 19 с + 26 с ?

В любом случае - круто! Уже большое спасибо!
Старый 08.06.2006, 10:54   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,555 / 2408 (86) +++++++++
Регистрация: 20.08.2005
26 (29) с - это то, что получаю в инфо на выходе (общее время выполнения джоба, все действия находятся внутри счетчика времени, в том числе инициализация всех используемых классов)
__________________
Axapta v.3.0 sp5 kr2
Старый 08.06.2006, 11:46   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,555 / 2408 (86) +++++++++
Регистрация: 20.08.2005
Опробовал еще на одной машине
Конфигурация клиента - Celeron 2800, 256Мб
Сеть - сервер б/д тот-же, что и в предыдущем случае, но подключение ч/з 3 хаба.
Excel 2003

Время через файл 40-45 с, напрямую в Excel - 35 c

Почему через файл дольше - на мой взгляд из-за версии XML (на первой машине XML 6.0) и способа выгрузки во втором случае - передаются не все данные сразу, а по несколько тысяч строк. По всей видимости, XML 4 хуже работает с большими по размеру документами (в данном случае - больше 30 Мб)

Ну и в завершение - тестовый джоб
Вложения
Тип файла: xpo ExportExcelXML.xpo (13.7 Кб, 802 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: kashperuk (4), Gustav (3), Eldar9x (1), jkspb (1).
Старый 08.06.2006, 12:05   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,460 / 2576 (94) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Записей в блоге: 5
блин для кого я писал про RawStrings
X++:
b =                                                          
    "<?xml version=\"1.0\" encoding=\"WINDOWS-1251\"?>\n" +  
    "<?mso-application progid=\"Excel.Sheet\"?>\n" +
X++:
b =                                                          
    @'<?xml version="1.0" encoding="WINDOWS-1251"?> 
        <?mso-application progid="Excel.Sheet"?>
пофиксите xpp-расцветчик, пожалуйста
__________________
blog | twitter
За это сообщение автора поблагодарили: Gustav (2), Silphidae (1).
Старый 08.06.2006, 12:12   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,460 / 2576 (94) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Записей в блоге: 5
еще надо искейпить спецсимволы - это тоже может есть время
__________________
blog | twitter
Старый 08.06.2006, 12:15   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,555 / 2408 (86) +++++++++
Регистрация: 20.08.2005
Казнить нельзя помиловать.
Из C'ев я вышел
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Silphidae (1).
Старый 08.06.2006, 12:21   #16  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Gustav
Уважаемые коллеги,


P.S. Все условия эксперимента обсуждаемы, включая запрос, таблицы, кол-во записей и полей.
У меня лиджертранс пустой
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 08.06.2006, 12:39   #17  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1149 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Recoilme
У меня лиджертранс пустой
Вау! Такое бывает?? А что не пустое? Какой-нибудь другой транс есть непустой? InventTrans, например?
Старый 08.06.2006, 13:43   #18  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Протестировал, но правда на другом запросе))
Сам запрос:
PHP код:
static void Job70(Args _args)
{
    
InventTrans             it;
    
InventTable             goods;
    
int                     t TimeNow(),i;
    
AsciiIo                 dataFile = new AsciiIo('c:\\_1.xls'"w");
    ;

    
it.selectLocked(0);
    
goods.selectLocked(0);
    
0;
    
dataFile.outFieldDelimiter("\t");
    while 
select It
        join itemname from goods where goods
.itemid == it.itemid
    
{
        
i++;
        if (
== 50000) break;
        
dataFile.write([
        
strfmt('%1',it.DateStatus), it.ItemIdgoods.ItemNameit.InventDimIDstrfmt('%1',it.Qty),
        
strfmt('=ОКРУГЛ(%1;2)',it.CostAmountPosted it.CostAmountAdjustment), it.TransType]);

    }
    
WinAPI::shellExecute('c:\\_1.xls');
    
info(strfmt("????????? ?????? %1 ???"TimeNow() - t)); 
Общее время 21 секунда
Из них время запроса без выгрузки: 17-18 секунд
т.е. время непосредственно выгрузки 3-4 секунды. Excel 2002
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/

Последний раз редактировалось Recoilme; 08.06.2006 в 14:05.
За это сообщение автора поблагодарили: konopello (1), Gustav (2).
Старый 08.06.2006, 15:47   #19  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1149 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
2 Recoilme
пока не совсем зачот... скорость большая, да, у меня даже еще быстрее получилось - за 13-14 сек Ваш Job70 отрабатывает (на серверной тачке с процессором AMD , 2500, 4 Гб)
НО! Текстовое поле ItemId становится числовым с откусыванием ведущих нулей ("00333" -> 333). Можно исправить ситуацию, например, каким-нибудь тегом?
Старый 08.06.2006, 16:16   #20  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Gustav
2 Recoilme
пока не совсем зачот... скорость большая, да, у меня даже еще быстрее получилось - за 13-14 сек Ваш Job70 отрабатывает (на серверной тачке с процессором AMD , 2500, 4 Гб)
НО! Текстовое поле ItemId становится числовым с откусыванием ведущих нулей ("00333" -> 333). Можно исправить ситуацию, например, каким-нибудь тегом?
Попробуйте так:
PHP код:
        strfmt('%1%2',"'"it.ItemId
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Теги
benchmark, download, excel, faq, xml, законченный пример, производительность, экспорт/импорт

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axapta программирует Excel на VBA Gustav DAX: База знаний и проекты 10 13.03.2006 11:42
Использование OWC.Spreadsheet для ускорения экспорта/импорта в/из Excel. storer DAX: Программирование 24 28.03.2005 19:10
Передача данных из 1С в Axapta 3.0 через COM Connector isbist DAX: Программирование 10 03.12.2004 10:58
Особенности экспорта данных в Excel Roman-sp DAX: Функционал 18 01.03.2004 12:07
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:06.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.