SAP Jobsuche bei DV-Treff
Zorro007
  • Zorro007
  • SAP Forum - Neuling Thema Starter
vor 8 Jahre
Hallo SAP-Community,

ich suche eine Möglichkeit die Daten der KOB1 bzw. CO03, dh. die Auftragsplanwerte und Istwerte bestimmte Fertigungsaufträge und deren Mengen am besten mit einem bestimmten Layout, automatisch auslesen. Ich würde auch mehrere Abfragen pro SAP-Tabelle erstellen und diese verknüpfen. Mit F1 und .., komme ich ja an die Tabellen und Felder des Berichts (KOB1 bzw. CO03).

Ich habe schon aus der LFA1 alle Lieferanten, Namen und Ust-id auslesen können.

...

'Lieferant aus Ust-id

Set FUBA_rfc_read_table = functionCtrl.Add("RFC_READ_TABLE")

With FUBA_rfc_read_table

.exports("QUERY_TABLE") = "LFA1"

.exports("DELIMITER") = "|" 'Delimiter

End With

Set T_I_Options = FUBA_rfc_read_table.Tables("OPTIONS")

Set T_I_Fields = FUBA_rfc_read_table.Tables("FIELDS")

Set T_E_Data = FUBA_rfc_read_table.Tables("DATA")

T_I_Options.AppendRow

T_I_Options(1, "TEXT") = "MANDT EQ '001'"

' T_I_Options(1, "TEXT") = "LIFNR EQ '0000651391'"

T_I_Fields.AppendRow

T_I_Fields(1, "FIELDNAME") = "LIFNR"

T_I_Fields.AppendRow

T_I_Fields(2, "FIELDNAME") = "NAME1"

T_I_Fields.AppendRow

T_I_Fields(3, "FIELDNAME") = "STCEG"

'Aufruf des FUBAs

ret = FUBA_rfc_read_table.Call

If Not (ret) Then MsgBox "Keine Daten zum Auslesen gefunden."

' Übetragen der Daten in Excel-Tabelle (z.B. immer in Tabelle1)

If T_E_Data.RowCount > 0 And ret = True Then

Debug.Print T_E_Data.RowCount

' Statusbartext ein

Application.DisplayStatusBar = True

DS_Anzahl = Min(1000, T_E_Data.RowCount)

For i = 1 To DS_Anzahl

Application.StatusBar = "Bitte warten... (" & Format(i / (DS_Anzahl), "0.00%") & ")"

DoEvents

strDataRow = T_E_Data(i, 1)

DataRow = Split(strDataRow, "|")

'Spaltenüberschriften an Excel übergeben

If Col = False Then

For x = 0 To UBound(DataRow)

Tabelle4.Cells(1, x + 1).Value = T_I_Fields(x + 1, 1)

Next x

Col = True

End If

For x = 0 To UBound(DataRow)

Tabelle4.Cells(i + 1, x + 1).Value = DataRow(x)

Next x

Next i

End If

' Statusbartext aus

Application.StatusBar = False

...

Ich habe hier die Ausbabe zunächst auf 1000 Datensätz begrenzt.

Kann ich auf ähnliche weise die Plan und Ist-Mengen und Werte auslesen?

Gibt es hier im Forum weitere Informationen zu

T_I_Options(1, "TEXT") = "MANDT EQ '001'" bzw. T_I_Options(1, "TEXT") = "LIFNR EQ '........'", ich meine allgemein die Bedingungen?

Grüße und vielen Dank. Ich habe hier im Forum schon einiges gelernt.

Zorro

Förderer

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

Ich würde im Sap erstmal die Tabellen zu der Transaktion suchen.

Die Technische Hilfe liefert häufig "nur" Ausgabestrukturen, die Dich nicht weiterbringen.

Für KOB1 mit der SE93 schauen welches Programm dahinter steht. (hier RKAEP000) und dann in der SE80 nach den DDIC Tabellen schauen.

VBAK,VBAP,CSKS,CSKB .... (meine Favoriten)

Dann mit SE16N den Inhalt prüfen, das geht schneller als jetzt schon mit VBA zu programmieren. ggf kann man RFC_READ_TABLE auch mit der SE37 aufrufen.

Die dritte Möglichkeit an die Tabellen zu kommen, ist ST05 (SQL TRACE).

So man weiß, welche Tabellen interessant sind, ruft man diese mit ihren Inhalten mit VBA ab.

viel Erfolg

Jens

Zorro007
  • Zorro007
  • SAP Forum - Neuling Thema Starter
vor 8 Jahre
Hallo Tron,

vielen Dank für die Antwort. Ich habe leider für alle 3 SE-Codes keine Berechtigung. Werde deine Favoriten-Tabellen mal anschauen.

Ich bekomme ja schon täglich alle offenen Fertigungsaufträge (Auftragsköpfe, Vorgänge und bereitfestellen Komponente für die Aufträge) ähnlich wie in der COOIS als Textdatei und lese sie für das BDE-System automatisch in MySQL ein. So ist gewährleistet, dass nur vorhandene Aufträge bebucht werden können und Rückmeldungen an SAP-System erfolgen können. Nun wollte ich neben den Mengen (Anzahl und Stunden) auch die Istwerte (siehe CO03) einlesen lassen, damit man schnell eine mengen- und werte Vergleich hat. Eigentlich würden mir die Einzelkosten reichen, da ich die Planmengen und Vorgabezeiten sowie die zurückgewmeldeten Zeiten je Vorgang und Auftrag ja schon habe.

Weisst du warum man bei einigen Tabellen die auszugebenen Felder expliziet angeben muss nd bei manchen nicht?

Gruß Zorro

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

Zitat:

Ich habe leider für alle 3 SE-Codes keine Berechtigung

Ich würde mal Fragen, ob man im Testsystem großzügiger ist, das reicht ja im Prinzip auch. SQVI, der Quickviewer, wäre als Ersatz für SE16 auch nicht schlecht.

Zitat:

Weisst du warum man bei einigen Tabellen die auszugebenen Felder expliziet angeben muss nd bei manchen nicht?

wo, im ALV Grid ?

gruß Jens

Zorro007
  • Zorro007
  • SAP Forum - Neuling Thema Starter
vor 8 Jahre
Hallo Jens,

die Firmenleitung ist hier sehr streng, werde aber mal die Freigabe in der Testumgebung anfragen und der Quickviewer hört sich auch nicht schlecht an.

Ich hatte nur Probleme bei der (LISTEN-) Ausgabe z.B. der Umsatzsteuer-IDs als Liste, bzw. die Ausgabe der Teileverwendung bis hoch zum Erzeugnis für eine Liste von Einzelteilen. Dies ist umständlich (jedenfalls für mich, vielleicht keine entsprechende T-Codes bekannt). Da habe ich einfach die LIFNR und STCEG von der LFA1 runtergeladen mit dem Lieferanten aus der angefragten Excelliste verknüft bzw. die MAST und STPO runtergeladen und ein Programm in VBA zur Teileverwendung bis hoch zum Erzeugnis für 300 Einzelteile erstellt.

Meine Frage war, ob man immer die auszugebenden Felder (mit T_I_Fields(x, "FIELDNAME")) expliziet angeben mus oder ob es wie bei den SELECT auch den * für alle Felder gibt, damit ich zunächst einen Überblick der Feldinhalte bekommen kann. Einen JOIN gibt es ja bei RFC_READ_TABLE nicht oder? Habe in VBA ein AddIns für große Tabellenverknüpfungen mit ADODB (siehe Peter Haserodt 2007) mit entsprechender Userform estellt.

Es gibt ja auch SAP-Datenbank-Viewer im Internet. Kannst du da was empfehlen?

Gruß Silvio

Tron
  • Tron
  • SAP Forum - Profi
vor 8 Jahre
Hallo Silvio.

1. Aufpassen beim Lesen STPO/MAST (gelöschte Positionen werden mit ausgegeben)

Zitat:

ob man immer die auszugebenden Felder (mit T_I_Fields(x, "FIELDNAME")) expliziet angeben mus oder ob es wie bei den SELECT auch den * für alle Felder gibt

2. Wenn man die Tabelle "Fields" zu RFC_READ_TABLE nicht mit Feldnamen befüllt, bekommt man ALLE Felder (also * inkl. Mandant)

.. oder ggf. erstmal die Fields löscht


   :
Set T_I_Fields = FUBA_rfc_read_table.Tables("FIELDS")
T_I_Fields.Freetable
   :

Zitat:

Einen JOIN gibt es ja bei RFC_READ_TABLE nicht oder?

Doch z.B. T002V , sogenannte "Database View".

Pool/ Clustertabellen oder Strukturen natürlich nicht.

Man könnte sagen: Es geht alles zu lesen, wenn Select * / im Abap funktioniert !

Falls Du die Berechtigung zu de S* Transaktionen nicht bekommen solltest, kannst Du die Definition von Tabellen auch mit RFC_READ_TABLE ermitteln !!!

Wir basteln uns SE12 mit RFC_READ_TABLE

In der Tabelle

DD02L = Kopf von Tabellendefinitionen (z.B. Tabclass = TRANSP) = Transparente Tabelle.

DD02T = Kurzbeschreibung zur Tabelle.

DD03L = Felder zur Tabelle

DD03T = Beschreibung der Felder

DD04L = Datenelemente

DD04T = Text zum Datenelement

Der Clou ist, das SAP die Tabellendefinitionen auch in Tabellen speichert !

Du siehst... Aufgeben ist keine Option 😎

lg jens

Beitrag zu RFC_READ_TABLE 

Zorro007
  • Zorro007
  • SAP Forum - Neuling Thema Starter
vor 8 Jahre
Hallo Jens,

vielen Dank für deine interessanten neuen Information 🙂, werde gleich mal ausprobieren.

Ich habe nur immer die Übersicht der Tabellen hier m Forum herangezogen (SAP Tabellen Teil I bis III). Da ist es prima, dass ich die Struktur (Definition) auch direkt aus SAP bekomme.

(Wir hatten zuvor proAlpha (pA), dort gab einen sogenannte Analyzer, in dem man oberflächenorientiert Daten aus vielen pA-Tabelle exportieren konnte. Das war oft vorteilhafter, als im Dialog einzelne Daten zu durchforsten)

Ich werde weiter machen (das Ziel ist so einen Auwertung wie in der CO03 über mehrere Aufträge z.B. einer bestimmten Auftragsart zu exportieren um sie in Excel weiter zu analysieren).

Ich melde mich dann hier bald wieder mit neuen Fragen.

Nochmals vielen Dank und für weitere Tipps oder Links wäre ich dankbar. Kann aber hier nur nebenbei die Sachen mit den Export weiter machen. Aber später wird es mir helfen, die Kollegen zu unterstützen.

Lg. Silvio

Zorro007
  • Zorro007
  • SAP Forum - Neuling Thema Starter
vor 8 Jahre
Hallo Jens,

ich bin's noch mal und habe noch mal ne Frage

Zitat:

Doch z.B. T002V , sogenannte "Database View".

Pool/ Clustertabellen oder Strukturen natürlich nicht.

Man könnte sagen: Es geht alles zu lesen, wenn Select * / im Abap funktioniert !

Ist das eine Transaktion, die es bei uns nicht gibt, der Database View hört sich gut an 😁 .

Kannst du dies bitte noch ein wenig erläutern.

Ich habe meine Abfrageroutine verallgemeinert:

Sub Start_SAP_Export()

SAP_Felder = Array("TABNAME", "TABCLASS", "DATMIN", "DATMAX", "DATAVG")

SAP_WHERE = "Tabclass = 'TRANSP'"

Debug.Print SAP_Liste("DD02L", SAP_WHERE, SAP_Felder, 5, 5000)

End Sub

Function SAP_Liste(SAP_Tabelle, SAP_WHERE, SAP_Felder, Exceltabelle, Optional MinAnzahl As Integer = 0, Optional User As String = "", Optional Passwort As String = "")

Dim FUBAU_rfc_read_table As Object

Dim T_I_Options As Object

Dim T_I_Fields As Object

Dim T_E_Data As Object

' SAP-Anmeldung

Set functionCtrl = CreateObject("SAP.Functions")

Set SAP_Connection = functionCtrl.Connection

SAP_Connection.ApplicationServer = "193.46.4.53"

SAP_Connection.SystemNumber = "00"

SAP_Connection.system = "E21"

SAP_Connection.client = "001"

If User = "" Then

Zugangsart = False

Else

SAP_Connection.User = User

SAP_Connection.password = Passwort

Zugangsart = True

End If

If SAP_Connection.Logon(o, Zugangsart) <> True Then

SAP_Liste = False

Else

SAP_Liste = True

End If

If Not (SAP_Liste) Then

SAP_Liste = "Keine SAP-Anmeldung möglich" ' SAP_Liste = SAP_Connection.LastError

GoTo Ende

End If

Set FUBA_rfc_read_table = functionCtrl.Add("RFC_READ_TABLE")

With FUBA_rfc_read_table

.exports("QUERY_TABLE") = SAP_Tabelle

.exports("DELIMITER") = "|" 'Delimiter

End With

Set T_I_Options = FUBA_rfc_read_table.Tables("OPTIONS")

Set T_I_Fields = FUBA_rfc_read_table.Tables("FIELDS")

Set T_E_Data = FUBA_rfc_read_table.Tables("DATA")

'Call T_I_Fields.Freetable ' Fields löscht

T_I_Options.AppendRow

T_I_Options(1, "TEXT") = SAP_WHERE

If Not (IsEmpty(SAP_Felder)) Then

If Not (IsArray(SAP_Felder)) Then SAP_Felder = Array(SAP_Felder)

For i = 0 To UBound(SAP_Felder)

T_I_Fields.AppendRow

T_I_Fields(i + 1, "FIELDNAME") = SAP_Felder(i)

Next

End If

'Aufruf des FUBAs

ret = FUBA_rfc_read_table.Call

If Not (ret) Then SAP_Liste = "Abfrage fehlgeschlagen": GoTo Ende

If T_E_Data.RowCount = 0 Then SAP_Liste = "Keine Daten zum Auslesen gefunden.": GoTo Ende

' Übetragen der Daten in Excel-Tabelle (z.B. immer in Tabelle1)

If T_E_Data.RowCount > 0 And ret = True Then

' Statusbartext ein

Application.DisplayStatusBar = True

DS_Anzahl = IIf(MinAnzahlDS_Anzahl <= 0, T_E_Data.RowCount, Min(MinAnzahlDS_Anzahl, T_E_Data.RowCount))

For i = 1 To DS_Anzahl

Application.StatusBar = "Bitte warten... (" & Format(i / (DS_Anzahl), "0.00%") & ")"

DoEvents

strDataRow = T_E_Data(i, 1)

DataRow = Split(strDataRow, "|")

'Spaltenüberschriften an Excel übergeben

If Col = False Then

For x = 0 To UBound(DataRow)

Sheets(Exceltabelle).Cells(1, x + 1).Value = T_I_Fields(x + 1, 1)

Next x

Col = True

End If

For x = 0 To UBound(DataRow)

Sheets(Exceltabelle).Cells(i + 1, x + 1).Value = DataRow(x)

Next x

Next i

SAP_Liste = DS_Anzahl & " von " & T_E_Data.RowCount & " ausgegeben."

End If

Ende:

' Statusbartext aus

Application.StatusBar = False

Call T_E_Data.Freetable

Call T_I_Fields.Freetable

Call T_I_Options.Freetable

' ###########################################################################

SAP_Connection.LogOff

End Function

Function Min(Wert1, Wert2)

Min = IIf(Wert1 < Wert2, Wert1, Wert2)

End Function

Stimmen hier in der Funktion die Aussagen:

If Not (ret) Then SAP_Liste = "Abfrage fehlgeschlagen": GoTo Ende

If T_E_Data.RowCount = 0 Then SAP_Liste = "Keine Daten zum Auslesen gefunden.": GoTo Ende

und kann man diese aus Errormeldungen noch näher ermitteln, insbesondere warum die Abfrage fehlgeschlagen ist.

Kann man die Funktion insgesamt noch etwas verbessern?

Gruß

Silvio

Zorro007
  • Zorro007
  • SAP Forum - Neuling Thema Starter
vor 8 Jahre
Hallo Jens,

ich habe noch mal eine weitere Frage: Wie kann man erkennen, dass man für die Abfrage (Tabellenzugriff) keine Berechtigung hat oder einfach nur falsch ist?

Gruß

Silvio

Tron
  • Tron
  • SAP Forum - Profi
vor 8 Jahre
Moin

Zitat:

Wie kann man erkennen, dass man für die Abfrage (Tabellenzugriff) keine Berechtigung hat oder einfach nur falsch ist?

Auf der SAP-Seite mit SU53 für den RFC Benutzer, auf Excel Seite kann man den RFC Trace im VBA Code aktivieren. Dabei ist es aber wahrscheinlich so, das der RFC-User dessen Berechtigungen genutzt werden, so ziemlich jede transparente Tabelle lesen kann. Das einzigste Berechtigungsobjekt, das abgefragt wird, ist glaub ich, S_TABU_DIS.

Der häufigste Fehler beim RFC-lesen ist die Überschreitung von 512 Zeichen im Ergebnis einer Abfrage.

Hier mein Coding zu RFC_READ_TABLE

http://www.tricktresor.de/blog/werte-per-rfc-importieren/ 

Um das Lesen mehrerer Tabellen zu realisieren, würde ich eine Sub() pro Tabelle anlegen und das Ergebnis in dynamischen Array(s) ablegen, bevor ich in die Excel Zellen schreibe. Meistens brauch man ja nicht jedes gelesene Feld der Tabellen.

Wenn man dann alles nötige gelesen hat, "kippt" man die Arrays auf das Excelblatt.


Application.screenupdating = FALSE
For i=0 to ubound(T)
Cells(x,y).value = t(i)
Next i

  :
  :
Application.Screenupdating = TRUE

Trace aus SAP 

gruß Jens

vielleicht solltest Du dir zum "spielen" ein Mini-SAP installieren,

das sollte besonders in der Anfangsphase sehr hilfreich sein.