SAP Import & Export Spezifikation

In diesem Abschnitt werden Spezifikation für den SAP Import & Export beschrieben

Grundbegriffe

Die Begriffe Import und Export sind immer aus Sicht des OLP. Import bezeichnet also die Richtung von SAP zu OLP. Export bezeichnet die Richtung von OLP zu SAP.

Import erfolgt über einen FTP-Server (Username sap-uploader, Passwort aus Sicherheitsgründen nicht hier dokumentiert) in das Root-Verzeichnis. Es darf ausschließlich der sap-uploader Benutzer genutzt werden, da ansonsten Hooks nicht ausgeführt werden. Sobald der Import erfolgreich ausgeführt wurde, wird die hochgeladene Datei automatisch gelöscht.

Materialimport aus dem SAP

Für den Materialimport muss eine Datei mit dem Namen sap-material.csv auf den FTP-Server hochgeladen werden. Der Dateiname ist case-sensitive, d.h. er muss genau so geschrieben werden und kein Buchstabe in Großschreibung.

Die Datei hat folgende Spezifikationen:

  • Format: CSV (Feldseparator ;, Zeilenseparator LF / ASCII 0A)
  • Kodierung: UTF-8
  • Keine Kopfzeile
  • 9 Spalten
    1. Unbekannt (Üblicher Wert PA1CLNT100)
    2. WERKS (Üblicher Wert 1110)
    3. LGNUM (Üblicher Wert GOE)
    4. LGTYP (Üblicher Wert 107)
    5. Materialnummer (Beispielwert 000000003500002130 - Beim Import werden die führenden Nullen entfernt!)
    6. Materialbezeichnung (Beispielwert Prüfschnur S0 für PrTel93i/96)
    7. Lagerort (Beispielwert M 04-02)
    8. Einheit (Beispielwert ST)
    9. Materialbestand (Beispielwert 99 - ACHTUNG Dieser Wert muss ganzzahlig sein)

Die Werte Spalten 1 (Unbekannt), 2 (WERKS), 3 (LGNUM), 4 (LGTYP) und 8 (Einheit) werden vom OLP ignoriert und nicht verifiziert

Beim Materialexport werden alle Eigenschaften des Materials überschrieben (Name, Lagerort, Bestand). Die Materialnummer ist hier der Schlüssel für die eindeutige Zuordnung.

Beispiel für eine solche Datei (1. Zeile ist Dateianfang):

PA1CLNT100;1110;GOE;107;000000002900015197;MECHDEV ELEKTRODE FOR FSM20/30/40;S S1-02;PAA;2
PA1CLNT100;1110;GOE;107;000000002900001674;CAP AL 100F 20% 400V 105C RM10   ROHS;04-09;ST;2
PA1CLNT100;1110;GOE;107;000000002900002863;CAP AL 220UF 20% 10V 85C RM2,5 6,3X11;04-09;ST;399
PA1CLNT100;1110;GOE;107;000000002900020009;CAP AL 100UF 20% 25V 85C RM2,5 6X11 ROHS;04-09;ST;817

Auftragsimport aus dem SAP

Für den Auftragsimport muss eine Datei mit dem Namen sap-jobs.csv auf den FTP-Server hochgeladen werden. Der Dateiname ist case-sensitive, d.h. er muss genau so geschrieben werden und kein Buchstabe in Großschreibung.

Die Datei hat folgende Spezifikationen:

  • Format: CSV (Feldseparator ;, Zeilenseparator LF / ASCII 0A)
  • Kodierung: UTF-8
  • Keine Kopfzeile
  • 24 Spalten
    1. Meldungsnummer
    2. Position
    3. Materialnummer
    4. Hersteller-Nummer
    5. Hersteller
    6. Inventarnummer
    7. Kundenbestellnummer
    8. Auftragskennzeichen
    9. Warenempfänger
    10. Kundenname 1
    11. Kundenname 2
    12. Kundenname 3
    13. Kunden Straße
    14. PLZ
    15. Ort
    16. Land
    17. Servicekennzeichen (Hinweise siehe unten)
    18. Werkstattauftrag
    19. Wareneingang
    20. Ord Tech Abschdatum
    21. Datum Closed
    22. Seriennummer
    23. Interne Seriennummer
    24. Gerätename

Zulässige Werte für Spalte 17 (Servicekennzeichen) sind ['KA', 'KI', 'IS', 'PR', 'IV', 'WK', 'WM']. Da das SAP bspw. für das Servicekennzeichen ungültigerweise PR (ein Leerzeichen am Ende) exportiert, werden alle Leerzeichen am Ende von Servicetags automatisch entfernt.

Die Spalten 4 (Hersteller-Nummer), 7 (Kundenbestellnummer), 8 (Auftragskennzeichen), 20 (Ord-Tech Abschdatum) und 21 (Datum Closed) werden vom OLP ignoriert und nicht verifiziert

Beispiel für eine solche Datei (1. Zeile ist Dateianfang):

312755741;1;2900090289;1350383;EXFO Europe Ltd;IW882000000033;2464900;P;241158;Telekom Prüf- Messtechnik;T NL West;Max Mustermann;Bonner Talweg 100;53113;Bonn;DE;PR ;5330231;20240927;0;0;364099;2002373361;Universal Test System FTB-400
312755741;2;2900105333;1350383;EXFO Europe Ltd;IW882000000033-Z01;2464900;N;241158;Telekom Prüf- Messtechnik;T NL West;Martina Musterfrau;Bonner Talweg 100;53113;Bonn;DE;KA;5330232;20240927;0;0;363270;2001201054;4-Wellenlängen-Modul FTB-7400D-2347B

Materialexport zum SAP

Der Materialexport sendet einen HTTP POST an die gegebene Material-URL des SAP mit JSON body (application/json). Der POST request wird mittels HTTP Basic Auth authentifiziert. Alle Zeitpunkte sind in Zeitzone Europe/Berlin. Der Body ist UTF-8 kodiert.

Der Body ist ein IDOC nach folgendem vorgegebenem Format:

{
   "WMMBID02":{
      "IDOC":{
         "@BEGIN":"1",
         "EDI_DC40":{
            "@SEGMENT":"1",
            "TABNAM":"EDI_DC40",
            "DIRECT":"2",
            "IDOCTYP":"WMMBID02",
            "MESTYP":"/CTDI/MT_MM_WMM_FROM_CALIB",
            "SNDPOR":"SPI_DS2",
            "SNDPRT":"LS",
            "SNDPRN":"LS_PI_CALB",
            "RCVPOR":"SAPQA1",
            "RCVPRT":"LS",
            "RCVPRN":"LS_PI_CALB"
         },
         "E1MBXYH":{
            "@SEGMENT":"1",
            "BLDAT":"<Zeitpunkt des Exports>",
            "BUDAT":"<Zeitpunkt des Exports>",
            "XBLNR":"<Werkstattauftragnummer>",
            "BKTXT":"WM Buchung Kalibriersoftware",
            "TCODE":"MB1A",
            "USNAM":"SAPPIRFC",
            "E1MBXYI": [
              <1. Materialbuchung>,
              <2. Materialbuchung>,
              ...
            ]
         }
      }
   }
}

Die einzelnen Materialbuchungen sind nach folgendem Schema aufgebaut:

{
    "@SEGMENT": "1",
    MATNR: "<SAP Materialnummer>",
    WERKS: "1110",
    LGORT: "1GOE",
    BWART: "261",
    AUFNR: "<Werkstattauftragnummer>",
    LGNUM: "GOE",
    LGTYP: "914",
    LGPLA: "<Werkstattauftragnummer>",
    ERFMG: <Menge als Ganzzahl>,
    ERFME: "ST"
}

Ein beispielhafter Inhalt sieht so aus:

{
   "WMMBID02":{
      "IDOC":{
         "@BEGIN":"1",
         "EDI_DC40":{
            "@SEGMENT":"1",
            "TABNAM":"EDI_DC40",
            "DIRECT":"2",
            "IDOCTYP":"WMMBID02",
            "MESTYP":"/CTDI/MT_MM_WMM_FROM_CALIB",
            "SNDPOR":"SPI_DS2",
            "SNDPRT":"LS",
            "SNDPRN":"LS_PI_CALB",
            "RCVPOR":"SAPQA1",
            "RCVPRT":"LS",
            "RCVPRN":"LS_PI_CALB"
         },
         "E1MBXYH":{
            "@SEGMENT":"1",
            "BLDAT":"20250107",
            "BUDAT":"20250107",
            "XBLNR":"5330081",
            "BKTXT":"WM Buchung Kalibriersoftware",
            "TCODE":"MB1A",
            "USNAM":"SAPPIRFC",
            "E1MBXYI":[
               {
                  "@SEGMENT":"1",
                  "MATNR":"2900234313",
                  "WERKS":"1110",
                  "LGORT":"1GOE",
                  "BWART":"261",
                  "AUFNR":"5330081",
                  "LGNUM":"GOE",
                  "LGTYP":"914",
                  "LGPLA":"5330081",
                  "ERFMG":"1",
                  "ERFME":"ST"
               },
               {
                  "@SEGMENT":"1",
                  "MATNR":"2900050906",
                  "WERKS":"1110",
                  "LGORT":"1GOE",
                  "BWART":"261",
                  "AUFNR":"5330081",
                  "LGNUM":"GOE",
                  "LGTYP":"914",
                  "LGPLA":"5330081",
                  "ERFMG":"1",
                  "ERFME":"ST"
               },
               {
                  "@SEGMENT":"1",
                  "MATNR":"2900000306",
                  "WERKS":"1110",
                  "LGORT":"1GOE",
                  "BWART":"261",
                  "AUFNR":"5330081",
                  "LGNUM":"GOE",
                  "LGTYP":"914",
                  "LGPLA":"5330081",
                  "ERFMG":"1",
                  "ERFME":"ST"
               },
               {
                  "@SEGMENT":"1",
                  "MATNR":"2900000293",
                  "WERKS":"1110",
                  "LGORT":"1GOE",
                  "BWART":"261",
                  "AUFNR":"5330081",
                  "LGNUM":"GOE",
                  "LGTYP":"914",
                  "LGPLA":"5330081",
                  "ERFMG":"1",
                  "ERFME":"ST"
               }
            ]
         }
      }
   }
}

Zeit- & Statusexport zum SAP

Der Zeit- & Statusexport sendet einen HTTP POST an die gegebene Zeit-und-Status-URL des SAP mit JSON body (application/json). Der POST request wird mittels HTTP Basic Auth authentifiziert. Alle Zeitpunkte sind in Zeitzone Europe/Berlin. Der Body ist UTF-8 kodiert.

Der Body ist ein IDOC nach folgendem vorgegebenem Format:

{
   "ZCONFCREATEIC01":{
      "IDOC":{
         "@BEGIN":"1",
         "EDI_DC40":{
            "@SEGMENT":"1",
            "TABNAM":"EDI_DC40",
            "DIRECT":"2",
            "TEST":{},
            "IDOCTYP":"ZCONFCREATEIC01",
            "MESTYP":"/CTDI/MT_CS_CALIBRATION",
            "SNDPOR":"SAPPI",
            "SNDPRT":"LS",
            "SNDPRN":"LS_PI_CALB",
            "RCVPOR":"SAPQA1",
            "RCVPRT":"LS",
            "RCVPRN":"LS_PI_CALB"
         },
         "Z1ZCONFCREATEIC":{
            "@SEGMENT":"1",
            "POST_WRONG_ENTRIES":"2",
            "Z1BP_ALM_TIMECONFIRMATION": [
              <Status-Eintrag>,
              <1. Zeitbuchung>,
              <2. Zeitbuchung>,
              ...
            ]
         }
      }
   }
}

Der Status-Eintrag hat folgendes Format:

{
   "@SEGMENT":"1",
   "ORDERID":"<Werkstattauftragnummer>",
   "OPERATION":"9010",
   "SPLIT":"0",
   "POSTG_DATE":"<Zeitpunkt des Exports>",
   "PLANT":"1120",
   "ACT_WORK":"1.0",
   "UN_WORK":"S",
   "UN_WORK_ISO":"SEC",
   "REM_WORK":"0.0",
   "UN_REM_WRK":"S",
   "UN_REM_WRK_ISO":"SEC",
   "ACTUAL_DUR":"0.0",
   "EXEC_START_DATE":"<Zeitpunkt des Beginns des Durchlaufs durch die Werkstatt>",
   "EXEC_START_TIME":"<Zeitpunkt des Beginns des Durchlaufs durch die Werkstatt>",
   "EXEC_FIN_DATE":"<Zeitpunkt des Endes des Durchlaufs durch die Werkstatt>",
   "EXEC_FIN_TIME":"<Zeitpunkt des Endes des Durchlaufs durch die Werkstatt>",
   "FCST_FIN_DATE":"00000000",
   "FCST_FIN_TIME":"240000",
   "PERS_NO":"<Export-Personalnummer>",
   "ACT_TYPE":"L400",
   "CALC_MOTIVE":"<Export-Kennzeichen, bspw. KA, KI, IS, AS, PR, CG, GO>"
}

Eine Zeitbuchung hat folgendes Format:

{
   "@SEGMENT":"1",
   "ORDERID":"<Werkstattauftragnummer>",
   "OPERATION":"<Typ der Zeitbuchung, bspw. 0040, 0020, 0060, 0100, 0082, 0090, 0110, 0120, 9000>",
   "SPLIT":"0",
   "POSTG_DATE":"<Zeitpunkt des Exports>",
   "PLANT":"1120",
   "ACT_WORK":"<Umfang der Zeitbuchung in ganzen Minuten>",
   "UN_WORK":"MIN",
   "UN_WORK_ISO":"MIN",
   "REM_WORK":"0.0",
   "UN_REM_WRK":"MIN",
   "UN_REM_WRK_ISO":"MIN",
   "ACTUAL_DUR":"0.0",
   "EXEC_START_DATE":"<Zeitpunkt des Anfangs der Zeitbuchung>",
   "EXEC_START_TIME":"<Zeitpunkt des Anfangs der Zeitbuchung>",
   "EXEC_FIN_DATE":"<Zeitpunkt des Endes der Zeitbuchung>",
   "EXEC_FIN_TIME":"<Zeitpunkt des Endes der Zeitbuchung>",
   "FCST_FIN_DATE":"00000000",
   "FCST_FIN_TIME":"240000",
   "PERS_NO":"<Personalnummer des der Zeitbuchung zugeordneten Mitarbeiters>",
   "ACT_TYPE":"L100"
}

Ein beispielhafter Inhalt sieht so aus:

{
   "ZCONFCREATEIC01":{
      "IDOC":{
         "@BEGIN":"1",
         "EDI_DC40":{
            "@SEGMENT":"1",
            "TABNAM":"EDI_DC40",
            "DIRECT":"2",
            "TEST":{
               
            },
            "IDOCTYP":"ZCONFCREATEIC01",
            "MESTYP":"/CTDI/MT_CS_CALIBRATION",
            "SNDPOR":"SAPPI",
            "SNDPRT":"LS",
            "SNDPRN":"LS_PI_CALB",
            "RCVPOR":"SAPQA1",
            "RCVPRT":"LS",
            "RCVPRN":"LS_PI_CALB"
         },
         "Z1ZCONFCREATEIC":{
            "@SEGMENT":"1",
            "POST_WRONG_ENTRIES":"2",
            "Z1BP_ALM_TIMECONFIRMATION":[
               {
                  "@SEGMENT":"1",
                  "ORDERID":"5330263",
                  "OPERATION":"9010",
                  "SPLIT":"0",
                  "POSTG_DATE":"20250107",
                  "PLANT":"1120",
                  "ACT_WORK":"1.0",
                  "UN_WORK":"S",
                  "UN_WORK_ISO":"SEC",
                  "REM_WORK":"0.0",
                  "UN_REM_WRK":"S",
                  "UN_REM_WRK_ISO":"SEC",
                  "ACTUAL_DUR":"0.0",
                  "EXEC_START_DATE":"20241209",
                  "EXEC_START_TIME":"120111",
                  "EXEC_FIN_DATE":"20250107",
                  "EXEC_FIN_TIME":"144411",
                  "FCST_FIN_DATE":"00000000",
                  "FCST_FIN_TIME":"240000",
                  "PERS_NO":"2826",
                  "ACT_TYPE":"L400",
                  "CALC_MOTIVE":"KI"
               },
               {
                  "@SEGMENT":"1",
                  "ORDERID":"5330263",
                  "OPERATION":"0040",
                  "SPLIT":"0",
                  "POSTG_DATE":"20250107",
                  "PLANT":"1120",
                  "ACT_WORK":"5",
                  "UN_WORK":"MIN",
                  "UN_WORK_ISO":"MIN",
                  "REM_WORK":"0.0",
                  "UN_REM_WRK":"MIN",
                  "UN_REM_WRK_ISO":"MIN",
                  "ACTUAL_DUR":"0.0",
                  "EXEC_START_DATE":"20250107",
                  "EXEC_START_TIME":"135717",
                  "EXEC_FIN_DATE":"20250107",
                  "EXEC_FIN_TIME":"140217",
                  "FCST_FIN_DATE":"00000000",
                  "FCST_FIN_TIME":"240000",
                  "PERS_NO":"2826",
                  "ACT_TYPE":"L100"
               },
               {
                  "@SEGMENT":"1",
                  "ORDERID":"5330263",
                  "OPERATION":"0020",
                  "SPLIT":"0",
                  "POSTG_DATE":"20250107",
                  "PLANT":"1120",
                  "ACT_WORK":"15",
                  "UN_WORK":"MIN",
                  "UN_WORK_ISO":"MIN",
                  "REM_WORK":"0.0",
                  "UN_REM_WRK":"MIN",
                  "UN_REM_WRK_ISO":"MIN",
                  "ACTUAL_DUR":"0.0",
                  "EXEC_START_DATE":"20250107",
                  "EXEC_START_TIME":"142025",
                  "EXEC_FIN_DATE":"20250107",
                  "EXEC_FIN_TIME":"143525",
                  "FCST_FIN_DATE":"00000000",
                  "FCST_FIN_TIME":"240000",
                  "PERS_NO":"2826",
                  "ACT_TYPE":"L100"
               },
               {
                  "@SEGMENT":"1",
                  "ORDERID":"5330263",
                  "OPERATION":"0100",
                  "SPLIT":"0",
                  "POSTG_DATE":"20250107",
                  "PLANT":"1120",
                  "ACT_WORK":"8",
                  "UN_WORK":"MIN",
                  "UN_WORK_ISO":"MIN",
                  "REM_WORK":"0.0",
                  "UN_REM_WRK":"MIN",
                  "UN_REM_WRK_ISO":"MIN",
                  "ACTUAL_DUR":"0.0",
                  "EXEC_START_DATE":"20250107",
                  "EXEC_START_TIME":"143537",
                  "EXEC_FIN_DATE":"20250107",
                  "EXEC_FIN_TIME":"144337",
                  "FCST_FIN_DATE":"00000000",
                  "FCST_FIN_TIME":"240000",
                  "PERS_NO":"2826",
                  "ACT_TYPE":"L100"
               },
               {
                  "@SEGMENT":"1",
                  "ORDERID":"5330263",
                  "OPERATION":"0082",
                  "SPLIT":"0",
                  "POSTG_DATE":"20250107",
                  "PLANT":"1120",
                  "ACT_WORK":"5",
                  "UN_WORK":"MIN",
                  "UN_WORK_ISO":"MIN",
                  "REM_WORK":"0.0",
                  "UN_REM_WRK":"MIN",
                  "UN_REM_WRK_ISO":"MIN",
                  "ACTUAL_DUR":"0.0",
                  "EXEC_START_DATE":"20250107",
                  "EXEC_START_TIME":"143911",
                  "EXEC_FIN_DATE":"20250107",
                  "EXEC_FIN_TIME":"144411",
                  "FCST_FIN_DATE":"00000000",
                  "FCST_FIN_TIME":"240000",
                  "PERS_NO":"2826",
                  "ACT_TYPE":"L100"
               }
            ]
         }
      }
   }
}