SAP Jobsuche bei DV-Treff
Sascha Bürk
vor 9 Jahre
Hallo zusammen.

Habe hier ein Problem, welches mich noch in den Wahnsinn treibt.

Ich möchte aus der Tabelle LFA1 das Feld "NAME1" auslesen. Als Queryparameter habe ich "LIFNR" = '54199'.

Ich möchte also aus der Kreditorennummer den vollständigen Namen des Lieferanten herausfinden.

Mache ich dies über die Transaktion SE16N im SAP, dann wird da im Feld auch was angezeigt.

Ich bekomme aber immer ein leeres Ergebnis. Andere Tabellen (MARA, MARC) funktionieren wunderbar, nur diese nicht :(

Hier mal mein Code:

Option Explicit

Public Sub SAPLogin()

    'Variablen definieren
    Dim FUBA_rfc_read_table, T_I_Options, T_I_Fields, T_E_Data, conn, sap As Object
    Dim ret As Boolean
    Dim strDataRow, DataRow, SAP_MAKT_DE, SAP_MARA_DE, SAP_LFA1_DE, SAP_MARC_DE
    Dim MatNr, KurzText, NettoGewicht, Legierung, FormFaktor, Lieferant, VP, Lager, Lieferantenname As String
    
    'SAP-Objekt erstellen
    Set sap = CreateObject("SAP.Functions")
    Set conn = sap.Connection
    
    'Anmeldedaten anlegen
    conn.System = "SAP Test"
    conn.client = "001"
    conn.user = "****"
    conn.Password = "****"
    conn.Language = "DE"
    conn.RfcWithDialog = False
        
    'Login
    If conn.Logon(0, True) <> True Then
        MsgBox "Login NICHT erfolgreich", vbCritical, "Logon Fehler"
        Unload frmMatNr
        Exit Sub
    Else
        'MsgBox "Login erfolgreich", vbOKOnly, "Comment"
    End If
    '###########################################################################


    '###########################################################################
    'Lieferant aus Kreditorennummer
    Set FUBA_rfc_read_table = sap.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' and LIFNR EQ '54199'"
    
    T_I_Fields.AppendRow
    T_I_Fields(1, "FIELDNAME") = "NAME1"
    
    ret = FUBA_rfc_read_table.Call
    
    If T_E_Data.RowCount > 0 And ret = True Then
        strDataRow = T_E_Data(1, 1)
        DataRow = Split(strDataRow, "|")
        If strDataRow = "" Then
            SAP_LFA1_DE = DataRow
        Else
            SAP_LFA1_DE = DataRow(0)
        End If
    End If
    
    If T_E_Data.RowCount > 0 Then
        KurzText = T_E_Data(1, 1)
    Else
        KurzText = "Nicht gepflegt"
    End If

    Debug.Print KurzText
    
    Call T_E_Data.freetable
    Call T_I_Fields.freetable
    Call T_I_Options.freetable
    '###########################################################################
    
    conn.LogOff
End Sub

Das ist ein Schnipsel aus dem kompletten Script, welches ich zum Testen ausgelagert habe. Daher auch die vielen Deklarationen. Ich weiss, der Code ist wohl nicht der sauberste, aber bei anderen Dingen funktioniert's :D

strDataRow ist leer und damit bekomme ich bei der debug-Ausgabe immer ein "Nicht gepflegt".

Hab ich nen Denkfehler? Ist die Tabelle irgendwie speziell? Wenn ja, stehen die gewünschten Daten auch evtl in einer anderen Tabelle?

Über Hilfe wäre ich sehr dankbar 🙂

Sascha Bürk
vor 9 Jahre
Achja, auch wenn ich das Query auf

T_I_Options(1, "TEXT") = "LIFNR EQ '54199'"
ändere bekomme ich dasselbe Ergebnis.
wreichelt
vor 9 Jahre
Hallo,

die Lieferantennummer ist ein Char Feld und hat 10 Stellen,

versuche es mal mit 0000054199.

Gruß

Wolfgang

Tron
  • Tron
  • SAP Forum - Profi
vor 9 Jahre
Moin,

Wolfgang hat recht, da Du SE16N erwähnt hast,

schau Dir die Schlüsselfelder immmer in der unkonvertierten Form an !

Als da wäre noch ein Tipp bezüglich des "Delimiter" - Parameters:

Als Trennzeichen möglichst ein nicht eingebbares Zeichen verwenden. Z.B.

   With FUBA_rfc_read_table
        .exports("QUERY_TABLE") = "LFA1"
        .exports("DELIMITER") = vbTab 'Delimiter = CHR(9)
    End With
Mit Semicolon hatten wir schon Probleme, da es im einem Kurztext verwendet wurde. Mit dem Horizonal TAB gibt es niemals Probleme.


Dim T() as String
T=split(<string>,vbTab)
Mit dieser Anweisung zerlegst Du dann am effektivsten eine Ergebniszeile in ein Array .😉

lg Jens

Sascha Bürk
vor 9 Jahre
Moah Jungs, ihr seid großartig!

Ich grübel da schon seit Tagen drüber, und dabei hatte ich dasselbe Problem schon bei der Materialnummer, das hab ich dann mit format() gelöst.

Vielen vielen Dank! :)

@Tron: Ich werd's beherzigen. Und wenn ich fertig bin, dann zeig ich euch das ganze Script, damit ihr was zu lachen habt. Bin in VBA eig. noch echter Anfänger :)

Sascha Bürk
vor 9 Jahre
Achja, eins noch: Wie kann ich das ganze so abwandeln, so dass ich zwei Felder abfrage? Und die dann in zwei verschiedenen Variablen landen? Dann könnte ich mein ganzes Script erheblich abkürzen 🙂
Tron
  • Tron
  • SAP Forum - Profi
vor 9 Jahre
*grins*


   :

    T_I_Fields.AppendRow
    T_I_Fields(1, "FIELDNAME") = "NAME1"

    T_I_Fields.AppendRow
    T_I_Fields(2, "FIELDNAME") = "<Feldname>"

    T_I_Fields.AppendRow
    T_I_Fields(3, "FIELDNAME") = "<Feldname>"

   :


Wenn man T_I_Fields gar nicht befüllt, gibt RFC_READ_TABLE alle

Felder der Tabelle zurück !

Für das Ergebnis in T_E_Data gilt:

Es dürfen sämtliche Felder einer Zeile zusammen nicht mehr Zeichen als 512 Bytes betragen. (inkl. Delimiter)

Für die WHERE Klausel gilt:

Das Feld MANDT muß nicht angegeben werden, da man sich ja in einem Mandanten anmeldet, gibts auch nur die Daten dieses Mandanten.


  :
T_I_Options(1, "TEXT") = "MANDT EQ '001' and LIFNR EQ '0000054199'"
  :

.. also


  :
T_I_Options(1, "TEXT") = "LIFNR EQ '0000054199'"
  :

Die Testerei kann man erheblich beschleunigen, wenn man RFC_READ_TABLE direkt im SAP mit der SE37 ausprobiert.😉

lg Jens

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