Per capire meglio il comportamento delle chiamate, con differenti tipi di variabili numeriche, ho costruito un FM che accetta in ingresso un numero e poi lo riporta in output su campi diversi che utilizzano vari tipi di definizione.
Ho preparato quindi un foglio Excel che si collega a SAP, passa il numero, poi lo riprende e lo espone usando i differenti parametri.
Queste le versioni su cui ho lavorato:
- Windows 10 pro
- Excel 2016
- SAPGui 750 comp. 2
- SAP R/3 EHP8
Questa la funzione: Z_TEST_CALL_RFC
Parametri di importazione:
Parametri di Esportazione:
Codice funzione:
FUNCTION z_test_call_rfc.
*"----------------------------------------------------------------------
*"*"Interfaccia locale:
*" IMPORTING
*" VALUE(NUMERO) TYPE MARD-INSME OPTIONAL
*" VALUE(MATNR) TYPE MARD-MATNR OPTIONAL
*" EXPORTING
*" VALUE(O_INT4) TYPE CALL
*" VALUE(O_QUAN13) TYPE MARD-INSME
*" VALUE(O_CURR) TYPE MBEW-VERPR
*" VALUE(O_TYPINT8) TYPE TYPINT8
*" VALUE(O_FLTP) TYPE NO_DAYS
*" VALUE(O_DEC17) TYPE NUMROWS
*" VALUE(O_MAT) TYPE MARA-MATNR
*"----------------------------------------------------------------------
o_int4 = numero.
o_quan13 = numero.
o_curr = numero.
O_TYPINT8 = numero.
O_FLTP = numero.
O_DEC17 = numero.
O_MAT = matnr.
ENDFUNCTION.
Questo il foglio Excel, per il test si scrive un numero e poi si preme il bottone "Call RFC Function".
questi i risultati che trovo:
Tipo Note
INT4 funziona con interi
QUAN13 funziona fino a 99.999,999
CURR funziona fino a 9.999,99
TYPINT8 non funziona
FLTP funziona
DEC17 funziona con interi
Il file Excel contiene il foglio "Logon" dove riportare i dati di collegamento:
Qui potete scaricare il foglio excel di esempio: Z_TEST_CALL_RFC.xls
Le miei solite annotazioni generali:
- Di norma includo le informazioni di Logon nel codice VBA e poi lo proteggo con una password poichè altrimenti sono in chiaro. Anche così non è che sia una protezione molto solida, ma mi sembra il minimo.
- nel PC deve essere installata la SAPGUI (che contiene le DLL per poter attivare il collegamento).
- se nel server SAP è attivo il firewall deve essere aperta in ingresso la porta tcp 33nn (nn=<system number>), normalmente per le connessioni sapgui è aperta la 32nn.
- consiglio di definire un utente di tipo S (servizio) che, in pratica, non può effettuare il logon da GUI.
Riporto le macro contenute nel foglio.
Macro collegata al pulsante:
Public ok_login As Integer
Sub main()
Dim R3 As Object
Set R3 = CreateObject("SAP.Functions")
zlogin R3
If ok_login = 0 Then
callRFC R3
R3.Connection.Logoff
End If
End Sub
Sub zlogin(R3 As Object)
R3.Connection.ApplicationServer = Sheets("Logon").Cells(1, 2).Value
R3.Connection.SystemNumber = Sheets("Logon").Cells(2, 2).Value
R3.Connection.User = Sheets("Logon").Cells(3, 2).Value
R3.Connection.Password = Sheets("Logon").Cells(4, 2).Value
R3.Connection.client = Sheets("Logon").Cells(5, 2).Value
R3.Connection.Language = Sheets("Logon").Cells(6, 2).Value
'R3.Connection.ApplicationServer = ""
'R3.Connection.SystemNumber = nn
'R3.Connection.User = ""
'R3.Connection.Password = ""
'R3.Connection.client = nnn
'R3.Connection.Language = ""
' Logon a SAP e controllo se la connessione è stabilita
If R3.Connection.Logon(0, True) <> True Then
MsgBox "Impossibile collegarsi a SAP!" 'Messaggio di errore
ok_login = 1
Exit Sub
Else
'MsgBox "OK: Collegato a SAP!"
ok_login = 0
End If
End Sub
Per la chiamata RFC
Sub callRFC(R3 As Object)
' Cancello dati precedenti
Sheets("RFC").Select
Range("e4:e100").Select
Selection.ClearContents
Range("B2:B2").Select
' Definizione funzione RFC
Set myFuncRFC = R3.Add("Z_TEST_CALL_RFC")
' Definizione degli oggetti di interfaccia
Dim i_matnr, i_numero As Object
Dim i_num As Double
' Parametri in ingresso
Set i_matnr = myFuncRFC.exports("MATNR")
Set i_numero = myFuncRFC.exports("NUMERO")
' Valorizzo i parametri in ingresso con i campi del foglio
i_matnr.Value = Sheets("RFC").Cells(2, 2).Value
i_num = Sheets("RFC").Cells(3, 2).Value
i_numero.Value = Str(i_num)
' Chiamata alla funzione SAP
If myFuncRFC.call = False Then
MsgBox myFuncRFC.Exception
End If
' Ricevo i valori di ritorno dalla funzione
Set o_MAT = myFuncRFC.imports("O_MAT")
Set o_INT4 = myFuncRFC.imports("O_INT4")
Set o_QUAN13 = myFuncRFC.imports("O_QUAN13")
Set o_CURR = myFuncRFC.imports("O_CURR")
Set o_TYPINT8 = myFuncRFC.imports("O_TYPINT8")
Set O_FLTP = myFuncRFC.imports("O_FLTP")
Set O_DEC17 = myFuncRFC.imports("O_DEC17")
' Porto i valori di ritorno nel foglio
Sheets("RFC").Cells(3, 5) = o_MAT
Sheets("RFC").Cells(4, 5) = o_INT4
Sheets("RFC").Cells(5, 5) = o_QUAN13
Sheets("RFC").Cells(6, 5) = o_CURR
Sheets("RFC").Cells(7, 5) = o_TYPINT8
Sheets("RFC").Cells(8, 5) = O_FLTP
Sheets("RFC").Cells(9, 5) = O_DEC17
Set myFuncRFC = Nothing
End Sub
Nessun commento:
Posta un commento