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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: VBS сценарий
СообщениеДобавлено: Пн, июл 21 2014, 11:04 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 11 2014, 15:50
Сообщения: 8
Добрый день! В VBA и VBS не силен, не говоря о ABAP.

Стало неоходимо снимать несколько репортов за один клик. Записал макрос (сценарий в VBS) и запускал его через сап.
Все бы ничего, но к примеру, код дошел до момента сохранения репорта и дальше не идет.
Как программно "нажать SAVE" в активном окне? И сохранить этот файл в папке? (формат excel)
Желательно бы обозвать файл константой прописанной в коде.
И кстати можно ли выключить ScreenUpdating?

Спасибо за помощь!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Пн, июл 21 2014, 23:42 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
FARAon написал(а):
В VBA и VBS не силен, не говоря о ABAP.

На момент этого моего поста Ваш топик просмотрело уже порядка 30 человек. Как думаете, почему все они молчат? Ответ очень прост: все они, включая меня, не сильны в телепатии. Ну хоть какой-то кусочек какого-то кода покажите, а? :) Причем здесь VBA? Ваш код в хосте MSофисного приложения выполняется? Excel? В общем, вслепую никто ничего толкового не скажет.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Вт, июл 22 2014, 04:47 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 11 2014, 15:50
Сообщения: 8
Gustav написал:
не сильны в телепатии.


Code:
If Not IsObject(application) Then
   Set SapGuiAuto  = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session    = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session,     "on"
   WScript.ConnectObject application, "on"
End If

session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "yusd_sl0048"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtS_VSTEL-LOW").text = "zc9h"
session.findById("wnd[0]/usr/ctxtS_VKORG-LOW").text = "r001"
session.findById("wnd[0]/usr/ctxtS_VKORG-HIGH").text = "r003"
session.findById("wnd[0]/usr/ctxtS_ERDAT-LOW").text = "13.05.14"
session.findById("wnd[0]/usr/ctxtS_ERDAT-HIGH").text = "17.07.14"
session.findById("wnd[0]/usr/ctxtP_UOM_V").text = "M3"
session.findById("wnd[0]/usr/chkP_TEXT").setFocus
session.findById("wnd[0]/usr/chkP_TEXT").selected = true
session.findById("wnd[0]/usr/ctxtP_SPRAS").text = "RU"
session.findById("wnd[0]/usr/cmbP_HEAD1").key = "Y016"
session.findById("wnd[0]/usr/cmbP_HEAD1").setFocus
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").pressToolbarButton "&MB_VARIANT"
session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").setCurrentCell 24,"TEXT"
session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").firstVisibleRow = 22
session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").selectedRows = "24"
session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").clickCurrentCell
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").currentCellColumn = "VSTEL"
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").selectedRows = "0"
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").contextMenu
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").pressToolbarButton "&MB_VARIANT"
session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").setCurrentCell 24,"TEXT"
session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").selectedRows = "24"
session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").clickCurrentCell
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").pressToolbarContextButton "&MB_VARIANT"
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").selectContextMenuItem "&XXL"


Записал код выше использую рекордея в SAP. Когда запускаю код(через сап (script1.vbs)) доходит до конца, выполняя все шаги и останавливается на сохранении файла (импорт отчета в excel) . Хотя записывав сценарий сохранение выполнял.
Что нужно добавить в код, чтобы когда спросит сохранить файл, нажать "SAVE" и сохранить константой (именем в коде) и к примеру в определенную папку.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Вт, июл 22 2014, 04:48 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 11 2014, 15:50
Сообщения: 8
FARAon написал(а):
нажать "SAVE" .

всмысле кодом, макросом


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Вт, июл 22 2014, 07:21 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 29 2012, 16:47
Сообщения: 85
Цитата:
Добрый день! В VBA и VBS не силен, не говоря о ABAP.


Это сильное заявление.
Начните с описания задачи... а то получается, что Вы, предлагаете, то чего не знаете...
Возможно вообще не там ищите?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Вт, июл 22 2014, 09:50 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 11 2014, 15:50
Сообщения: 8
Crystal_Ra написал(а):
Цитата:
Добрый день! В VBA и VBS не силен, не говоря о ABAP.


Это сильное заявление.
Начните с описания задачи... а то получается, что Вы, предлагаете, то чего не знаете...
Возможно вообще не там ищите?


Знаю, а точнее в процесе освоения VBA и C+, с АВАР не знаком и не особо хочу :)
просто прошу помощи проффесионалов. :D


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Вт, июл 22 2014, 13:51 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
FARAon написал(а):
Знаю, а точнее в процесе освоения VBA и C+, с АВАР не знаком и не особо хочу :)
просто прошу помощи проффесионалов. :D

Так в вашей просьбе ничего про ABAP не присутствует :roll:

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Ср, июл 23 2014, 12:44 
Специалист
Специалист
Аватара пользователя

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

Надумался вариант "нажимания Save". Он такой же безбашенный, как и основное решение :) Я назвал его по-револьверному "стрельбой с двух рук". Суть в следующем. На экране два приложения: одно SAP, всопроизводящее скрипт, другое - пусть Excel с VBA-макросом нажатия кнопки в SAP. Текст макроса примерно такой:
Code:
Sub pressSave()
    AppActivate "Сохранить как"
    SendKeys "myExcelFilename{TAB 2}{ENTER}"
End Sub
Ведем себя так. Сидим, наблюдаем за выполнением в SAP. Появилось окно сохранения - нырк в Excel и запускаем макрос (можно приделать к нему удобную кнопку). Далее - снова в SAP смотреть как выполняется следующая итерация и т.д.

Дальнейшая фантазия может вывести на чтение имени файла из заранее заготовленного в Excel списка и запуск макроса по таймеру через определенные промежутки времени, когда по расчетам должно появляться окно "Сохранить как". Ну, возможно, пропадут некоторые "очередные" названия файлов. Думаю, это не страшно. Зато в этом случае во время выполнения можно будет сходить пообедать.

А вообще лет 15 назад, когда я SAP еще не знал ну просто никак, при помощи Excel и SendKeys с просчитанными нажатиям клавиш мне удалось пакетно создать в SAP около 5 тысяч записей материалов. Компьютер на работе был оставлен работать на ночь, возле него лежала записка уборщице "Не дышать на мышь и клаву!!". Утром команда консультанов, приехавших тогда нас обучать, была в шоке и как-то покровительственного высокомерия у них сразу поубавилось... :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Ср, июл 23 2014, 12:58 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 11 2014, 15:50
Сообщения: 8
Gustav написал:
FARAon написал(а):
нажать "SAVE" .
всмысле кодом, макросом


Великолепно, а как (стесняюсь спросить) в самом скрипте вызвать ексельчик (с вашим коварным кодом) чтобы не трогать руками?
Cпс


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Ср, июл 23 2014, 13:25 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 29 2012, 16:47
Сообщения: 85
Браво! Шнобелевская премия!!! :shumlol:


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Ср, июл 23 2014, 14:13 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Вот, "Горячие пирожки" с таймером! Только что проверил сам, аж дыхание замерло от восторга - ни одного номера из 10 запланированных не пропало, не взирая на разные интервалы запуска скрипта в SAP. А между 5 и 6 шагами вообще сходил в файл vbs, чуть подправил код. А Excel тем временем честно крутил очередной бесконечный цикл, ожидая появления окна "Сохранить как".
Code:
Sub pressSave()
   
    Static i     As Long
    Dim schedule As Boolean
    Dim fileName As String
   
    On Error Resume Next
   
    i = i + 1
    schedule = True
    If i = 10 Then schedule = False
   
    Do
        Err.Clear
        DoEvents
        AppActivate "Сохранить как"
    Loop Until Err.Number = 0
   
    SendKeys "myExcelFile_" & i & "{TAB 2}{ENTER}"
   
    Application.OnTime EarliestTime:=Now + TimeValue("00:00:15"), _
                       Procedure:="pressSave", _
                       schedule:=schedule
End Sub
По окончании работы по расписанию обнаружил в папке файлы с именами от myExcelFile_1 до myExcelFile_10. Последовательность работы, надеюсь понятна: сначала запускаем эту процедуру в Excel, потом идём в SAP и запускаем скрипт. Разумеется, во время этой совместной работы следует исключить возможность появления окон с названием "Сохранить как" от других (третьих) приложений.

FARAon написал(а):
а как (стесняюсь спросить) в самом скрипте вызвать ексельчик (с вашим коварным кодом) чтобы не трогать руками?
К сожалению, думаю, что никак. Но если вдруг найдёте способ такого запуска, непременно сообщите.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Чт, июл 24 2014, 04:15 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 11 2014, 15:50
Сообщения: 8
Gustav написал:
Вот, "Горячие пирожки" с таймером! .


Браво! Густав! Браво!

Подскажите еще пжслт если файл такой существует, то он открывает новое окошко типа заменить файл. прикрутил это событие, но сенд кей не работает в новом аппактивэйт. Что дописать в код чтобы он если такой файл есть пересохранял и не ругался.

спс


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBS сценарий
СообщениеДобавлено: Чт, июл 24 2014, 09:29 
Специалист
Специалист
Аватара пользователя

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

Вот же ж! Смотрю, дай Вам палец - руку оттяпаете! :) Вариант с кнопкой и так заднепроходной, так сказать, пожарный вариант, "на безрыбье", "очумелые ручки", а Вы еще хотите анализ прикрутить, появилось или нет окно предупреждения о перезаписи файла. Называйте файлы абсолютно уникальным именами (с датой-временем на конце) или чистите папку перед запуском, т.е. не допускайте появления окна запроса о перезаписи. Если уж хочется лишний код пописать, то проверяйте существование файла в самой процедуре в Excel и либо изменяйте совпадающее имя из списка на новое, либо делайте файлу Kill в директории.

P.S. А впрочем попробуйте вот такой вариант (хотя это уже совсем "ку-ку"):
Code:
Sub pressSave2()
   
    Static i     As Long
    Dim schedule As Boolean
    Dim fileName As String
    Dim t1       As Date
   
    On Error Resume Next
   
    i = i + 1
   
    schedule = True
    If i >= 10 Then schedule = False
   
    'ожидание появления окна "Сохранить как"
    Do
        Err.Clear
        DoEvents
        AppActivate "Сохранить как"
    Loop Until Err.Number = 0
   
    'это нажатия клавиш в окне "Сохранить как"
    SendKeys "myExcelFile_" & i & "{TAB 2}{ENTER}"
   
    'потратим не более 5 секунд нашего времени
    'на ожидание ВОЗМОЖНОГО появления окна "Подтвердить сохранение в виде"
    t1 = Now
    Do
        Err.Clear
        DoEvents
        AppActivate "Подтвердить сохранение в виде"
    Loop Until (Err.Number = 0) Or (Now - t1 > TimeValue("00:00:05"))
   
    If Err.Number = 0 Then
        'это нажатия клавиш в окне "Подтвердить сохранение в виде"
        '(если оно таки появилось)
        SendKeys "{LEFT}{ENTER}"
    End If
   
    'планируем следующий старт процедуры (самой себя) через 10 сек
    Application.OnTime EarliestTime:=Now + TimeValue("00:00:10"), _
                       Procedure:="pressSave2", _
                       schedule:=schedule
                       
    'на всякий случай очищаем статический счетчик
    'если последующих запусков процедуры больше не планируется
    If schedule = False Then i = 0
   
End Sub

Почему-то у меня при повторных запусках упорно пропускается 1-й файл, хотя все остальные перезаписываются... Но может Вам повезет больше :)


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

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


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

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


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

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