sabato 25 maggio 2019

Test passaggio valori Excel-RFC.

In questo post ho mostrato che, nel trasferimento di numeri in chiamate RFC remote, alcuni campi numerici e per valori molto alti risultavano vuoti.

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