Текущее время: Ср, июл 02 2025, 03:25

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Чт, дек 22 2011, 17:19 
Начинающий
Начинающий

Зарегистрирован:
Ср, апр 27 2011, 12:04
Сообщения: 14
Добрый день!
Хочу разобраться, как опускать необязательные аргументы при вызове методов.
Например, при вызове
Code:
CALL METHOD OF obj 'meth' EXPORTING #2 = 1.
единица передаётся в первый по порядку аргумент.
Code:
CALL METHOD OF obj 'meth' EXPORTING #1 = `` #2 = 1.
Приведёт к ошибке в методе, ожидающем число. В любом случае, обработка пустой строки может отличаться от обработки пропущенного аргумента. Аналогично, нельзя передавать 0.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Чт, дек 22 2011, 18:19 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
tps написал(а):
Добрый день!
Хочу разобраться, как опускать необязательные аргументы при вызове методов.
Например, при вызове
Code:
CALL METHOD OF obj 'meth' EXPORTING #2 = 1.
единица передаётся в первый по порядку аргумент.
Code:
CALL METHOD OF obj 'meth' EXPORTING #1 = `` #2 = 1.
Приведёт к ошибке в методе, ожидающем число. В любом случае, обработка пустой строки может отличаться от обработки пропущенного аргумента. Аналогично, нельзя передавать 0.

Насколько я знаю - никак, т.е. придется передавать все параметры до нужного.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Чт, дек 22 2011, 19:47 
Начинающий
Начинающий

Зарегистрирован:
Ср, апр 27 2011, 12:04
Сообщения: 14
Хорошо. К примеру, в JScript тоже нельзя пропускать аргументы, но можно передать null или undefined (про последний возможно вру), чтобы получить желаемый эффект.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Чт, дек 22 2011, 21:10 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
tps написал(а):
Хорошо. К примеру, в JScript тоже нельзя пропускать аргументы, но можно передать null или undefined (про последний возможно вру), чтобы получить желаемый эффект.

Это уже не АБАП-проблема, если вы на VBA сумеете это сделать, то и на АБАПе можно.
Я пытался сделать это году в 2005-м, у меня не получилось. Если вы в VBA явно задаете параметр, то закосить будто НЕ передаете не получится.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Чт, дек 22 2011, 23:51 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
ещё нет Set-операций (только Get и Let). Увы!

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Пт, дек 23 2011, 09:54 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
chumpa написал:
ещё нет Set-операций
Это о чём? Чем не Set-операция следующая конструкция?
Code:
CALL METHOD OF obj 'meth' = obj2 EXPORTING #2 = 1.

В VB бы и было: Set obj2 = obj.meth(1)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Пт, дек 23 2011, 10:40 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Parazit написал:
tps написал(а):
Хорошо. К примеру, в JScript тоже нельзя пропускать аргументы, но можно передать null или undefined (про последний возможно вру), чтобы получить желаемый эффект.

Это уже не АБАП-проблема, если вы на VBA сумеете это сделать, то и на АБАПе можно.
Я пытался сделать это году в 2005-м, у меня не получилось. Если вы в VBA явно задаете параметр, то закосить будто НЕ передаете не получится.

Далеко не всё, что можно сделать на VBA, можно сделать в ABAP-e. Например, синтаксис добавления листов в рабочую книгу Excel такой: Sheets.Add(Before, After, Count, Type). Допустим, хочу добавить лист диаграммы (тип xlChart = -4109) после второго рабочего листа, пишу:
Code:
Sheets.Add , Worksheets(2), , -4109

Ну и как такое изобразить на ABAP-е? Третий пропущенный параметр, конечно, можно явно заменить умолчательной единицей, становится:
Code:
Sheets.Add , Worksheets(2), 1, -4109

Но от этого не легче (ABAP-у), так как из параметров Before и After должен быть указан только один. Я уже молчу про то, что у VBA есть еще и синтаксис с именнованными параметрами, когда в операторе вызова их можно располагать в произвольном порядке:
Code:
Sheets.Add Type:=-4109, After:=Worksheets(2)

Похоже на вызов ФМ в ABAP-е, но в контексте CALL METHOD OF этим не воспользоваться никак. Вот здесь действительно - увы!


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Пт, дек 23 2011, 10:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Gustav написал:
...Далеко не всё, что можно сделать на VBA, можно сделать в ABAP-e...

Да я и не настаиваю на "всё". Основной смысл моего комментария в обратном - если на VBA не сможешь сделать, то на АБАПе и подавно!

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Пт, дек 23 2011, 16:25 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
Gustav написал:
Чем не Set-операция следующая конструкция?
Code:
CALL METHOD OF obj 'meth' = obj2 EXPORTING #2 = 1.

В VB бы и было: Set obj2 = obj.meth(1)


Был код, написанный в таком стиле -- в VBA выполнялся, в ABAP/OLE2 нет. Код достаточно тривиальный, в отладчике всё одинаково до вызова Set -- а потом в абапе облом.

Да, ещё вспомнил по теме -- массивы не передаются, никак (те, которые в VARIANT могут быть).

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы  Тема решена
СообщениеДобавлено: Пт, дек 23 2011, 18:18 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
chumpa написал:
Да, ещё вспомнил по теме -- массивы не передаются, никак (те, которые в VARIANT могут быть).

Есть такая занятная штука - MSScriptControl (я о ней уже упоминал здесь: viewtopic.php?p=438438#p438438 ). Считаю ее для себя своим открытием года, несмотря на то, что штука известна уже более 10 лет. Как-то всё руки не доходили, а в этом году, к счастью, дошли.

В этот компонент внутри ABAP-программы можно загрузить в виде текста отлаженный код на VBScript и исполнить его. Всякие вкусности Бейсика вроде массивов VARIANT или пропуска необязательных параметров в середине(!) списка - доступны. Нет, напрямую массив в ABAP по-прежнему не передать, НО(!) можно получить вариантный массив (например, значения диапазона ячеек Excel - одной операцией присваивания: varArray = Range("A1:H100")), Бейсиком же развернуть массив в огромную строку, разделив значения в строках символами табуляции, а строки - символами перевода строки. Далее передать строку в стринг ABAP-а, который SPLIT-ами разрезать и поместить во внутреннюю таблицу, завершив, таким образом, преобразование "VARIANT-массив VB => внутренняя таблица ABAP". Законченный пример по передаче массива при случае покажу.

Сейчас же покажу пример с пропуском параметров, уже упомянутый выше в этом обсуждении. В рабочую книгу Excel, открытую из ABAP-а, Бейсиком будет добавлен лист с типом "Диаграмма" (с параметром After), после чего в ABAP-е новый лист будет переименован (конечно же, на самом деле всё "происходит" в ABAP-е и разделение этапов на "абаповский" и "бейсиковский" используется чисто для наглядности):
Code:
REPORT  zzzzzzz.

TYPE-POOLS: ole2.

DATA:
  excel     TYPE ole2_object,
  workbooks TYPE ole2_object,
  sc        TYPE ole2_object,
  new_sheet TYPE ole2_object,
  vbcode    TYPE string.

START-OF-SELECTION.

  "открыли Excel в ABAP-е
  CREATE OBJECT excel 'Excel.Application'.
  SET PROPERTY OF excel 'Visible' = 1.
  CALL METHOD OF excel 'Workbooks' = workbooks.
  CALL METHOD OF workbooks 'Add'.

  "переходим в VB (в смысле, в ActiveX)
  CREATE OBJECT sc 'MSScriptControl.ScriptControl'.
  SET PROPERTY OF sc 'Language' = 'vbscript'.

  "устанавливаем соответствие между объектами VB и ABAP
  CALL METHOD OF sc 'AddObject' EXPORTING #1 = 'xlApp' #2 = excel.

  "загружаем код VB (vbscript) для выполнения поставленной задачи
  CONCATENATE
  'Function addNewSheet'
  '    Set addNewSheet = xlApp.Sheets.Add( , xlApp.Worksheets(2), , -4109)' "-4109 = xlChart
  'End Function'
  INTO vbcode SEPARATED BY cl_abap_char_utilities=>cr_lf.
  CALL METHOD OF sc 'AddCode' EXPORTING #1 = vbcode.

  "проигрываем" код VB, возвращая созданный лист ABAP-у
  CALL METHOD OF sc 'Run' = new_sheet EXPORTING #1 = 'addNewSheet'.

  "снова в ABAP-е - изменяем имя листу, созданному в VB
  SET PROPERTY OF new_sheet 'Name' = 'Диаграммище'.

  CALL METHOD cl_gui_cfw=>flush.
  FREE OBJECT: sc, new_sheet, workbooks, excel.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: OLE2: CALL METHOD OF и необязательные аргументы
СообщениеДобавлено: Пн, дек 26 2011, 10:30 
Начинающий
Начинающий

Зарегистрирован:
Ср, апр 27 2011, 12:04
Сообщения: 14
Gustav, спасибо, оно. Добавлю только, что разделение этапов на ABAP и VBS все-таки имеет место, ведь код VBS в методе sc.Run выполняется целиком на стороне клиента. Таким образом, имеет смысл по максимуму перенести операции с xlApp в него, чтобы избежать лишних запросов на апп-сервер (если, конечно, не использовать NO FLUSH).


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB