SAP Jobsuche bei DV-Treff
newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 7 Jahre
Hallo Forumsgemeinde,

ich hoffe ich bin hier themenmäßig richtig.

Es gibt in Excel ja die Möglichkeit in VBA über RFC Read Table Tabellen aus SAP abzurufen. Soweit so gut.

Weiß zufällig jemand von euch ob man auch mehrere Tabellen mit einem join abfragen kann, ev. auch über ein sql statement? Hab im Netzt nicht wirklich was gefunden.

mfg

newgui

Alpmann
vor 7 Jahre
Hallo newgui,

Joins gehen nicht, aber wenn du sagst, was du vor hast, dann gibt es eventuell Lösungen dafür => mit einem Funktionsbaustein der RFC fähig ist, kann man zum Beispiel Fertigungsaufträge lesen und muss dafür nur die Auftragsnummer übergeben. In welchen Tabellen die Auftragsdaten stehen und wie die verknüpft sind muss man dann nicht genau wissen.

Mit freundlichen Grüßen

Matthias Alpmann

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 7 Jahre
Hallo Matthias,

danke für deine rasche Antwort.

An und für sich gehts mir nur mal um ein Beispiel. Ich kenne die Tabellenlandschaft in SAP eigentlich ganz gut, da ich ziemlich querygeschädigt bin 😁 . Die Verknüpfungen sind daher das kleinste Problem.

Ich könnte natürlich auch den RFC_Read_Table Baustein nehmen und das Ergebnis nochmals in einen reinschmeißen. Das ist aber nicht so ganz das nonplusultra :-)

Also ich nehme jetzt mal 2 einfache Tabellen, zB VBAK mit VBAP. Select und Join über den Kundenauftrag.

Gerne auch über Tabelle AUFK verknüpft mit der AFPO mit Select und Join über den Auftrag.

Wie gesagt mir würde es mal nur um ein Beispiel gehen bzw. ob es überhaupt funktionieren könnte.

mfg

newgui

Alpmann
vor 7 Jahre
Schönen guten Morgen newgui,

hier mal ein Beispiel für das lesen von Fertigungsaufträgen (realisiert allerdings in Access). Die Übernahme der einzelnen Felder habe ich hier aber gekürzt.

Mit RFC_READ_TABLE kann man keine Joins so wie in SQL angeben. Dafür müsste das aber mit Views funktionieren - die ja auch Joins enthalten können.

Ich bin aber der Meinung, dass man mit Funktionsbausteinen, die mehr Funktionalität zur Verfügung stellen (z. B. BAPI_PRODORD_GET_DETAIL) besser dran ist. Gerade, wenn man selber nicht genau weiß, wie das SAP arbeitet im Detail. Ein gutes Beispiel wäre hier zum Beispiel das ermitteln von offenen Bestellungen. Hier habe ich auch schon mal mittels RFC Daten aus der MD04 gelesen. Hier dann alles von Hand zu berücksichtigen ist schwer (Einteilungen, Auftragsbestätigungen, Auftragsbestätigung hat höhere Menge wie Einteilungen, ...). Lieber einen Baustein nehmen, der einem so etwas abnimmt.

Set FunctionCtrl = CreateObject("SAP.Functions")

Set SapConnection = FunctionCtrl.Connection

SapConnection.client = SAP_Client

SapConnection.User = SAP_User

SapConnection.Password = SAP_User_Passwort

SapConnection.Language = SAP_Sprache

SapConnection.HostName = SAP_Host

SapConnection.SystemNumber = SAP_SystemNumber

SapConnection.tracelevel = 0

If Not SapConnection.Logon(0, True) Then

MsgBox "SAP Anmeldung fehlgeschlagen!"

Exit Function

Else

' MsgBox "Logon erfolgreich!!"

End If

' Daten löschen

db.Execute ("DELETE * FROM [SAP Fertigungsaufträge Kopf];")

db.Execute ("DELETE * FROM [SAP Fertigungsaufträge Arbeitsplan];")

db.Execute ("DELETE * FROM [SAP Fertigungsaufträge Positionen];")

db.Execute ("DELETE * FROM [SAP Fertigungsaufträge FHM];")

Set tabKopf = db.OpenRecordset("SAP Fertigungsaufträge Kopf", dbOpenDynaset)

Set tabAPL = db.OpenRecordset("SAP Fertigungsaufträge Arbeitsplan", dbOpenDynaset)

Set tabPOS = db.OpenRecordset("SAP Fertigungsaufträge Positionen", dbOpenDynaset)

Set tabFHM = db.OpenRecordset("SAP Fertigungsaufträge FHM", dbOpenDynaset)

Set tabAuftrag = db.OpenRecordset("Fertigungsaufträge_Freigaben_01", dbOpenDynaset)

While tabAuftrag.EOF = False

Set fubau = FunctionCtrl.Add("BAPI_PRODORD_GET_DETAIL")

fubau.exports("NUMBER") = tabAuftrag![aufnr]

fubau.exports("ORDER_OBJECTS").Value(1) = "X"

fubau.exports("ORDER_OBJECTS").Value(2) = "X"

fubau.exports("ORDER_OBJECTS").Value(3) = "X"

fubau.exports("ORDER_OBJECTS").Value(4) = "X"

fubau.exports("ORDER_OBJECTS").Value(5) = "X"

fubau.exports("ORDER_OBJECTS").Value(6) = "X"

fubau.exports("ORDER_OBJECTS").Value(7) = "X"

fubau.exports("ORDER_OBJECTS").Value(8) = "X"

Set tdata_APL = fubau.tables("OPERATION")

Set tdata_header = fubau.tables("HEADER")

Set tdata_POS = fubau.tables("POSITION")

Set tdata_FHM = fubau.tables("PROD_REL_TOOL")

'Aufruf des FUBAs

ret = fubau.Call

If tdata_header.rowcount > 0 And ret = True Then

For i = 1 To tdata_header.rowcount

tabKopf.AddNew

tabKopf![ORDER_NUMBER] = tdata_header(i, 1)

tabKopf![PRODUCTION_PLANT] = tdata_header(i, 2)

tabKopf![MATERIAL_VERSION] = tdata_header(i, 48)

tabKopf.Update

Next i

End If

Call tdata_header.freeTable

If tdata_APL.rowcount > 0 And ret = True Then

For i = 1 To tdata_APL.rowcount

tabAPL.AddNew

tabAPL![routing_no] = tdata_APL(i, 1)

tabAPL![counter] = tdata_APL(i, 2)

tabAPL![SUBOPERATION] = tdata_APL(i, 46)

tabAPL.Update

Next i

End If

Call tdata_APL.freeTable

If tdata_POS.rowcount > 0 And ret = True Then

For i = 1 To tdata_POS.rowcount

tabPOS.AddNew

tabPOS![ORDER_NUMBER] = tdata_POS(i, "ORDER_NUMBER")

tabPOS![ORDER_ITEM_NUMBER] = tdata_POS(i, "ORDER_ITEM_NUMBER")

tabPOS![MATERIAL_VERSION] = tdata_POS(i, "MATERIAL_VERSION")

tabPOS.Update

Next i

End If

Call tdata_POS.freeTable

If tdata_FHM.rowcount > 0 And ret = True Then

For i = 1 To tdata_FHM.rowcount

If Trim(tdata_FHM(i, "CTRL_KEY")) = "1" Then

tabFHM.AddNew

tabFHM![routing_no] = tdata_FHM(i, "ROUTING_NO")

tabFHM![counter] = tdata_FHM(i, "COUNTER")

tabFHM![MATERIAL_VERSION] = tdata_FHM(i, "MATERIAL_VERSION")

tabFHM.Update

End If

Next i

End If

Call tdata_FHM.freeTable

tabAuftrag.MoveNext

Wend

tabAuftrag.Close

tabAPL.Close

tabKopf.Close

tabPOS.Close

SapConnection.Logoff

Mit freundlichen Grüßen

Matthias Alpmann

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 7 Jahre
Ebenfalls schönen guten Morgen Matthias,

vielleicht sollte ich bei dir schon wieder gute Nacht schreiben.

Danke abermals für deine Antwort. Habe gemerkt, dass meine Annahme, dass sich ähnlich wie bei queries ein join in vba abbilden lässt, zielich naiv war. 😊

Bin auch nicht der Super Programmierprofi wie du sondern mehr der Copy-Paste-Abänderungsprogrammierer 😁. Bisher hats gereicht.

Irgendwann merkt man aber dann mal, dass man an Grenzen stößt, so wie jetzt.

Hätte auch nicht die Berechtigungen mir Bapis in SAP anzusehen und die Auswertung die ich machen wollte greift auf Daten einer SAP Eigenprogrammierung bei uns zurück.

Aber geht nicht gibt's nicht. Werde schon einen anderen Weg finden.

Sorry, dass ich dir so viel Mühe gemacht habe.

mfg

newgui

Tron
  • Tron
  • SAP Forum - Profi
vor 7 Jahre
Moin.

Der RFC_READ_TABLE ist jetzt nicht soooo groß und besitzt auch keine großen Abhängigkeiten und läßt sich gut kopieren.

Beste Voraussetzungen für Deinen ersten RFC-Fähigen Funktionsbaustein !!

Hier mal ein Ansatz für Y_RFC_READ_JOIN 😉


*&---------------------------------------------------------------------*
*& Report  ZTEST_JOIN_INDIRECT                                         *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

REPORT  ztest_join_indirect                                         .

DATA l_fields(80).
DATA l_join(80).
DATA l_where(80).

TYPES:
BEGIN OF ty_table,
matnr TYPE matnr,
maktx TYPE maktx,
END OF ty_table.

DATA lt_table TYPE TABLE OF ty_table.

**** STATISCHER JOIN
* SELECT mara~matnr makt~maktx
* FROM ( mara INNER JOIN makt ON  makt~matnr = mara~matnr )
* INTO TABLE lt_table
* WHERE makt~spras = 'D'.

**** DYNAMISCHER JOIN
l_fields = 'mara~matnr makt~maktx'.
l_join = '( mara INNER JOIN makt ON  makt~matnr = mara~matnr )'.
l_where ='makt~spras = ''D'''.

SELECT (l_fields) FROM (l_join) INTO TABLE lt_table WHERE (l_where).

break sapuser.

gruß Jens

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 7 Jahre
Hallo Jens,

danke für deine Antwort. Leider darf und kann ich nicht ABAP programmieren, daher ist deine Lösung für mich nicht umsetzbar.

Das ist auch der Grund warum ich es über vba machen wollte.

mfg

newgui