Willkommen Gast! Um alle Funktionen zu aktivieren müssen Sie sich Anmelden oder Registrieren.

Mitteilung

Icon
Error

Optionen
Gehe zum aktuellsten Beitrag Gehe zum letzten Ungelesenen
Offline Manulos  
#1 Geschrieben : Dienstag, 30. Juli 2019 09:52:26(UTC)
Manulos

Beiträge: 6
Germany
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

Code:

    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 AntwortenLove

Ganz liebe Grüße
Manulos

Nehmen Sie an dieser Diskussion teil! SAP FORUM - SAP Community LoginHier registrieren.

Offline Manulos  
#2 Geschrieben : Dienstag, 30. Juli 2019 10:19:30(UTC)
Manulos

Beiträge: 6
Germany
Verstehe nicht wieso das Format so verschoben ist, aber in der Druckansicht ist der volle Text sichtbar...
(Optionen -> Duckansicht)

LG

Bearbeitet vom Benutzer Dienstag, 30. Juli 2019 10:20:04(UTC)  | Grund: Nicht angegeben

Offline Alpmann  
#3 Geschrieben : Donnerstag, 8. August 2019 10:28:52(UTC)
Alpmann

Beiträge: 181
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
thanks 1 Benutzer dankte Alpmann für diesen Nützlichen Beitrag.
Manulos am 13.08.2019(UTC)
Offline Manulos  
#4 Geschrieben : Montag, 12. August 2019 13:25:59(UTC)
Manulos

Beiträge: 6
Germany
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...

Code:

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



Liebe Grüße
Manulos
Offline Manulos  
#5 Geschrieben : Dienstag, 13. August 2019 12:44:23(UTC)
Manulos

Beiträge: 6
Germany
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...)

Code:

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
Offline Alpmann  
#6 Geschrieben : Dienstag, 13. August 2019 15:27:02(UTC)
Alpmann

Beiträge: 181
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
thanks 1 Benutzer dankte Alpmann für diesen Nützlichen Beitrag.
Manulos am 14.08.2019(UTC)
Offline Manulos  
#7 Geschrieben : Mittwoch, 14. August 2019 08:56:30(UTC)
Manulos

Beiträge: 6
Germany
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!!!!Love

Gruß
Manulos
Offline Alpmann  
#8 Geschrieben : Mittwoch, 14. August 2019 10:16:58(UTC)
Alpmann

Beiträge: 181
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
Offline Manulos  
#9 Geschrieben : Donnerstag, 15. August 2019 09:14:22(UTC)
Manulos

Beiträge: 6
Germany
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 Crying

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
Benutzer, die gerade dieses Thema lesen
Das Forum wechseln  
Du kannst keine neue Themen in diesem Forum eröffnen.
Du kannst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge nicht löschen.
Du darfst deine Beiträge nicht editieren.
Du kannst keine Umfragen in diesem Forum erstellen.
Du kannst nicht an Umfragen teilnehmen.

- Impressum / Datenschutz -