Текущее время: Сб, июн 28 2025, 13:41

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


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

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


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

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