Текущее время: Чт, июл 17 2025, 09:57

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot]


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

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