El bon candidat

Guardar finestra emergent de SAP – GUI scripting i VBA

Controlar la finestra emergent

Sovint em trobo exportant desde SAP (en aquest cas R3) la mateixa
informació repetidament en Excel (formal .xlsx), així que tinc
automatitzats gairebé tots els passos per exportar informaió desde la
GUI del popular ERP. Business Warehouse a vegades no és la sol·lució (en
molts casos no tinc a mà una query amb dades a temps real), així que
exportar dades desde la interfície gràfica es l’única manera d’obtenir
dades transaccionals en viu. El problema quan utilitzm VBA és com permetre que la finestra Excel emergent amb les dades de SAP s’obri i es guardi durant l’execució del codi.

 

Finestra de SAP R3 per exportar dades en format Excel.
Consideracions per executar el codi

Quan escric alguna macro per tercers usuaris, m’agrada limitar la seva execució mentre només hi hagi un únicfull d’Excel obert. Més d’una vegada em trobo usuaris que es dediquen a obrir i intentar fer coses en altres fulls mentre s’executa una macro. Prou.

També heu de tenir en compte que aquestes exportacions de SAP es guardaran a la carpeta temporal de Windows (així ho defineixo al següent pas, línea 21 i 22). Per tant, també m’asseguro que no hi hagi cap altre arxiu d’exportacions anteriors a la carpeta temporal amb el mateix nom. Esborro l’antic (si existeix) i endavant amb la macro.

				
					 'Permet només aquesta finestra oberta
    For Each Wkb In Application.Workbooks
        If Not (Wkb Is Application.ActiveWorkbook) Then
            Wkb.Close
        End If
    Next
    
'Compta el número de fulles obertes
    finestresobertes = Application.Workbooks.Count

'Si l'arxiu COOIS ja existeix, suprimeix-lo.
    del_File = "C:\tmp\COOIS_EXPORT.xlsx"
        If Len(Dir$(del_File)) > 0 Then
            Kill del_File
        End If
				
			
La finestra emergent no s'obre
				
					'Run COOIS query in SAP ECC
session.FindById("wnd[0]").maximize
session.FindById("wnd[0]/tbar[0]/okcd").Text = "coois"
session.FindById("wnd[0]").sendVKey 0
session.FindById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/cmbPPIO_ENTRY_SC1100-PPIO_LISTTYP").Key = "ABRAXX"
session.FindById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/ctxtPPIO_ENTRY_SC1100-ALV_VARIANT").SetFocus
session.FindById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/ctxtPPIO_ENTRY_SC1100-ALV_VARIANT").caretPosition = 10
session.FindById("wnd[0]").sendVKey 4
session.FindById("wnd[1]/usr/cntlGRID/shellcont/shell").setCurrentCell 1, "TEXT"
session.FindById("wnd[1]/usr/cntlGRID/shellcont/shell").selectedRows = "1"
session.FindById("wnd[1]/usr/cntlGRID/shellcont/shell").DoubleClickCurrentCell
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/chkP_KZ_E1").Selected = True
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtP_SYST1").Text = "TECO"
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_CWERK-LOW").Text = PlantCOOIS
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_TERST-LOW").Text = CooisStartDate
session.FindById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_TERST-HIGH").Text = CooisEndDate
session.FindById("wnd[0]/tbar[1]/btn[8]").Press
session.FindById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarButton "&NAVIGATION_PROFILE_TOOLBAR_EXPAND"
session.FindById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
session.FindById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").selectContextMenuItem "&XXL"
session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = "c:\tmp\"
session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = "COOIS_EXPORT.xlsx"
'session.FindById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 17
session.FindById("wnd[1]").sendVKey 0
				
			

Al costat podeu veure l’scripting de SAP per executar la transacció COOIS segons les necessitats de l’usuari.

La part important d’aquest retall de codi són les línies 21 i 22. La 21 perque defineixo que l’exportació en format .xlsx es guardi a la carpeta temporal de Windows (“C:/tmp/“).

I la línea 22, on defineixo exportar l’arxiu en format .xlsx. 

Fins aquí tot correcte. El problema és que un cop arribats aquí, la finestra emergent que hauria de saltar, no apareix.

La sol·lució: DoEvents

Si proveu amb fer esperar l’aplicació uns segons amb Application.Wait, no cal que ho intenteu, perque no funciona. La sol·lució passa per DoEvents

El que fa aquesta funció és aturar temporalment l’execució de la macro, permetent al processador executar altres tasques i recoxèixer altres events. La durada d’aquesta pausa és obligatòria definir-la; és la condició que s’ha de complir per mantenir aquesta aturada. Us deixo dos exemples:

– Fer un DoEvents mentre el nombre de fulls de càlcul sigui = 1 (recordeu les Consideracions per executar el codi de més amunt).

– O bé fer un DoEvents de cinc segons.

En qualsevol dels dos casos, l’exportació de dades de SAP en format Exel saltarà, i veureu com s’obre una nova finestra.

				
					'DoEvents mentre tinguem només una fulla Excel oberta'
    Do
        DoEvents
    Loop While appworkbookcount = 1
            
'Guardem l'arxiu exportat
    For Each wb In Application.Workbooks
        If InStr(wb.Name, "EXPORT") > 0 Then
            wb.Save
        End If
    Next wb
				
			
				
					'DoEvents durant cinc segons
    Dim now as long
    now = Timer()
        
        Do
            DoEvents
        Loop While (Timer < now + 5)