SAP Import & Export Spezifikation
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
;, ZeilenseparatorLF/ ASCII0A) - Kodierung: UTF-8
- Keine Kopfzeile
- 9 Spalten
- Unbekannt (Üblicher Wert
PA1CLNT100) - WERKS (Üblicher Wert
1110) - LGNUM (Üblicher Wert
GOE) - LGTYP (Üblicher Wert
107) - Materialnummer (Beispielwert
000000003500002130- Beim Import werden die führenden Nullen entfernt!) - Materialbezeichnung (Beispielwert
Prüfschnur S0 für PrTel93i/96) - Lagerort (Beispielwert
M 04-02) - Einheit (Beispielwert
ST) - Materialbestand (Beispielwert
99- ACHTUNG Dieser Wert muss ganzzahlig sein)
- Unbekannt (Üblicher Wert
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
;, ZeilenseparatorLF/ ASCII0A) - Kodierung: UTF-8
- Keine Kopfzeile
- 24 Spalten
- Meldungsnummer
- Position
- Materialnummer
- Hersteller-Nummer
- Hersteller
- Inventarnummer
- Kundenbestellnummer
- Auftragskennzeichen
- Warenempfänger
- Kundenname 1
- Kundenname 2
- Kundenname 3
- Kunden Straße
- PLZ
- Ort
- Land
- Servicekennzeichen (Hinweise siehe unten)
- Werkstattauftrag
- Wareneingang
- Ord Tech Abschdatum
- Datum Closed
- Seriennummer
- Interne Seriennummer
- 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"
}
]
}
}
}
}