SAP Jobsuche bei DV-Treff
Manulos
  • Manulos
  • SAP Forum - Neuling Thema Starter
vor 5 Jahre
Hallo liebe Community,

ich hoffe das dieses Thema nicht schon existiert.

Habe schon sehr viel gesucht in diesem Forum und im Netz aber noch keine Lösung. Ich hoffe Ihr könnt mir weiterhelfen. Habe gerade erst angefangen mit dem Zugriff auf SAP über Excel und bin deshalb nicht sooo versiert was die kniffe in dieser Thematik angeht.

Aus diesem Grund würde ich gerne mit euch darüber diskutieren.

Beschreibung meiner Idee:

Ich versuche Daten aus mehreren Tabellen mit Hilfe von RFC auszulesen und diese anschließend miteinander zu verknüpfen. Das auslesen von Daten über die GUI von SAP dauert einfach vieel zu lange...(bei größeren Datenpaketen)

Theoretisch würde ich gerne die Daten abrufen, die über die T-Codes QM11, QM13 und QM15 abrufen werden können. (Kann man später ja auf alles anderen Tabellen anwenden) Jedoch habe ich einfach keinen Plan wie ich die Verknüfung der Daten hinbekomme.

Mein aktueller Status:

Unten stehend einmal ein Ausschnitt meines Codes um Daten via RFC aus SAP abzurufen. Das klappt eig ganz wunderbar. Bis auf das ich die Daten nicht auf das aktuelle Jahr begrenzen kann... Hier im Bsp. ist es zunächst einmal die Tabelle QMEL. Die mir bekannten Tabellen die alles enthalten sollten was ich benötige sind die Tabellen(oder irre ich mich da, dass man aus diesen Tabellen die Q-Meldungen rekonstruieren könnte):

QMEL: Q-Meldung

QMSM: Q-Meldung-Position

QMFE: Q-Meldung-Aktionen


    Set sapConn = CreateObject("SAP.Functions") 'Create ActiveX object

    If sapConn.Connection.logon(0, False) <> True Then 'Try Logon
        MsgBox "Cannot Log on to SAP"
    End If
    'Define function
    Set objRfcFunc = sapConn.Add("BBP_RFC_READ_TABLE")
    With objRfcFunc
        .exports("QUERY_TABLE") = "QMEL"
        .exports("DELIMITER") = "|" 'Delimiter
    End With

    'Set objQueryTab = objRfcFunc.exports("QUERY_TABLE")
    'objQueryTab.Value = "QM11"
    Set objRowCount = objRfcFunc.exports("ROWCOUNT")
    objRowCount.Value = "10000"
    
    Set objOptTab = objRfcFunc.tables("OPTIONS")
    Set objFldTab = objRfcFunc.tables("FIELDS")
    Set objDatTab = objRfcFunc.tables("DATA")
    'First we set the condition
    'Refresh Table
    objOptTab.FreeTable
    'Then set values
    objOptTab(objOptTab.RowCount, "TEXT") = "MAWERK = 'DE10' and"
    objOptTab.Rows.Add
    objOptTab(objOptTab.RowCount, "TEXT") = "QMART = 'Q3'"
    objOptTab.Rows.Add
    objOptTab(objOptTab.RowCount, "TEXT") = "QMDAT = '" & Year(Now) & ****'" 'Funktioniert nicht

    'Next we set fields to obtain
    'Refresh table
    objFldTab.FreeTable
    'Then set values
    objFldTab.Rows.Add
    objFldTab(objFldTab.RowCount, "FIELDNAME") = "MATNR"
    objFldTab.Rows.Add
    objFldTab(objFldTab.RowCount, "FIELDNAME") = "QMDAT"
    objFldTab.Rows.Add
    objFldTab(objFldTab.RowCount, "FIELDNAME") = "QMART"
    
    If objRfcFunc.Call = False Then
        MsgBox objRfcFunc.Exception
        Exit Sub
    End If

    For Each objDatRec In objDatTab.Rows
        For Each objFldRec In objFldTab.Rows
            stopp = 1
            Cells(objDatRec.Index + 1, objFldRec.Index) =   Mid(objDatRec("WA"), objFldRec("OFFSET") + 1, objFldRec("LENGTH"))
        Next
    Next

Meine Probleme und Unstimmigkeiten:

Im folgenden eine kurze Auflistung meiner bestehenden Probleme.

  • In keiner der Tabellen bekomme ich Zugriff oder einen Bezug auf den Meldestatus..., kann man diesen in den Tabellen abrufen?(Bin bei uns leider in so weit eingeschränkt, dass ich keine ABAP Programmierung machen kann.)

  • Ich bekomme keine Verknüfung zwischen den einzelnen Tabellen hin. Wir haben in unserem System millionen von Daten, sodass ich gezwungen bin diese auf meine Bedürfnisse zu begrenzen. Doch z.B. kann ich QMFE und QMSM nicht auf das Werk (bei uns DE10) begrenzen. Da in QMEL das Werk vorhanden ist, hatte ich an eine Art Tabellenaufruf mit Argument gedacht. Ich glaube jedoch das dies nicht möglich ist..

    Quasi aquivalenz zu:

    QMSM(QMEL.QMNUM)

    QMFE(QMEL.QMNUM)

    (nur von der Idee, nicht die Syntax)

    Dadurch hätte ich die Werte aus den Tabelle zu einer bestimmten QMNUM

  • Die Einschränkung der Daten auf bestimmte Parameter oder ein definiertes Toleranzband zu setzen klappt ebenfalls nur bedingt. Eine Dokumentation bzgl. der möglichen Options habe ich noch nicht gefunden. (gehört doch eig zum FB RFC und den darin einstellbaren Parametern oder?)

Sobald eine Verknüfung zwischen den Tabellen (der eindeutigen Q-Nummer) besteht, ist alles weitere nur noch Datenverarbeitung in Excel.

Ich hoffe es ist verständlich beschrieben...

Ich freue mich auf eure Antworten😍

Ganz liebe Grüße

Manulos

Förderer

Manulos
  • Manulos
  • SAP Forum - Neuling Thema Starter
vor 5 Jahre
Verstehe nicht wieso das Format so verschoben ist, aber in der Druckansicht ist der volle Text sichtbar...

(Optionen -> Duckansicht)

LG

Alpmann
vor 5 Jahre
Hallo Manulos,

im ersten Schritt würde ich auch über den RFC_READ_TABLE mir die Meldungen aus der Tabelle QMEL holen.

Als zweiten Schritt kannst du über den RFC fähigen Funktionsbaustein BAPI_QUALNOT_GETDETAIL an alle Details kommen und musst nicht zwingend wissen, in welchen Tabellen die Daten stehen. Sogar Texte bekommt man geschenkt.

Mit freundlichen Grüßen

Matthias Alpmann

Manulos
  • Manulos
  • SAP Forum - Neuling Thema Starter
vor 5 Jahre
Hallo Matthias Alpmann,

vielen Dank für deine Antwort!

Habe mich mal anhand deiner Information versucht.

Die Funktion aufzurufen klappt analog zu der RFC-Funktion.

Dann habe ich versucht direkt auf die Meldung zuzugreifen, weiß aber nicht wie ich alle Informationen abrufen kann.

Hast du bereits Erfahrung mit der BAPI_QUALNOT_GETDETAIL Funktion und könntest mir ein Bsp. dafür bereitstellen, wie ich Informationen zu einer Q-Nummer bekomme?

Leider ist die Fehleranalyse in VBA mit SAP für mich sehr unübersichtlich...


Set Bapi_Fb = sapConn.Add("BAPI_QUALNOT_GETDETAIL")
Bapi_Fb.Exports("NUMBER") = 200626578
'Set i_notitem = Bapi_Fb.Imports("NOTITEM")

Liebe Grüße

Manulos

Manulos
  • Manulos
  • SAP Forum - Neuling Thema Starter
vor 5 Jahre
Hallo,

hab mal versucht etwas zu "BAPI_QUALNOT_GETDETAIL" zu recherchieren, bin jedoch nicht wirklich fündig geworden.

Bin bei meinen Code einmal davon ausgegangen, dass ich eine Meldungsnummer kenne, wie es im bisherigen Code bereits war.

Ich habe einen Code, den ich zu einem ähnlichen Thema gefunden habe, modifiziert (da ich keine weiteren Informationen dazu finden konnte)

Beim Versuch die Detailinfos über die "BAPI_QUALNOT_GETDETAIL" Funktion zu erhalten mache ich scheinbar einen dummen Fehler oder es fehlt etwas. (Vielleicht sind auch die Parameter falsch...)


Dim objBAPIControl As Object
Set objBAPIControl = CreateObject("SAP.Functions")
'...


'...

Set objQDetail = objBAPIControl.Add("BAPI_QUALNOT_GETDETAIL")

ActiveSheet.Cells(1, 1) = "Meldungsnummer" 'Überschrift
ActiveSheet.Cells(1,2) = "Info" 'Überschrift


'Input, zu dem ich die Information erhalten will
objQDetail.exports("NUMBER") = 200439149  

returnFunc = objQDetail.Call

If returnFunc = True Then
            Dim position As Object
            Set position = objQDetail.imports("NOTITEM")
End If

Leider sind alle Objekte leer, sodass keine Infos vorhanden sind, die man abrufen könnte...

Irgendwie stehe ich auf dem Schlauch.

Hat vielleicht jemand eine Idee.

Liebe Grüße

Manulos

Alpmann
vor 5 Jahre
Hallo Manulos,

hier mal ein Beispiel (ist aber mittels Access realisiert und nicht mit Excel - damit man besser Daten verknüpfen kann).

Sehr wahrscheinlich ist bei deinem Code nur die Übergabe falsch (fehlende Vornullen). Die Werte, die du mittels RFC_READ_TABLE bekommen hast, mußt du auch so weiterverarbeiten.

In meinem Code hier sind nicht alle Felder der einzelnen Tabellen mit aufgeführt.

' Lesen der QM-Meldungen über Funktionsbaustein

Set tabQS = db.OpenRecordset("QS_Liste_aus_SAP", dbOpenDynaset)

While tabQS.EOF = False

QMNUM = tabQS![QMNUM]

SysCmd acSysCmdSetStatus, "Lese Meldung " & QMNUM & "..."

Set FUBAU_QM = functionCtrl.Add("BAPI_QUALNOT_GETDETAIL")

With FUBAU_QM

.Exports("NUMBER") = tabQS![QMNUM]

End With

Set qm_header = FUBAU_QM.Imports("NOTIFHEADER_EXPORT")

Set QM_TEXT = FUBAU_QM.Tables("NOTLONGTXT")

Set qm_pos = FUBAU_QM.Tables("NOTITEM")

Set QM_URSACHE = FUBAU_QM.Tables("NOTIFCAUS")

Set QM_AKTIONEN = FUBAU_QM.Tables("NOTIFACTV")

Set QM_MASS = FUBAU_QM.Tables("NOTIFTASK")

Set QM_PARTNER = FUBAU_QM.Tables("NOTIFPARTNR")

'Aufruf des FUBAs

ret = FUBAU_QM.Call

tabQS.Edit

tabQS![Umfang_UmfangNr] = Umfang

tabQS![NOTIF_TYPE] = qm_header.Value(2) ' NOTIF_TYPE

tabQS![SHORT_TEXT] = qm_header.Value(3) ' SHORT_TEXT

tabQS![PRIORITY] = qm_header.Value(4) ' PRIORITY

tabQS![NOTIFTIME] = qm_header.Value(5) ' NOTIFTIME

tabQS![NOTIF_DATE] = qm_header.Value(6) ' NOTIF_DATE

...

tabQS.Update

' Positionen übernehmen

If qm_pos.RowCount > 0 And ret = True Then

For i = 1 To qm_pos.RowCount

tabQS_NOTITEM.AddNew

tabQS_NOTITEM![QMNUM] = QMNUM

tabQS_NOTITEM![NOTIF_NO] = qm_pos(i, "NOTIF_NO")

tabQS_NOTITEM![ITEM_KEY] = qm_pos(i, "ITEM_KEY")

tabQS_NOTITEM![TEXT_KEY] = "0000" & qm_pos(i, "ITEM_KEY")

tabQS_NOTITEM![DESCRIPT] = qm_pos(i, "DESCRIPT")

tabQS_NOTITEM![D_CAT_TYP] = qm_pos(i, "D_CAT_TYP")

tabQS_NOTITEM![D_CODEGRP] = qm_pos(i, "D_CODEGRP")

tabQS_NOTITEM![D_CODE] = qm_pos(i, "D_CODE")

...

tabQS_NOTITEM.Update

Next i

End If

' Ursachen

If QM_URSACHE.RowCount > 0 And ret = True Then

For i = 1 To QM_URSACHE.RowCount

' nur nicht gelöschte Ursachen einlesen

If QM_URSACHE(i, "DELETE_FLAG") <> "X" Then

tabQS_NOTIFCAUS.AddNew

tabQS_NOTIFCAUS![QMNUM] = QMNUM

tabQS_NOTIFCAUS![NOTIF_NO] = QM_URSACHE(i, "NOTIF_NO")

tabQS_NOTIFCAUS![ITEM_KEY] = QM_URSACHE(i, "ITEM_KEY")

tabQS_NOTIFCAUS![CAUSE_KEY] = QM_URSACHE(i, "CAUSE_KEY")

...

tabQS_NOTIFCAUS.Update

End If

Next i

End If

' Aktionen

If QM_AKTIONEN.RowCount > 0 And ret = True Then

For i = 1 To QM_AKTIONEN.RowCount

If QM_AKTIONEN(i, "DELETE_FLAG") <> "X" Then

tabQS_NOTIFACTV.AddNew

tabQS_NOTIFACTV![QMNUM] = QMNUM

tabQS_NOTIFACTV![NOTIF_NO] = QM_AKTIONEN(i, "NOTIF_NO")

tabQS_NOTIFACTV![ACT_KEY] = QM_AKTIONEN(i, "ACT_KEY")

tabQS_NOTIFACTV![ITEM_KEY] = QM_AKTIONEN(i, "ITEM_KEY")

...

tabQS_NOTIFACTV.Update

End If

Next i

End If

' Maßnahmen

If QM_MASS.RowCount > 0 And ret = True Then

For i = 1 To QM_MASS.RowCount

' nur nicht gelöschte Maßnahmen einlesen

If QM_MASS(i, "DELETE_FLAG") <> "X" Then

tabQS_NOTIFTASK.AddNew

tabQS_NOTIFTASK![QMNUM] = QMNUM

tabQS_NOTIFTASK![NOTIF_NO] = QM_MASS(i, "NOTIF_NO")

tabQS_NOTIFTASK![TASK_KEY] = QM_MASS(i, "TASK_KEY")

...

tabQS_NOTIFTASK.Update

End If

Next i

End If

' Partner

If QM_PARTNER.RowCount > 0 And ret = True Then

For i = 1 To QM_PARTNER.RowCount

tabQS_NOTIFPARTNR.AddNew

tabQS_NOTIFPARTNR![QMNUM] = QMNUM

tabQS_NOTIFPARTNR![OBJECT_NO] = QM_PARTNER(i, "OBJECT_NO")

tabQS_NOTIFPARTNR![PARTN_ROLE] = QM_PARTNER(i, "PARTN_ROLE")

tabQS_NOTIFPARTNR![COUNTER] = QM_PARTNER(i, "COUNTER")

...

tabQS_NOTIFPARTNR.Update

Next i

End If

tabQS.MoveNext

Wend

tabQS.Close

Mit freundlichen Grüßen

Matthias Alpmann

Manulos
  • Manulos
  • SAP Forum - Neuling Thema Starter
vor 5 Jahre
Hallo Matthias Alpmann ,

genial, du hattest Recht, dass ich die gesamte Zahl mit führenden Nullen hätte verarbeiten müssen....

Komme jetzt auch an einen Teil der Informationen die ich benötige!!! :)

Ein paar Fragen stellen sich mir jedoch noch, wenn ich deinen Code betrachte.

1. Woher weißt du, dass du "NOTIFHEADER_EXPORT" über Import und z.B. NOTLONGTXT über Tables ansprichst um diese zu exportieren?

Set qm_header = FUBAU_QM.Imports("NOTIFHEADER_EXPORT")

Set QM_TEXT = FUBAU_QM.Tables("NOTLONGTXT")

2. Woher bekommt man die Information über der einzelnen Tabellen? Also den Namen um auf den Inhalt der Tabelle zuzugreifen? Das hätte ich ohne deinen Code nie gefunden...

qm_pos(i, "NOTIF_NO")

qm_pos(i, "D_CODEGRP")

3. Habe in allen Tabellen und Headern geschaut, finde jedoch den Status der Meldung nirgends, weißt du ob man diesen noch Abfragen kann?

Vielen vielen Dank für deiner super Hilfe!!!!😍

Gruß

Manulos

Alpmann
vor 5 Jahre
Hallo Manulos,

schau mal in die Transaktion SE37. Funktionsbaustein ist BAPI_QUALNOT_GETDETAIL.

Unter dem Reiter Import findest du das Feld NUMBER.

Unter dem Reiter Tabellen findest du die Tabellen

NOTLONGTXT - Meldungslangtext

NOTITEM - Arbeitstabelle Meldungsposition

NOTIFCAUS - Meldungsursache

NOTIFACTV - Arbeitsstruktur Aktionen

NOTIFTASK - Arbeitstabelle Maßnahmen

NOTIFPARTNR - Partner zur Anzeige

RETURN - Returnparameter

Da du über RFC von der "anderen Seite" kommst, sind also die Import Felder/Tabellen in Excel/Access unter Export.

In der SE37 kommst du mit Doppelklick auf die Tabellen an die Felder. Was von SAP an der Stelle leider nicht so schön ist, ist das die Feldnamen hier nicht immer mit den Datenbankfeldern der entsprechenden Tabelle übereinstimmen. Das würde manchmal schon einiges an Zeit einsparen.

Viel Spaß mit deinem neuen Wissen bei weiteren Projekten. Mann kann da schon einiges machen mittels RFC...

Mit freundlichen Grüßen

Matthias Alpmann

Manulos
  • Manulos
  • SAP Forum - Neuling Thema Starter
vor 5 Jahre
Hallo Matthias Alpmann,

vielen vielen Dank für deine tollen und hilfreichen Informationen!!!

Bin bzgl. dieses Transaktionscodes mit unserer IT auf Kriegsfuß....

Zitat:

"...We understand your need, but there is no practice of giving SE37 access to any Business users and moreover..."

.....bin soooo kurz vor dem Ziel 😢

Mal schauen ob ich irgendwie anders an die Infos komme.

Weißt du ob dieser FuBa standardisiert ist, sodass der Aufbau und die Infos bzw. Felder überall gleich sind?

Aller besten Dank!!

Mit freundlichem Gruß

Manulos