powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / OLE arrays 2-х мерные массивы
13 сообщений из 13, страница 1 из 1
OLE arrays 2-х мерные массивы
    #38389473
Guest-123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день
Нужно выгрузить данные из PL/SQL таблицы в область ('Range') Excel покоординатно.
Для этого нужен 2-х мерный массив. В help есть " Specifiers for OLE arrays ", но там общие слова.
Выгружать PL/SQL таблицу в область работает отлично - типа такого:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TYPE myrec IS RECORD (
            x varchar2(10),
            y varchar2(10), 
            z varchar2(10));
TYPE mytable is TABLE OF myrec INDEX BY BINARY_INTEGER;
TableXYZ  mytable;
TableVals OleVar;
...
    -- Converts PL/SQL table to variant type
    TableVals := To_Variant(TableXYZ);
    -- Set the cell value for range ---
    id:=GET_OLE_MEMBERID( myRange, 'Value' );
    SET_OLE( myRange, id, TableVals );

строки выгружаются в регион без проблем - все отлично, но
не могу сообразить - как создать 2-х мерный OLE массив (и работать с ним).
Может у кого есть пример(ы), или ссылка - где посмотреть подробности
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38390610
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игрался несколько лет назад. Многомерные массивы у меня также не получились. Так же не получились сложные типы. Но честно говоря, не вижу причины, почему бы Range не заполнять просто построчно-поколоночно. Тогда одномерного массива вполне должно хватить.

820089

P.S. Если так уж принципиально нужно и готовы схватить весь ворох проблем (полный п...ц с саппортом кода, полная недокументированность, 100% не переносимость под web forms) - всегда можно взять в руки напильник (например Visual C или даже просто Visual Basic) и доработать напильником )))
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38391462
Guest-123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Спасибо за информацию. Я читал Вашу переписку и она действительно очень помогла. Спасибо !
По строкам проблем нет - скорость на одномерных вырастает на порядок. Но есть одно но )
- есть заданная регламентами форма (матрица - по Х категории, по Y дата-время, в ячейках значения)
а индекс на таблице устроен так, что выгружать "удобней" по столбцам. В таблице ~ 3`000`000`000 строк,
так что про альтернативный индекс речь не идет. Вот и хотелось класть по столбцам, а не по строкам.
Что касается выгрузки через массив по строкам, то матрица 1000х50 выгружается за ~9 сек - более чем
приемлемо.
Под web forms переносить и не планируем. Сначала пошли по этому пути, но потом отказались ( и проблемы
с переносом, и перипетии с лицензированием и т.д., да и смысла особого нет - либо сессия + транзакция,
либо все это вручную ) - сделали отдельным модулем "Доступ через WEB" и заточили его на конечную
функциональность. Всех, ну или почти всех) устраивает.
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38392793
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бизнес-критикал - напильник ))). Возможно будет приемлемым решением. Но это в личку (tigralen AT mail.ru). В свое время пытался найти документацию/ноты по ActiveX build-ins, была полная пустота и в I-net и на metalink'е.

Как workaround быстро выкинуть данные в отдельную страницу (например через .CSV файл, XML) и потом через тот же OLE2 вставить их в нужное место в отформатированном документе.
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38392799
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest-123Вот и хотелось класть по столбцам, а не по строкам.

А Range из 1 столбца по данному варианту не заполняется? Мне кажется, разница вытянут ли Range в ширину (одна строка) или в высоту (один столбец) на типе данных сказываться не должен. Надеюсь. Не проверить, Forms'а нет.
Guest-123Что касается выгрузки через массив по строкам, то матрица 1000х50 выгружается за ~9 сек - более чем приемлемо.

GLOBAL TEMPORARY TABLE ....

Сначала в нее по столбцам, потом из нее в Excel по строкам. Плюс всю логику обработки данных можно будет перенести на сервер. На клиенте только выкачка из таблица и запихивание в Excel.

Совсем финт ушами: из таблицы брать не через курсор (FOR),а через Record Group. Тогда Forms с сервера сразу будет pre-fetch делать по 50 строк и соответственная разница в round trips (по крайне мере раньше была).

)))
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38394688
Guest-123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приложение -> 4.5 тыс. работающих систем, из них треть (или чуть больше) многопользовательские.
Пока удается справляться без напильника )))
Жалко здесь нельзя вставлять картинки, но итоги экспериментов с регионами и одномерными массивами следующие

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
  FOR myRowNum IN 1..10 LOOP           --- цикл по номерам строк	

      --- Подготовка массива данных
      strs.delete;                     --- очищаем массив
      FOR myColumnNum IN 1..7 LOOP     --- из 7-ми элементов
           val:='(x'||myColumnNum||' y'||myRowNum||')';
           strs(myColumnNum):=val;
      END LOOP;

      --- Get the address of the first and the last cells 
      ---                    ( x0       X        , y0      Y       )
      firstCell := GetAddress( 4                 , 2 +(myRowNum-1) );
      lastCell  := GetAddress( 4 +(strs.count-1) , 2 +(myRowNum-1) );

      --- Get the range -------------------
      args := OLE2.CREATE_ARGLIST;
      OLE2.ADD_ARG( args, firstCell ); 
      OLE2.ADD_ARG( args, lastCell );
      myRange:=OLE2.GET_OBJ_PROPERTY( mySheet, 'Range', args );
      OLE2.DESTROY_ARGLIST( args);

      --- Put strs() to the range ---------
      var:=TO_VARIANT( strs );
      id:=GET_OLE_MEMBERID( myRange, 'Value' );
      SET_OLE( myRange, id, var );
      DESTROY_VARIANT( var );

      OLE2.RELEASE_OBJ( myRange );

  END LOOP;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Результат ожидаемый - все ложиться как надо:

(x1 y1)  (x2 y1)  (x3 y1)  (x4 y1)  (x5 y1)  (x6 y1)  (x7 y1)
(x1 y2)  (x2 y2)  (x3 y2)  (x4 y2)  (x5 y2)  (x6 y2)  (x7 y2)
(x1 y3)  (x2 y3)  (x3 y3)  (x4 y3)  (x5 y3)  (x6 y3)  (x7 y3)
(x1 y4)  (x2 y4)  (x3 y4)  (x4 y4)  (x5 y4)  (x6 y4)  (x7 y4)
(x1 y5)  (x2 y5)  (x3 y5)  (x4 y5)  (x5 y5)  (x6 y5)  (x7 y5)
(x1 y6)  (x2 y6)  (x3 y6)  (x4 y6)  (x5 y6)  (x6 y6)  (x7 y6)
(x1 y7)  (x2 y7)  (x3 y7)  (x4 y7)  (x5 y7)  (x6 y7)  (x7 y7)
(x1 y8)  (x2 y8)  (x3 y8)  (x4 y8)  (x5 y8)  (x6 y8)  (x7 y8)
(x1 y9)  (x2 y9)  (x3 y9)  (x4 y9)  (x5 y9)  (x6 y9)  (x7 y9)
(x1 y10) (x2 y10) (x3 y10) (x4 y10) (x5 y10) (x6 y10) (x7 y10)

Теперь попытаемся положить тот же массив из семи элементов вертикально.
Циклы те же, но формируем Range как вертикальный столбик

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  FOR myRowNum IN 1..10 LOOP           --- цикл по номерам строк	

      --- Подготовка массива данных
      strs.delete;                     --- очищаем массив
      FOR myColumnNum IN 1..7 LOOP     --- из 7-ми элементов
           val:='(x'||myRowNum||'-y'||myColumnNum||')';  --- теперь myColumnNum должен играть роль Y координаты
           strs(myColumnNum):=val;
      END LOOP;

      --- Get the address of the first and the last cells 
      ---                    ( x0       X      , y0      Y          )
      firstCell := GetAddress( 7 +(myRowNum-1) , 20                 );
      lastCell  := GetAddress( 7 +(myRowNum-1) , 20 +(strs.count-1) );  --- теперь регион вертикальный, из одной колонки

      .........

  END LOOP;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
После первых 2-х циклов
  1) $G$20 - $G$26
  2) $H$20 - $H$26
результат выглядит следующим образом
  (x1-y1)  (x2-y1)
  (x1-y1)  (x2-y1)
  (x1-y1)  (x2-y1)
  (x1-y1)  (x2-y1)
  (x1-y1)  (x2-y1)
  (x1-y1)  (x2-y1)
  (x1-y1)  (x2-y1)

После всех 10-ти циклов
  $G$20 - $G$26
  $H$20 - $H$26
  .............
  $P$20 - $P$26
результат выглядит так
  (x1-y1)  (x2-y1)  (x3-y1)  (x4-y1)  (x5-y1)  (x6-y1)  (x7-y1)  (x8-y1)  (x9-y1)  (x10-y1)
  (x1-y1)  (x2-y1)  (x3-y1)  (x4-y1)  (x5-y1)  (x6-y1)  (x7-y1)  (x8-y1)  (x9-y1)  (x10-y1)
  (x1-y1)  (x2-y1)  (x3-y1)  (x4-y1)  (x5-y1)  (x6-y1)  (x7-y1)  (x8-y1)  (x9-y1)  (x10-y1)
  (x1-y1)  (x2-y1)  (x3-y1)  (x4-y1)  (x5-y1)  (x6-y1)  (x7-y1)  (x8-y1)  (x9-y1)  (x10-y1)
  (x1-y1)  (x2-y1)  (x3-y1)  (x4-y1)  (x5-y1)  (x6-y1)  (x7-y1)  (x8-y1)  (x9-y1)  (x10-y1)
  (x1-y1)  (x2-y1)  (x3-y1)  (x4-y1)  (x5-y1)  (x6-y1)  (x7-y1)  (x8-y1)  (x9-y1)  (x10-y1)
  (x1-y1)  (x2-y1)  (x3-y1)  (x4-y1)  (x5-y1)  (x6-y1)  (x7-y1)  (x8-y1)  (x9-y1)  (x10-y1)

Надеюсь в процессе 3-х дневных экспериментов ничего не напутал с циклами )
Т.е. весь вертикальный регион заполняется значением 1-го элемента массива.
Вообще это согласуется с первоисточником http://office.microsoft.com/ru-ru/excel-help/HP010081865.aspx
Вот что пишут в разделе "Использование констант массива"

Константы заключены в фигурные скобки ({ })
Столбцы разделены запятыми (,). Например, чтобы представить значения 10, 20, 30 и 40,
введите массив как {10,20,30,40}. Такой массив констант является матрицей с размерностью
1 на 4 и соответствует ссылке на одну строку и четыре столбца.
Значения ячеек из разных строк разделены точкой с запятой. Например, чтобы представить
значения 10, 20, 30, 40 и 50, 60, 70, 80, находящиеся в расположенных друг под другом
ячейках, можно создать массив констант с размерностью 2 на 4: {10,20,30,40;50,60,70,80}.

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

Может изложил излишне подробно, но по крайней уже больше не нужно тратить на это время.
Да, и по поводу "1000х50 выгружается за ~9 сек" это при открытом листе Excel - все происходит
на глазах у Пользователя )
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38394704
Guest-123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю как тут вносить исправления, но во втором куске примера, вместо
Код: plsql
1.
FOR myRowNum IN 1..10 LOOP           --- цикл по номерам строк

лучше заменить комментарий
Код: plsql
1.
FOR myRowNum IN 1..10 LOOP           --- теперь это цикл по колонкам
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38397012
brig_2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guest-123,

При выгрузке в ёксель для ускорения: 1. Не показывайте приложение пользователю до конца выгрузки. 2. Установите свойства реагирование на события и обновление экрана в фальш, после выгрузки верните в тру. 3. После выгрузки покажите ёксель пользователю.

В OLE есть такие массивы SAFEARRAY , которые могут быть многомерными. Вставка из этих массивов в ёкселевский многомерный рэндж самая быстрая, но для заполнения его элементов придется использовать функции winapi длятработы с памятью, что не совсем подходит для формсов. А так ваш пример тоже интересен, но не совсем оптимален.
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38398422
brig_2000Guest-123,

При выгрузке в ёксель для ускорения: 1. Не показывайте приложение пользователю до конца выгрузки. 2. Установите свойства реагирование на события и обновление экрана в фальш, после выгрузки верните в тру. 3. После выгрузки покажите ёксель пользователю.

В OLE есть такие массивы SAFEARRAY , которые могут быть многомерными. Вставка из этих массивов в ёкселевский многомерный рэндж самая быстрая, но для заполнения его элементов придется использовать функции winapi длятработы с памятью, что не совсем подходит для формсов. А так ваш пример тоже интересен, но не совсем оптимален.
при использование OLE (позднее связывание), а не COM (раннее связывание) каждая команда, отправляемая в сервер атомарна и подобна макросу, т.е. сервер ее исполняет и возвращается в исходное состояние - это касается всяких DisplayAlerts, ScreenUpdating и т.п., т.е. эти флаги действуют только на следующую команду, т.е. через OLE ускорить за счет необновления экрана и не показывать всякие предупреждения не получится. надо использовать Type Library и COM.
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38398790
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все еще кололись, но продолжали, судя по нику, Вы давно с травы на соли для ванн перешли (2all: это такое для таможни название МДПВ — Метилен Диокси Пировалерона)

)))

...т.е. через OLE ускорить за счет необновления экрана и не показывать всякие предупреждения не получится....

Неправда ваша.

Если Excel, Word etc не будут тратить время на обновление экрана и рендеринг документа - РАЗУМЕЕТСЯ вставка пойдет быстрее. Это даже обсуждать не нужно. Достаточно хоть раз поработать со сложным документом в Word'е. Для Word разница будет даже в режиме просмотра "обычный", "разметка страницы" etc...

При чем тут позднее и раннее связывание - в упор не понимаю.

Пример для Oracle Forms + Exceработающего не через OLE Automation, а через импорт Type Library (как я понимаю, a la импорт пакеджей для ActiveX контрола) - приветствуется.

Но у меня сильно большие сомнение, что работа через "родные" интерфейсы VS IDispatch в _общем_ случае, дает сильно большой выигрыш в производительности. Неоткуда там этому выигрышу взяться. IMHO & AFAIK.
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38398891
Leonid KudryavtsevВсе еще кололись, но продолжали, судя по нику, Вы давно с травы на соли для ванн перешли (2all: это такое для таможни название МДПВ — Метилен Диокси Пировалерона)

)))

...т.е. через OLE ускорить за счет необновления экрана и не показывать всякие предупреждения не получится....

Неправда ваша.

Если Excel, Word etc не будут тратить время на обновление экрана и рендеринг документа - РАЗУМЕЕТСЯ вставка пойдет быстрее. Это даже обсуждать не нужно. Достаточно хоть раз поработать со сложным документом в Word'е. Для Word разница будет даже в режиме просмотра "обычный", "разметка страницы" etc...

При чем тут позднее и раннее связывание - в упор не понимаю.

Пример для Oracle Forms + Exceработающего не через OLE Automation, а через импорт Type Library (как я понимаю, a la импорт пакеджей для ActiveX контрола) - приветствуется.

Но у меня сильно большие сомнение, что работа через "родные" интерфейсы VS IDispatch в _общем_ случае, дает сильно большой выигрыш в производительности. Неоткуда там этому выигрышу взяться. IMHO & AFAIK.
читайте первоисточник - http://support.microsoft.com/kb/153043
позднее связываение - это COM. развитие OLE2 с большими плюсами по удобству разработки и скорости. Почитайте в чем разница.

А пример с TL и Forms нету - скорее всего Forms в силу сво ейущербностиих возможностей и не умеет полностб поддерживать Import Type Library и COM (хороше хоть OLE2 более-менее умеет).
Что в вашем понимание "родные" интерфейсы?
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38398992
brig_2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну колитесь дальшеLeonid KudryavtsevВсе еще кололись, но продолжали, судя по нику, Вы давно с травы на соли для ванн перешли (2all: это такое для таможни название МДПВ — Метилен Диокси Пировалерона)

)))

пропущено...

Неправда ваша.

Если Excel, Word etc не будут тратить время на обновление экрана и рендеринг документа - РАЗУМЕЕТСЯ вставка пойдет быстрее. Это даже обсуждать не нужно. Достаточно хоть раз поработать со сложным документом в Word'е. Для Word разница будет даже в режиме просмотра "обычный", "разметка страницы" etc...

При чем тут позднее и раннее связывание - в упор не понимаю.

Пример для Oracle Forms + Exceработающего не через OLE Automation, а через импорт Type Library (как я понимаю, a la импорт пакеджей для ActiveX контрола) - приветствуется.

Но у меня сильно большие сомнение, что работа через "родные" интерфейсы VS IDispatch в _общем_ случае, дает сильно большой выигрыш в производительности. Неоткуда там этому выигрышу взяться. IMHO & AFAIK.
читайте первоисточник - http://support.microsoft.com/kb/153043
позднее связываение - это COM. развитие OLE2 с большими плюсами по удобству разработки и скорости. Почитайте в чем разница.

А пример с TL и Forms нету - скорее всего Forms в силу сво ейущербностиих возможностей и не умеет полностб поддерживать Import Type Library и COM (хороше хоть OLE2 более-менее умеет).
Что в вашем понимание "родные" интерфейсы?мы с леонидом кудрявцевым понимаем о чем говорим, потому как на практике испробывали, а вы где-то что-то прочли в инете. Попробуйте сделать то, о чем мы пишем, вам понравится. Если что, я эти приемы еще с 1997 применял, а занимался я тогда обработкой сигналов с аналоговых устройств, поэтому гонял большие объемы данных в эксель, так что не по наслышке достоин. Пс. Суха теория, мой друг, а практика - мерило жизни.
...
Рейтинг: 0 / 0
OLE arrays 2-х мерные массивы
    #38399009
для ежей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
brig_2000ну колитесь дальшепропущено...

читайте первоисточник - http://support.microsoft.com/kb/153043
позднее связываение - это COM. развитие OLE2 с большими плюсами по удобству разработки и скорости. Почитайте в чем разница.

А пример с TL и Forms нету - скорее всего Forms в силу сво ейущербностиих возможностей и не умеет полностб поддерживать Import Type Library и COM (хороше хоть OLE2 более-менее умеет).
Что в вашем понимание "родные" интерфейсы?мы с леонидом кудрявцевым понимаем о чем говорим, потому как на практике испробывали, а вы где-то что-то прочли в инете. Попробуйте сделать то, о чем мы пишем, вам понравится. Если что, я эти приемы еще с 1997 применял, а занимался я тогда обработкой сигналов с аналоговых устройств, поэтому гонял большие объемы данных в эксель, так что не по наслышке достоин. Пс. Суха теория, мой друг, а практика - мерило жизни.
ну мне больше верится MS и личному опыту 97 года по экспорту в Excel - прикольно смотреть как формируется таблица, когда ее показываешь на экране:) - чем вашему опыту и возможностям Oracle Forms.

есть гораздо более удобные средства разработки вообще, и экспорта в excel, в частности, чем Oracle Forms - это раз.
Два - это то, что OLE2 был похорен где то в районе 99 года, чуть позже Forms и перегнать двумерных массив Variantов через OLE2 из Forms в Excel просто нельзя, опять таки наверное в силу продвинутости средства разработки и большого количества возможностей.
Три - почитайте про COM и OLE2 в плане сравнения по скорости выполнения и удобства разработки (знать про методы, аргументы, их типы и количество гораздо удобнее, чем писат в слепую) - будете удивлены:)
Ваши приемы 97 года это скрытие с экрана самого экселя? Это детский сад:) наверное про
Excel.ErrorCheckingOptions.BackgroundChecking
Excel.ErrorCheckingOptions.NumberAsText
Excel.ErrorCheckingOptions.InconsistentFormula и не слышали ?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / OLE arrays 2-х мерные массивы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]