Kapitel 3
Kapitel 3.1 - Funktionen der SAP-BAPI's nutzen
Mit der Transaktion BAPI in Ihrem SAP-System eröffnet sich mit dem BAPI-Explorer die Welt aller für RFC freigegebenen BAPI's und deren Funktionen. Um alle Informationen zu einem Objekt wie z.B. einem PSP Element zu erhalten werden zusätzlich zu Informationen aus der führenden Tabelle PRPS, Informationen aus weiteren Tabellen benötigt. Die einfachste Methode dafür ist, einen passenden BAPI oder dessen Funktionalitäten zu nutzen.
Um die Funktionen eines BAPI zu nutzen, öffnet man den gewünschten BAPI mit dem Function Builder, den man im BAPI Explorer unter den Werkzeugen findet.
Kapitel 3.2 - Den Status von PSP Elementen ermitteln
Zu unserer Datei PRPS benötigen wir als zusätzliche Information den Status der PSP Elemente. Extern wird der Status für den Anwender in der jeweils im Logon gewählten Sprache dargestellt. Die SAP-Bapi's nutzen ausschließlich die englische Sprachversion. Intern wird der Status als Schlüssel in der Tabelle JEST geführt. Die jeweilige Textversion findet man in den Tabellen TJ02 für den Systemstatus und TJ30 für den Anwenderstatus.
Funktionalität
Mit dem BAPI BAPI_BUS2054_GET_STATUS können die aktiven Systemstatus sowie Anwenderstatus zu einer Liste von PSP-Elementen (BAPI_WBS_ELEMENTS) gelesen werden. Aktive Systemstatus werden dabei über den englischsprachigen Schlüssel ausgegeben. Aktive Anwenderstatus werden über den Schlüssel in der jeweiligen Anmeldesprache ausgegeben, falls eine Übersetzung des Status im zugrundeliegende Statusschema in die Anmeldesprache existiert bzw. die Pflegesprache des Statusschema der Anmeldesprache entspricht. Existiert der Status im Statusschema nicht in der Anmeldesprache, so wird der Schlüssel in der Pflegesprache des Statusschemas ausgegeben.
Im Rückgabeparameter RETURN steht eine Fehlermeldung, wenn bei der Verarbeitung ein Fehler aufgetreten ist. In der Tabelle BAPI_STATUS_RESULT stehen nach dem Aufruf die Meldungen, die während der Verarbeitung erzeugt wurden.
Weiterführende Informationen
Weitere Informationen finden Sie in der SAP-Bibliothek unter Projektsystem -> Strukturen -> Schnittstellen des Projektsystems -> PS-EPS Schnittstelle zu externen Projektmanagementsystemen.
Bei den PSP Elementen arbeiten wir mit den folgenden Status.
'REL' (FREI) Freigegeben (I0002)
setzen
'LKD' (SPER) Gesperrt (I0043)
setzen / zurücknehmen
'TECO' (TABG) Technisch abgeschlossen (I0045)
setzen / zurücknehmen
'CLSD' (ABGS) Abgeschlossen (I0046)
setzen / zurücknehmen
'AALK' (KTSP) Kontierung gesperrt (I0064)
setzen / zurücknehmen
'MDLK' (SDSP) Stammdaten gesperrt (I0065)
setzen / zurücknehmen
'DLFL' (LÖVM) Löschvormerkung (I0076)
setzen / zurücknehmen
Die Status Ermittlung über die zugehörigen SAP-Tabellen JEST und TJ02 für den Systemstatus oder JEST und TJ30 für den Anwenderstatus ist etwas aufwendig.
Eleganter und schneller geht es mit dem zugehörigen BAPI BAPI_BUS2054_GET_STATUS bzw. die Nutzung der enthaltenen Funktionen die wir uns mit dem Function Builder ansehen können.
Wie das geht zeige ich jetzt:
Um komfortabel an den Status eines PSP Elements zu kommen, nutzen wir den Funktionsbaustein BAPI_BUS2054_GET_STATUS.
In unserer Access Datei erstellen wir das Modul SAP_RFC_Status mit den folgenden Routinen:
Option Compare Database
Option Explicit
' *********************************************************************************
' Deklarationen
' *********************************************************************************
Public Const acStatusBack As Boolean = False
Public Const acStatusForward As Boolean = True
Dim IMessage As Object
Dim IEResult As Object
Dim IRETURN As Object
Dim oBAPI_TRANSACTION_ROLLBACK As Object
Dim oBAPI_TRANSACTION_ROLLBACK_RETURN As Object
Dim PI_WBS_SYSTEM_STATUS As Object
Public oBAPI_BUS2054_SET_STATUS As Object
Private oBAPI_BUS2054_GET_STATUS As Object
Public oCOMMIT_WORK_WAIT As Object
Dim oI_WBS_ELEMENTS As Object
Dim oE_USER_STATUS As Object
Dim oE_SYSTEM_STATUS As Object
Public Sub WBS_BAPI_BUS2054_GETDATA_STATUS_SHORT(remaining As Boolean)
' *********************************************************************************
' RFC_Read_Table Download mit umfangreichen Selektions Optionen
' *********************************************************************************
Dim DB As Database
Dim RC As Object
Dim GetDatei As String, StKrit As String, StKritA As String, HWBS As String
Dim RST As Object, RSTA As Recordset
Dim intx As Integer
Dim MDate As Date, Mtime As Date
Dim ANZ_R2 As Long
'**************Export*****************************
Dim oI_MAX_ROWS As Object
'**************Tables*****************************
Dim I, J, J2, m, ANZ_R, Anz_C As Long
On Error GoTo Fehler
'******** RFC LOGON ****************
If Not sapConnection Is Nothing Then
If sapConnection.IsConnected < > 1 Then
If RFC_Connect() = False Then Exit Sub
End If
Else
If RFC_Connect() = False Then Exit Sub
End If
'******** RFC LOGON END ************
Call RemoveFC(FunctionCtrl, "BAPI_BUS2054_GETDATA")
Call RemoveFC(FunctionCtrl, "oBAPI_BUS2054_GET_STATUS")
If Not oBAPI_BUS2054_GET_STATUS Is Nothing Then Set oBAPI_BUS2054_GET_STATUS = Nothing
If Not oE_USER_STATUS Is Nothing Then Set oE_USER_STATUS = Nothing
If Not oE_SYSTEM_STATUS Is Nothing Then Set oE_SYSTEM_STATUS = Nothing
If Not oI_WBS_ELEMENTS Is Nothing Then Set oI_WBS_ELEMENTS = Nothing
If Not oE_USER_STATUS Is Nothing Then Set oE_USER_STATUS = Nothing
If Not oE_SYSTEM_STATUS Is Nothing Then Set oE_SYSTEM_STATUS = Nothing
Set DB = CurrentDb()
Set oBAPI_BUS2054_GET_STATUS = FunctionCtrl.Add("BAPI_BUS2054_GET_STATUS")
ANZ_R2 = oBAPI_BUS2054_GET_STATUS.Tables("I_WBS_ELEMENTS").Rows.Count
If ANZ_R2 > 0 Then
oBAPI_BUS2054_GET_STATUS.Tables("I_WBS_ELEMENTS").Rows.Remove
oBAPI_BUS2054_GET_STATUS.Tables("I_WBS_ELEMENTS").FREETABLE
End If
If oBAPI_BUS2054_GET_STATUS.Tables("E_USER_STATUS").Rows.Count > 0 Then
oBAPI_BUS2054_GET_STATUS.Tables("E_USER_STATUS").Rows.Remove
oBAPI_BUS2054_GET_STATUS.Tables("E_USER_STATUS").FREETABLE
End If
If oBAPI_BUS2054_GET_STATUS.Tables("E_SYSTEM_STATUS").Rows.Count > 0 Then
oBAPI_BUS2054_GET_STATUS.Tables("E_SYSTEM_STATUS").Rows.Remove
oBAPI_BUS2054_GET_STATUS.Tables("E_SYSTEM_STATUS").FREETABLE
End If
Set oI_WBS_ELEMENTS = oBAPI_BUS2054_GET_STATUS.Tables("I_WBS_ELEMENTS")
Set oE_USER_STATUS = oBAPI_BUS2054_GET_STATUS.Tables("E_USER_STATUS")
Set oE_SYSTEM_STATUS = oBAPI_BUS2054_GET_STATUS.Tables("E_SYSTEM_STATUS")
ANZ_R2 = oI_WBS_ELEMENTS.RowCount
Application.SetOption "Confirm Action Queries", False
DoCmd.RunSQL "UPDATE PRPS SET PRPS.[SyStat] = '', PRPS.[USRStat] = '';"
'**************************************************************
' Alle PSP laden
'**************************************************************
If remaining Then
StKrit = "SELECT PRPS.* " & " FROM PRPS"
Else
StKrit = "SELECT PRPS.* " & " FROM PRPS WHERE SYSTAT = ''"
End If
m = 0
Set RST = DB.OpenRecordset(StKrit)
RST.MoveFirst
While Not RST.EOF()
If Not IsNull(RST!POSID) Then
m = m + 1
oI_WBS_ELEMENTS.Rows.Add
oI_WBS_ELEMENTS(m, "WBS_ELEMENT") = RST!POSID
End If
RST.MoveNext
Wend
ANZ_R = oI_WBS_ELEMENTS.RowCount
RST.Close
oBAPI_BUS2054_GET_STATUS.Call
m = 0
ANZ_R = oE_SYSTEM_STATUS.RowCount
'**************************************************************
For J = 1 To ANZ_R
HWBS = oE_SYSTEM_STATUS.Value(J, "WBS_ELEMENT")
StKrit = "SELECT PRPS.* " & " FROM PRPS WHERE POSID = '" & HWBS & "'"
Set RST = DB.OpenRecordset(StKrit)
While Not RST.EOF()
RST.Edit
m = m + 1
RST!SYSTAT = RST!SYSTAT & " " & oE_SYSTEM_STATUS.Value(J, "SYSTEM_STATUS")
If oE_SYSTEM_STATUS.Value(J, "SYSTEM_STATUS") = "CLSD" Or _
oE_SYSTEM_STATUS.Value(J, "SYSTEM_STATUS") = "DLFL" Then
RST!FLCLSD = True
Else
End If
RST.Update
RST.MoveNext
Wend
RST.Close
Next J
' *********************************************************************************
ANZ_R = oE_USER_STATUS.RowCount
For J = 1 To ANZ_R
HWBS = oE_USER_STATUS.Value(J, "WBS_ELEMENT")
StKrit = "SELECT PRPS.* " & " FROM PRPS WHERE POSID = '" & HWBS & "'"
Set RST = DB.OpenRecordset(StKrit)
While Not RST.EOF()
RST.Edit
m = m +...