SAP GUI VBScript для вырезания и вставки кусками с изменением данных - PullRequest
0 голосов
/ 07 мая 2018

Чтобы обойти ошибку времени выполнения, мне нужно прочитать из таблицы SAP AGR_1251 порциями, используя VBScript, когда я выполняю запрос (SE16 | AGR_1251). Я получаю эту ошибку TSV_TNEW_PAGE_ALLOC_FAILED - Нет больше места на диске для расширения внутренней таблицы.

В качестве обходного пути мы вручную копируем 750 ролей пользователя по ролям за раз, добавляем «*» к тем, которые заканчиваются определенным символом, а затем вставляем его обратно в диалоговое окно множественного выбора, чтобы получить AGR_1251. извлечь результаты в кусках.

Я не могу понять, как это сделать в VBScript. Как программно порционировать эти данные? В идеале я бы тоже его дедуплицировал, но это не обязательно.

Код должен работать как на vbscript, так и на javascript, поэтому я не могу использовать Excel или другие инструменты Windows, такие как wscript. Наилучшая идея, которая у меня есть, - прокручивать и копировать только роли в файл, читать их обратно в массив и делать дедупликацию, когда я их читаю, затем изменять их, а затем возвращаться к списку, чтобы отсортировать результаты.

Это ПУТЬ выше моих почти несуществующих навыков работы с VBScript. Я не могу быть единственным, у кого была эта проблема. Может кто-нибудь указать мне примеры кода, который делает это?

Я также открыт для предложений относительно лучшего подхода. Я думаю, что мое решение, по меньшей мере, глупо.

1 Ответ

0 голосов
/ 12 июня 2018

ОК, этот код ошибочен с некоторыми ненужными переменными, но работает.

Sub Save_AGR_1251s(Tcodes_array,Chunk_size)
    Go_AGR_1251
    writelog("Processing " & ubound(Tcodes_array) & " Tcodes in AGR_1251...")
    k = 0
    s = Chunk_size
    max = ubound(Tcodes_array)
    part = 0
    roles_processed = 0
    For i = 0 To max Step s
        Go_AGR_1251
        session.findById("wnd[0]/usr/txtMAX_SEL").text = ""
        session.findById("wnd[0]/usr/txtMAX_SEL").setFocus
        session.findById("wnd[0]/usr/txtMAX_SEL").caretPosition = 11
        session.findById("wnd[0]/usr/btn%_I1_%_APP_%-VALU_PUSH").press
        k = i + s
        counter = 0
        part = part + 1
        If k > max Then k = max End If
        For j = i To k-1
            ' writelog("Save_AGR_1251s Processing Tcode: " & Tcodes_array(j))
            If (Tcodes_array(j) <> "STMS" or Tcodes_array(j) <> "SCC4") Then
                'NOTE: The slow insert is used on XXXX Prod as a work around to odd UI behavior - change with caution - But SLOW!!
                session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,7]").setFocus
                session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,7]").text = Tcodes_array(j)
                session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,7]").caretPosition = 1
                'VKey 13 = Shift-F1 (insert new row)
                session.findById("wnd[1]").sendVKey 13
                If Debug_flag = True Then
                    writelog("i=" & i  & "  j=" & j  & "  k=" & k  & "  s=" & s &" max=" & max &"  counter= " & counter)
                    writelog("part =" & part & "  roles= " & roles & "roles_processed="& roles_processed & "  Tcodes_array= " & Tcodes_array(j))
                End If ' Debug_flag 
                counter = counter + 1
                roles_processed  = roles_processed  + 1
            End If ' Tcodes_array
        Next 'for j to k
        session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,1]").setFocus
        session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,1]").caretPosition = 13
        session.findById("wnd[1]/tbar[0]/btn[8]").press
        session.findById("wnd[0]").sendVKey 8
        session.findById("wnd[0]").sendVKey 45
        session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").select
        session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").setFocus
        session.findById("wnd[1]/tbar[0]/btn[0]").press
        session.findById("wnd[1]/usr/ctxtDY_PATH").text = dir
        file_name = AGR_1251_filename & "_Part_" & part & c_dash & postfix & Datafile_ext
        session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = file_name
        writelog("Saving file: " & dir & file_name)
        session.findById("wnd[1]/usr/ctxtDY_FILE_ENCODING").text = File_encoding
        session.findById("wnd[1]/usr/ctxtDY_PATH").setFocus
        session.findById("wnd[1]/usr/ctxtDY_PATH").caretPosition = 16
        session.findById("wnd[1]").sendVKey 11
        Go_Home
    Next ' For i
End Sub

Обратите внимание, что вы можете сделать это намного быстрее на большинстве систем, просто выполнив это

for i = 1 to 100
    session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1," & 7  & "]").text = "Test " & i
next 'for i
...