VBA und SAP -> Tabellen als Parameter übergeben.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

VBA und SAP -> Tabellen als Parameter übergeben.

Postby Else3434 » Tue Dec 17, 2002 3:14 pm

Hallo,
ich möchte eine Excel Tabelle auslesen und die versch. Datensätze dann in SAP verbuchen.

Habe mir mal in der SAP Hilfe das Beispiel zu RFC_CUSTOMERS_GET angesehen. Das funktioniert auch.

Ich möchte nun wissen, wie man als Exportparameter an einen Funktionsbaustein ganze Tabellen übergibt. Einzelne Felder sind klar.

Wäre nett, wenn mir jemand ein paar Zeilen Code posten könnte.


Hier ist der Code:

Sub GetCustomer()

'

'Deklaration der Objekte und Variablen

'

Dim functionCtrl As Object
Dim sapConnection As Object
Dim theFunc As Object

'Erstellen eines Funktionsobjektes

'

Set functionCtrl = CreateObject("SAP.Functions")

Set sapConnection = functionCtrl.Connection


'

'Logon mit Initialwerten

'

sapConnection.Client = "000"

sapConnection.user = "SAPuser"

sapConnection.Language = "DE"



If sapConnection.logon(0, False) <> True Then

MsgBox "Keine Verbindung zum R/3!"

Exit Sub

End If

'

'Referenz auf Funktionsobjekt "RFC_CUSTOMER_GET"

'

Set theFunc = functionCtrl.Add("RFC_CUSTOMER_GET")

'Vorbereitung der Ausgabe auf EXCEL-Sheet

'

Worksheets(1).Select

Cells.Clear


'

'Deklaration

'

Dim customers As Object

Dim returnFunc As Boolean

Dim startzeil As Integer

Dim endcol As Integer

Dim the_name As String

startzeil = 1


'Festlegen der Importparameter für Funktionsaufruf

'

For start_char = Asc("A") To Asc("Z")


the_name = Chr$(start_char) + "*"

'

theFunc.exports("NAME1") = the_name

theFunc.exports("KUNNR") = "*"

returnFunc = theFunc.Call

die_exception = theFunc.Exception


If returnFunc = True Then

Set customers = theFunc.tables.Item("CUSTOMER_T")

endcol = 0

Call display_customers(the_name, customers, startzeil, endcol)

startzeil = endcol

Set customers = Nothing

Else

If die_exception = "NO_RECORD_FOUND" Then

Cells(startzeil, 1) = "Keine Werte vorhanden für " + the_name

startzeil = startzeil + 1

Else

MsgBox "Fehler beim Zugriff auf Funktion im R/3 ! "

Exit Sub

End If

End If

Next start_char

End Sub


Sub display_customers(aName As String, ByRef customers_table As Object, start_zeil As Integer, ByRef end_col As Integer)


'

'Anzeige des Tabellenkopfes

'

Cells(start_zeil, 1) = "KundenNr."

Cells(start_zeil, 2) = "Anrede "

Cells(start_zeil, 3) = "Kundenname " + aName

Cells(start_zeil, 4) = "PLZ"

Cells(start_zeil, 5) = "Ort"

Cells(start_zeil, 6) = "Tel.Nr "


'Hervorhebung der Fonts

Range(Cells(start_zeil, 1), Cells(start_zeil, 6)).Font.Bold = True


'

'Zeigt Inhalte der Kundentabelle an

'


bManyCustomers = False

If (bManyCustomers = False) Then

i = start_zeil + 2

For Each Customer In customers_table.Rows

Cells(i, 1) = Trim(Customer("KUNNR"))

Cells(i, 2) = Customer("ANRED")

Cells(i, 3) = Customer("NAME1")

Cells(i, 4) = Customer("PSTLZ")

Cells(i, 5) = Customer("ORT01")

Cells(i, 6) = Customer("TELF1")


i = i + 1

Next

End If


end_col = i


End Sub


wie gesagt....
meine frage ist nun, wie man hier ganze tabellen zum exportieren (also dem fb übergeben) kann.
Für diesen FB ist dies zwar nicht nötig, bzw. möglich, aber generell braucht man diese funktionalität natürlich.


Einzelne Felder werden hier mit:

theFunc.exports("NAME1") = the_name

theFunc.exports("KUNNR") = "*"

übergeben.

Ich habe soetwas ähnliches schon öfters in java gemacht (natürlich nicht excelspezifisch..)

da würde das so gehen:

//werte für plantselection

codes = function.getTableParameterList().getTable("PLANTSELECTION");
codes.appendRow();
codes.setValue ("I","SIGN");
codes.setValue ("EQ","OPTION");
codes.setValue ("0010","PLANT_LOW");
codes.setValue ("0010","PLANT_HIGH");

// führe Funktion aus

try
{
mConnection.execute(function);
}
catch(Exception connectExcep)
{
//System.out.println("connectExcep:"+connectExcep.getMessage());
System.out.println("fehler");
}

wobei "codes" die zu übergebende interne tabelle darstellt....

vom prinzip her muß das in vb genauso funktionieren....

vielleicht kannst findest du es ja raus ich bin nicht gerade ne leuchte was vb angeht...


tut mir leid, wenn das vielleicht im falschen board steht..aber VBA und SAP gab es leider nicht ;-)

Schöne Grüße und vielen dank

kevin
Else3434
.
.
 
Posts: 9
Joined: Tue Dec 17, 2002 3:14 pm

Postby Alva1590 » Tue Dec 17, 2002 3:46 pm

Hi,

Ich vermute mal, dass Du das ganze mit dem DCOM-Connector machst. Wenn Du diesen unter C:\ installiert hast, dann schau mal unter C:\Program Files\SAPpc\sapgui\rfcsdk\ccsamp\Sales.VB
Da findest Du ein ziemlich gutes Beispiel bei dem Tabellen übergeben werden.
Besonders interessant dürfte die folgende Stelle sein:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   'create an empty recordset of 'type' OrderHeaderIn
  2.  oOrder.DimAs "BapiCreateFromData", "OrderHeaderIn", oOrderHeader
  3.  If Err.Number <> 0 Then
  4.    MousePointer = vbDefault
  5.    Call ErrorMsgBox&#40;"BO_DIMAS_STRUCT", "SalesOrder", "CreateFromData", "OrderHeaderIn"&#41;
  6.    Exit Sub
  7.  End If
  8.  
  9.  'create an empty recordset of 'type' OrderItemsIn
  10.   oOrder.DimAs "BapiCreateFromData", "OrderItemsIn", otabItems
  11.   If Err.Number <> 0 Then
  12.     MousePointer = vbDefault
  13.     Call ErrorMsgBox&#40;"BO_DIMAS_TAB", "SalesOrder", "CreateFromData", "OrderItemsIn"&#41;
  14.     Exit Sub
  15.   End If
  16.  
GeSHi ©


Ich hoffe mal, das hilft Dir weiter.

Gruß,
Jens
Alva1590
.....
.....
 
Posts: 4387
Joined: Mon Dec 02, 2002 3:01 pm

Postby Alva1590 » Tue Dec 17, 2002 3:59 pm

Noch 'n Beispiel:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. private sub mysub&#40;&#41;
  2.  
  3. Dim oSession As New T20salesLib.SalesorderSessionComponent
  4.  
  5. Dim oOrders As Object
  6.  
  7. Dim oOrderList As ADODB.Recordset
  8.  
  9. Dim oReturn As ADODB.Recordset
  10.  
  11. oSession.PutSessionInfo "T20 [PUBLIC]", "TESTUSER", "LETMEIN", "EN", _
  12. "800"
  13.  
  14. Set oOrders = oSession.CreateInstance&#40;"T20.SalesOrder.1"&#41;
  15.  
  16. oOrders.DimAs "BAPIGETLIST", "SALESORDERS", oOrderList
  17.  
  18. oOrders.DimAs "BAPIGETLIST", "RETURN", oReturn
  19.  
  20. Set oOrderList = oOrders.BapiGetList&#40;CustomerNumber:="0000001000", _
  21.  
  22. SalesOrganization:="1000", SalesOrders:=oOrders&#41;
  23.  
  24. Set DataGrid1.DataSource = oOrders
  25.  
  26. DataGrid1.Refresh
  27.  
  28. Set oOrders = Nothing
  29.  
  30. Set oSession = Nothing
  31.  
  32. end sub
  33.  
GeSHi ©


Dabei ist T20Saleslib eine DCOMProxy-Komponente, DataGrid1 (GridControl).
Alva1590
.....
.....
 
Posts: 4387
Joined: Mon Dec 02, 2002 3:01 pm

Postby Walter4536 » Tue Dec 17, 2002 4:03 pm

Hallo,

noch eine kleine Anmerkung meinerseits. Eine meiner Ansicht nach gute Dokumentation findet sich auch hier:

http://msdn.microsoft.com/library/defau ... ration.asp

Gruss,
Steff
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

vielen Dank erstmal

Postby Else3434 » Wed Dec 18, 2002 8:28 am

Hallo..

vielen Dank erstmal für die Antworten.
Allerdings hab ich das ganze nicht mit dem DCOM CONNECTOR machen wollen....

das ist denke ich nur "Excel als OLE Client"....

Danke aber trotzdem...werde mir die Beispiele man anschauen.

Gruß

Kevin
Else3434
.
.
 
Posts: 9
Joined: Tue Dec 17, 2002 3:14 pm


Return to ABAP® Core

Who is online

Users browsing this forum: Bing [Bot] and 3 guests

cron