Текущее время: Вс, июн 22 2025, 00:42

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




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Пн, апр 29 2013, 16:31 
Начинающий
Начинающий

Зарегистрирован:
Пн, апр 29 2013, 14:29
Сообщения: 18
Посмотрите, пож-та, http://scn.sap.com/thread/1306490
Попыталась воспроизвести.
Вставила BEX-кнопку, выбрала тип команды "Спец. команда провайдера данных" -> "Обработать".
Дальше выходит окно, где нужно установить:
data_provider = dataprovider_1
cmd = process_variables
subcmd = var_submit

Прописываю вручную (т.к. в выпадающих списках нет соотв. вариантов).
В поле "Командная область" указываю имя диапазона ячеек на листе с моим значением параметра (хочу поменять регион):
VAR_NAME_1 1 ZBPL_ORGU__0REGION
VAR_VALUE_EXT_1 1 RU/86

По нажатию этой кнопки что-то делается, пишет "Идет обработка...", потом "Сообщения существуют", но в области результата ничего не происходит (регион не меняется).
Подскажите, может, я что-то неправильно поняла, либо что-то неправильно делаю...
Спасибо.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Пн, апр 29 2013, 16:48 
Специалист
Специалист

Зарегистрирован:
Пн, ноя 01 2010, 08:21
Сообщения: 162
Попробуй еще на форму вытянуть область сообщений и отметить там все возможные их виды. Меня иногда раздражает, что так просто их не посмотреть, а требуется отдельный элемент на форму вытаскивать (он находится на панели, рядом с кнопками и таблицами) :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Пн, апр 29 2013, 16:55 
Начинающий
Начинающий

Зарегистрирован:
Пн, апр 29 2013, 14:29
Сообщения: 18
Это будет просто вывод всех параметров запроса, с которыми он запускался. А тут, если я правильно поняла ("...assume a query has 4 variables but you only want to change 1 with the button u2013 an organizational unit for instance..."), речь идет о том, что можно в определенной ячейке менять значение входного параметра (без вызова окна ввода параметров).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Вт, апр 30 2013, 12:04 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 13 2010, 10:35
Сообщения: 55
znv, чтобы задать новое значение переменной выбора достаточно записать это новое значение в соответствующую ячейку в области фильтра. При этом запросы будут обновлены с новыми значениями переменных выбора.
Например, можно действовать так (VBA код):
Code:
'Установить значение поля в фильтре.
'aRngFilt - левая верхняя ячейка в области данных фильтра, либо весь диапазон данных фильтра.
'aFieldName - имя признака, в том виде, как оно записано в левой колонке фильтра.
'aFieldValue - ключ нового значения для данного признака.
'При установке нового значения все запросы автоматически обновят свои данные.
Function SetFilterValue(ByVal aRngFilt As Excel.Range, ByVal aFieldName As String, _
  ByVal aFieldValue As String) As Boolean
  Dim Cell As Excel.Range
  Dim FName As String
  Dim S As String
 
  SetFilterValue = False
  If (aRngFilt Is Nothing) Or (aFieldName = "") Then Exit Function
  FName = UCase(aFieldName)
  Set Cell = aRngFilt.Cells(1, 1)
  S = UCase(Cell.Text)
  Do While S <> ""
    If S = FName Then
      Cell.Offset(0, 1).Value = aFieldValue
      SetFilterValue = True
      Exit Do
    End If
    Set Cell = Cell.Offset(1, 0)
    S = UCase(Cell.Text)
  Loop
End Function

'Пример обновления отчёта с новым значением признака в фильтре.
Sub Test()
  Dim Sh As Excel.Worksheet
  Dim FiltCell As Excel.Range
 
  'Ссылка на лист рабочей книги, где располагается фильтр.
  Set Sh = ...
  'Ссылка на верхнуюю ячейку области данных фильтра.
  Set FiltCell = Sh.Cells(15, 3)
  'Задаём в фильтре новое значение (= "10") для признака ZMYPRIZN. При этом все запросы автоматически
  'обновят свои данные.
  If Not SetFilterValue(FiltCell, "ZMYPRIZN", "10") Then
    MsgBox "Признак ZMYPRIZN не найден в фильтре. Действие отменено.", _
      vbOKOnly + vbExclamation + vbApplicationModal, "Ошибка!"
  End If
End Sub

Может быть понадобится ещё прочитать текущее значение признака в фильтре:
Code:
'Прочитать значение признака в фильтре.
'aRngFilt - левая верхняя ячейка в области данных фильтра, либо весь диапазон данных фильтра.
'aFieldName - имя признака, в том виде, как оно записано в левой колонке фильтра.
Function GetFilterValue(ByVal aRngFilt As Excel.Range, ByVal aFieldName As String) As String
  Dim Cell As Excel.Range
  Dim FName As String
  Dim S As String
 
  GetFilterValue = ""
  If (aRngFilt Is Nothing) Or (aFieldName = "") Then Exit Function
  FName = UCase(aFieldName)
  Set Cell = aRngFilt.Cells(1, 1)
  S = UCase(Cell.Text)
  Do While S <> ""
    If S = FName Then
      GetFilterValue = Cell.Offset(0, 1).Text
      Exit Do
    End If
    Set Cell = Cell.Offset(1, 0)
    S = UCase(Cell.Text)
  Loop
End Function


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Вт, апр 30 2013, 12:22 
Начинающий
Начинающий

Зарегистрирован:
Пн, апр 29 2013, 14:29
Сообщения: 18
Спасибо, как менять фильтр я уже разобралась. Это можно делать, в том числе, через BEX-кнопку. НО фильтр применяется к области результата уже выполненного запроса. А мне нужно именно запустить запрос с измененными входными параметрами, минуя вызов окна "Изменить значения переменных". Если еще точнее, надо открыть книгу с запросом, изменить параметры, обновить запрос, получить область результата - все это сделать в макросе.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Вт, апр 30 2013, 14:19 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 13 2010, 10:35
Сообщения: 55
znv написал(а):
...Если еще точнее, надо открыть книгу с запросом, изменить параметры, обновить запрос, получить область результата - все это сделать в макросе.

Если в настройках рабочей книги на закладке "Общее" установлена галочка "Обновлять при открытии", то при открытии рабочей книги автоматически произойдёт обновление данных. При этом после обновления данных каждого запроса будет вызываться VBA процедура CallBack(). Имя этой процедуры должно быть задано в настройках раб. книги на закладке "Exits". Процедура CallBack() определена в модуле DefaultWorkbook. Можно и самостоятельно её определить. Сигнатура процедуры CallBack():
Code:
Sub CallBack(ParamArray varname())

Параметр varname при вызове передаёт движок BEx Analyzer. varname - это вариантный массив. Из этого массива можно получить следующие данные:
varname(1) - диапазон, на который отображены данные запроса.
varname(2) - имя диапазона данных - например, для первого провайдера (связанного с первым запросом) имя будет: GRID_1. Для второго провайдера (запроса) имя будет таким: GRID_2. И т. д.

Чтобы получить ссылку на диапазон отображения данных и ссылку на лист, на котором этот диапазон расположен, можно поступить так:
Code:
Sub CallBack(ParamArray varname())

...

  '--------------------------------------------------
  'Записать в самый конец процедуры CallBack().
  '--------------------------------------------------
 
  Dim Sh As Excel.Worksheet
  Dim RngTbl As Excel.Range
 
  'Получаем ссылку на диапазон отображения данных запроса.
  Set RngTbl = varname(1)
  'Получаем ссылку на лист, на котором расположен диапазон отображения данных запроса.
  Set Sh = RngTbl.Worksheet
 
  'Выполняем действия в зависимости от того, какой запрос сейчас обновился.
  Select Case varname(2)
    Case "GRID_1"
      ...
    Case "GRID_2"
      ...
  End Select
End Sub

Можно эти действия в отдельную процедуру вынести. Ещё может понадобится выполнить какие-то действия после того, как закончится обновление всех нужных нам запросов в рабочей книге. Это можно реализовать с помощью счётчика на основе статической переменной:
Code:
Sub CallBack(ParamArray varname())

...

  '--------------------------------------------------
  'Записать в самый конец процедуры CallBack().
  '--------------------------------------------------
 
  Dim Sh As Excel.Worksheet
  Dim RngTbl As Excel.Range
  Static Cnt As Long
 
  On Error GoTo OnExcept

  'Получаем ссылку на диапазон отображения данных запроса.
  Set RngTbl = varname(1)
  'Получаем ссылку на лист, на котором расположен диапазон отображения данных запроса.
  Set Sh = RngTbl.Worksheet
 
  'Выполняем действия в зависимости от того, какой запрос сейчас обновился.
  Select Case varname(2)
    Case "GRID_1"
      Cnt = Cnt + 1 'Подсчитываем первый запрос.
      ...
    Case "GRID_2"
      Cnt = Cnt + 1 'Подсчитываем второй запрос.
      ...
  End Select

  'Действия в момент, когда обновились 2 нужных нам запроса.
  If Cnt = 2 Then
    Cnt = 0 'Сброс счётчика
    ...
  End If

OnExcept:
  If Cnt = 2 Then
    Cnt = 0
  End If
  'Вызываем исключение с тем же номером ошибки - чтобы движок Аналайзера узнал о возникшей ошибке.
  Err.Raise Err.Number
End Sub


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Вт, апр 30 2013, 15:20 
Начинающий
Начинающий

Зарегистрирован:
Пн, апр 29 2013, 14:29
Сообщения: 18
Из 4-х пунктов:
1. открыть книгу с запросом,
2. изменить параметры,
3. обновить запрос,
4. получить область результата.
я уже знаю ответы на все, кроме главного - 2-го.)))
Как изменить входные параметры не после, а до обновления запроса?
В примере иностранного товарища (http://scn.sap.com/thread/1306490) присутствует "намёк", что такое все-таки возможно.))) А дальше, как в песне "...но непонятно, что конкретно?")))


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Вт, апр 30 2013, 15:33 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 13 2010, 10:35
Сообщения: 55
А открытие книги - это вручную делается?
Если в параметрах книги сброшена галочка "Обновлять при открытии", то книга откроется и обновление данных в запросах не произойдёт. После этого можно записать новое значение в поле фильтра и вот тогда данные запроса обновятся с учётом нового значения. Правда, если нужно задать несколько полей - тогда не очень удобно получится - после вставки каждого значения в фильтр будет происходить обновление запроса.

В общем, надо поизучать, что предложено в обсуждении по той ссылке...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Вт, апр 30 2013, 15:37 
Начинающий
Начинающий

Зарегистрирован:
Пн, апр 29 2013, 14:29
Сообщения: 18
Все нужно сделать в макросе. Книгу открываем по идентификатору Sub OpenWorkbook(iWorkbookID As String)
Вот-вот, несколько полей... Фильтр никак не подходит.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Вт, апр 30 2013, 16:08 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 13 2010, 10:35
Сообщения: 55
Я сейчас попробовал. Кнопку с нужными действиями и, соответственно, макрос, мне удалось создать. - Там устанавливаются значения для 2 разных полей фильтра. Но значения я задал постоянные - в настройках кнопки. :) Осталось разобраться, как подставлять разные значения.
Последовательность действий такая:
1. Открываем нужную книгу (вручную).
2. Переходим в режим конструктора Analyzer-а (кнопка с изображением циркуля).
3. Выбираем ячейку в которую вставим кнопку.
4. Вставляем кнопку из палитры Analyzer-а.
5. Открываем свойства этой кнопки.
6. В окне свойств кнопки устанавливаем:
- 1 Экран. Выбираем: Специальная команда провайдера данных. Здесь же выбираем нужный провайдер (запрос). Жмём "Дальше".
- 2 Экран. Выбираем: "Команда фильтра". Жмём "Дальше".
- 3 Экран. Выбираем: "Признак/структура" - здесь выбираем название признака из запроса. Выбираем опцию: "Установить фильтр". Ниже задаём значение для поля фильтра. Затем, жмём "Установить на готово".
Теперь, чтобы задать значение ещё для одного поля фильтра, на последнем экране надо нажать кнопку "Создать" и опять проделать все шаги: 1...6.
В конце жмём "ОК". В результате кнопка будет настроена и в коде VBA проекта в модуле того листа, на который мы положили кнопку, будет создан обработчик нажатия этой кнопки:
Code:
Option Explicit

Public Sub BUTTON_34_Click()
  Dim BEx1 As Object
  Set BEx1 = Application.Run("BExAnalyzer.xla!GetBEx")
  Call BEx1.RaiseButtonClick(Parent.Name, "BUTTON_34")
End Sub

Вот этот обработчик можно вызвать из своей процедуры VBA. Но только теперь надо разобраться, как задавать значения для полей фильтра через код VBA...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Ср, май 01 2013, 08:51 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
Вариант для двух переменных:

Analyzer:
BI AddOn 7.X (based on 7.20), SP4, Patch 2

Button (Static Parameters):
CMD 1 PROCESS_VARIABLES
SUBCMD 1 VAR_SUBMIT
DATA_PROVIDER 1 DATA_PROVIDER_1
Button (Command Range):
S29:U32

Sheet (Range S29:U32):
VAR_NAME_1 1 VAR_9
VAR_VALUE_EXT_1 1 '1
VAR_NAME_2 1 VAR_8
VAR_VALUE_EXT_2 1 '11.2012


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Ср, май 01 2013, 14:08 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 13 2010, 10:35
Сообщения: 55
murmur, спасибо! С диапазоном всё получилось. Я попробовал сделать так. Как говорилось ранее в теме, создал кнопку с настройками:
Code:
DATA_PROVIDER   1   DATA_PROVIDER_1
CMD   1   SET_FILTER
FILTER_IOBJNM   1   ZMYCHAR1
FILTER_VALUE_EXT   1   0

В настойках кнопки в поле "Командная область" задал рабочий диапазон: X10:Z50 - специально с запасом, чтобы можно было несколько команд записать. Затем, в этом диапазоне на том же листе, где лежит кнопка записал:
Code:
DATA_PROVIDER   1   DATA_PROVIDER_1
CMD   1   SET_FILTER
FILTER_IOBJNM   1   ZMYCHAR1
FILTER_VALUE_EXT   1   10
DATA_PROVIDER   2   DATA_PROVIDER_1
CMD   2   SET_FILTER
FILTER_IOBJNM   2   ZMYCHAR2
FILTER_VALUE_EXT   2   100
DATA_PROVIDER   3   DATA_PROVIDER_1
CMD   3   SET_FILTER
FILTER_IOBJNM   3   ZMYCHAR3
FILTER_VALUE_EXT   3   1000

Здесь 3 команды:
1. Признак ZMYCHAR1 - устанавливается значение 10.
2. Признак ZMYCHAR2 - устанавливается значение 100.
3. Признак ZMYCHAR3 - устанавливается значение 1000.
При нажатии на кнопку запрос обновляется с учётом параметров, заданных в командном диапазоне.

Потом попробовал задать разные команды: 2 команды SET_FILTER и одну - REMOVE_FILTER:
Code:
DATA_PROVIDER   1   DATA_PROVIDER_1
CMD   1   SET_FILTER
FILTER_IOBJNM   1   ZMYCHAR1
FILTER_VALUE_EXT   1   10
DATA_PROVIDER   2   DATA_PROVIDER_1
CMD   2   SET_FILTER
FILTER_IOBJNM   2   ZMYCHAR2
FILTER_VALUE_EXT   2   100
DATA_PROVIDER   3   DATA_PROVIDER_1
CMD   3   REMOVE_FILTER
FILTER_IOBJNM   3   ZMYCHAR3

Здесь:
1. Признак ZMYCHAR1 - устанавливается значение 10.
2. Признак ZMYCHAR2 - устанавливается значение 100.
3. Признак ZMYCHAR3 - значение в фильтре очищается.
Тоже всё отработало правильно.

Ждём ответа ТС. :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Пн, май 06 2013, 11:59 
Начинающий
Начинающий

Зарегистрирован:
Пн, апр 29 2013, 14:29
Сообщения: 18
murmur, я именно так и делала. Вы ведь выбирали тип команды "Обработать"? Почему же у меня не работает? Установка/сброс фильтра по кнопке работает, а обработка переменных - нет. У меня Analyzer BI AddOn 7.X (based on 7.20), SP8 Revision 1856.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Пн, май 06 2013, 12:35 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 13 2010, 10:35
Сообщения: 55
znv написал(а):
murmur, я именно так и делала. Вы ведь выбирали тип команды "Обработать"? Почему же у меня не работает?

Не "Обработать", а "Команда фильтра" надо выбрать.
Markonys написал(а):
Последовательность действий такая:
1. Открываем нужную книгу (вручную).
2. Переходим в режим конструктора Analyzer-а (кнопка с изображением циркуля).
3. Выбираем ячейку в которую вставим кнопку.
4. Вставляем кнопку из палитры Analyzer-а.
5. Открываем свойства этой кнопки.
6. В окне свойств кнопки устанавливаем:
- 1 Экран. Выбираем: Специальная команда провайдера данных. Здесь же выбираем нужный провайдер (запрос). Жмём "Дальше".
- 2 Экран. Выбираем: "Команда фильтра". Жмём "Дальше".
- 3 Экран. Выбираем: "Признак/структура" - здесь выбираем название признака из запроса. Выбираем опцию: "Установить фильтр". Ниже задаём значение для поля фильтра. Затем, жмём "Установить на готово".

И ещё надо задать координаты диапазона "Командная область":
Markonys написал(а):
В настойках кнопки в поле "Командная область" задал рабочий диапазон: X10:Z50 - специально с запасом, чтобы можно было несколько команд записать. Затем, в этом диапазоне на том же листе, где лежит кнопка записал:
Code:
DATA_PROVIDER   1   DATA_PROVIDER_1
CMD   1   SET_FILTER
FILTER_IOBJNM   1   ZMYCHAR1
FILTER_VALUE_EXT   1   10
DATA_PROVIDER   2   DATA_PROVIDER_1
CMD   2   SET_FILTER
FILTER_IOBJNM   2   ZMYCHAR2
FILTER_VALUE_EXT   2   100
DATA_PROVIDER   3   DATA_PROVIDER_1
CMD   3   SET_FILTER
FILTER_IOBJNM   3   ZMYCHAR3
FILTER_VALUE_EXT   3   1000

Здесь 3 команды:
1. Признак ZMYCHAR1 - устанавливается значение 10.
2. Признак ZMYCHAR2 - устанавливается значение 100.
3. Признак ZMYCHAR3 - устанавливается значение 1000.
При нажатии на кнопку запрос обновляется с учётом параметров, заданных в командном диапазоне.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: BExAnalyzer 7.Х передача входных параметров в запрос через VBA
СообщениеДобавлено: Пн, май 06 2013, 14:46 
Начинающий
Начинающий

Зарегистрирован:
Пн, апр 29 2013, 14:29
Сообщения: 18
murmur написал:
Вариант для двух переменных:

Analyzer:
BI AddOn 7.X (based on 7.20), SP4, Patch 2

Button (Static Parameters):
CMD 1 PROCESS_VARIABLES
SUBCMD 1 VAR_SUBMIT
DATA_PROVIDER 1 DATA_PROVIDER_1
Button (Command Range):
S29:U32

Sheet (Range S29:U32):
VAR_NAME_1 1 VAR_9
VAR_VALUE_EXT_1 1 '1
VAR_NAME_2 1 VAR_8
VAR_VALUE_EXT_2 1 '11.2012

В ответе murmur говорится НЕ ПРО ФИЛЬТР. Мы с murmur пытаемся изменить параметры самого запроса. Разница в том, чтобы, например, запрос выдавал сразу нужный регион, а не все регионы, которые потом нужно фильтровать, чтобы оставить нужный регион.

murmur, у вас после нажатия такой кнопки, как я понимаю, выводится новая выборка и в текстовых элементах с информацией о запросе отображаются новые значения переменных? Почему-то именно этого я никак не могу добиться.((
И еще, как задать несколько значений для одной переменной, которые будут работать через ИЛИ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.

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


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

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


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

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