EPO Consulting Wiki - EPO Connector ETL for SAP Inbound Calls

Principles for ETL SAP Inbound Calls

All data objects provided must be fetched with the following 2 steps:


  1. getList: This API will return the relevant object keys for the called object
  2. getData: This API returns object data
    Additionally the definition of an object can be fetched with the API:

  3. getDefinition: This API returns the fields, their types and length and description of the called object


See also EPO Connector ETL: The Concept

and see EPO Connector ETL: Initial Customizing


Precondition for ETL SAP Inbound Calls

  1. EPO Connector must be installed
  2. Workbench Transport for EPO Connector ETL packages must be imported
  3. Optional: Workbench Transport for solution like ELO DMS must be imported
  4. EPO Connector Customizing must be set-up
  5. ETL Customizing must be set-up
  6. SAP Server must be reachable via SICF (EPO Connector handler)


getList API

getList Request

HTTP Method: GET

Authentication: Depending on SAP Server setting in SICF. E.g. HTTP Basic Authentication with a SAP User and Password.

URL: https://[SAP Server:Port]/epo1soa/jsonhandler/[EPO Connector Service]/getList/[ETL Object]/[ETL Key Prefix]?fromDate=YYYYMMDDhhmmss

URL Part Optional Description
http or https no Protocol
[SAP Server:Port] no Name or IP of the SAP server or the proxy server (e.g. SAP Web Dispatcher). See transaction SMICM in SAP.
/epo1soa/jsonhandler/ no EPO Connector JSON handler. See transaction SICF in SAP. Check also for the authentication methods here.
[EPO Connector Service] no EPO Service, which has to be customized in SAP.
/getList/ no API for getting list of object instances (=object numbers)
[ETL Object] no Object, which is called. The object has to be customized in SAP. Objects can be anything from master data, document data or database table data.
[ETL Key Prefix] yes The ETL Key Prefix can be an organisational unit like the company code. By default it is the company code for objects provided by EPO Consulting.
Parameter fromDate yes This parameter should be available for all objects. It means all objects, which were created or updated on or after that date and time. The fromDate timestamp must be in format YYYYMMDDhhmmss. A fromDate in format YYYYMMDD is also accepted. hhmmss will be set to 000000.


Request Examples:

Getting all Vendor keys from company code 1000, created or changed on or after 1. Jan. 2020

https://sap.epoconsulting.com/epo1soa/jsonhandler/elo2sap/getList/ELOVendor/1000?fromDate=20200101000000


Getting all Vendor keys from company code 1000

https://sap.epoconsulting.com/epo1soa/jsonhandler/elo2sap/getList/ELOVendor/1000


Getting all Vendor keys from all company codes

https://sap.epoconsulting.com/epo1soa/jsonhandler/elo2sap/getList/ELOVendor


getList Response

Response to all ETL calls should have the following 3 root elements:

  1. "epo1ok": Is "X", when the processing of the call was successful (e.g. objects were found and returned)
  2. "epo1message": Contains messages of type E=error, I=info, W=warnung. Type A=abort and type X=fatal error should not be used.
  3. "epo1exp": Contains the data. Opposite to the first two elements, the epo1exp element could be different for each ETL object. For the getList API it will be the same structure for all object types. Only the contents (the object keys) will have a different meaning.
Structure of epo1ok

"epo1ok": "X", when the call was ok. "" or not existent, when an error occured.

Structure of epo1message (SAP type BAPIRET2_T)

"epo1message": [{ elements... }] is an array of objects, containing the following elements

  1. "type": "E" for error, "I" for info, "W" for warning
  2. "id": containing the SAP message class
  3. "number": containing the SAP number (in JSON number format)
  4. "message": containing the message from SAP
  5. "logNo": SAP application log number (normally empty)
  6. "logMsgNo": SAP application log message (normally empty)
  7. "messageV1": First variable of message
  8. "messageV2": Second variable of message
  9. "messageV3": Third variable of message
  10. "messageV4": Fourth variable of message
  11. "parameter": A parameter of the message (normally empty)
  12. "row": Indicating the row number of a table (normally empty) (in JSON number format)
  13. "field": Indicating the field name of a table (normally empty)
  14. "system": containing the SAP system identification
Structure of epo1exp for the getList API

"epo1exp": { elements... } is an objects, containing the following 3 elements

  1. "etlQty": containing the quantity of etlKeys returned (in JSON number format)
  2. "hasMoreResults": Always returns false, meaning that all available ETL object keys were returned. Could be implemented differently in future. (in JSON boolean format)
  3. "etlKeyT": Is an array containing the unique keys for each object instance. Those ETL keys must then be queried with the getData API in step 2.
getList JSON Response Examples

Example successful response:

{
    "epo1ok": "X",
    "epo1exp": {
        "etlQty": 18,
        "hasMoreResults": false,
        "etlKeyT": [
            "1000T-K520D01",
            "1000T-K520C01",
            "10000000000015"
        ]
    }
}

Example error response:

{
    "epo1message": [
        {
            "type": "E",
            "id": "/EPO1/ETL_MESSAGES",
            "number": 1,
            "message": "No datasets selected",
            "system": "T90CLNT090"
        }
    ]
}


getData API


getData Request

HTTP Method: POST

Authentication: Depending on SAP Server setting in SICF. E.g. HTTP Basic Authentication with a SAP User and Password.

URL: https://[SAP Server:Port]/epo1soa/jsonhandler/[EPO Connector Service]/getData/[ETL Object]

JSON Payload: In the payload the ETL keys for the requested objects must be sent.

Structure of the payload

"etlKeyT": [ array of keys ] containing the ETL keys, which were fetched with API getList.

Note: If the list is very large, you may call the getData API more often making packages. We recommend a package size between 100 and 2000 ETL object keys per payload = API call.

URL Part Optional Description
http or https no Protocol
[SAP Server:Port] no Name or IP of the SAP server or the proxy server (e.g. SAP Web Dispatcher). See transaction SMICM in SAP.
/epo1soa/jsonhandler/ no EPO Connector JSON handler. See transaction SICF in SAP. Check also for the authentication methods here.
[EPO Connector Service] no EPO Service, which has to be customized in SAP.
/getData/ no API for getting data of object instances (=object numbers)
[ETL Object] no Object, which is called. The object has to be customized in SAP. Objects can be anything from master data, document data or database table data.


Request Example:

Getting Vendor data for the 3 ETL Vendor keys sent in the JSON payload.

https://sap.epoconsulting.com/epo1soa/jsonhandler/elo2sap/getData/ELOVendor

{
    "etlKeyT": [
        "10000000100644",
        "1000T-K500E00",
        "1000T-K500C01"
    ]
}


getData Response

Response to all ETL calls should have the following 3 root elements:

  1. "epo1ok": Is "X", when the processing of the call was successful (e.g. objects were found and returned)
  2. "epo1message": Contains messages of type E=error, I=info, W=warnung. Type A=abort and type X=fatal error should not be used.
  3. "epo1exp": Contains the data. Opposite to the first two elements, the epo1exp element will be different for each ETL object.
Structure of epo1ok

"epo1ok": "X", when the call was ok. "" or not existent, when an error occured.

Structure of epo1message (SAP type BAPIRET2_T)

"epo1message": [{ elements... }] is an array of objects, containing the following elements

  1. "type": "E" for error, "I" for info, "W" for warning
  2. "id": containing the SAP message class
  3. "number": containing the SAP number (in JSON number format)
  4. "message": containing the message from SAP
  5. "logNo": SAP application log number (normally empty)
  6. "logMsgNo": SAP application log message (normally empty)
  7. "messageV1": First variable of message
  8. "messageV2": Second variable of message
  9. "messageV3": Third variable of message
  10. "messageV4": Fourth variable of message
  11. "parameter": A parameter of the message (normally empty)
  12. "row": Indicating the row number of a table (normally empty) (in JSON number format)
  13. "field": Indicating the field name of a table (normally empty)
  14. "system": containing the SAP system identification
Structure of epo1exp for the getData API

"epo1exp": { elements... } is an objects, containing any structure. For ETL APIs the elements are normally following this structure:

  1. "objectok": "X", when the object was ok. "" or not existent, when an error occured.
  2. "objectmessage": containing a message from SAP in case of an error
  3. "etlKey": containing the ETL key for the object number
  4. "object": Is an element containing the object data. This will be different for each object type. The definition of this can be retrieved with the API getDefinition
getData Response Examples

Example successful response for ELOVendor:

{
    "epo1ok": "X",
    "epo1exp": [
        {
            "objectok": "X",
            "etlKey": "10000000100644",
            "object": {
                "bukrs": "1000",
                "lifnr": "0000100644",
                "name": "Gartner KG. ",
                "street": "Linzerstraße",
                "aenam": "KROISSW"
            }
        },
        {
            "objectok": "X",
            "etlKey": "1000T-K500E00",
            "object": {
                "bukrs": "1000",
                "lifnr": "T-K500E00",
                "name": "Elektroblitz GmbH Gr.00 ",
                "street": "Teststrasse",
                "houseNum1": "34/5",
                "postCode1": "80331",
                "city1": "München",
                "country": "DE",
                "smtpAddr": "test@epoconsulting.com",
                "telNumber": "+49 1234456",
                "faxNumber": "+49 454676747",
                "stceg": "DE123456451",
                "stcd1": "12345678",
                "bank": [
                    {
                        "banka": "Giro-Bank",
                        "iban": "DE391001001067640584",
                        "swift": "SWIFT123451"
                    },
                    {
                        "banka": "Moneta SPARDA",
                        "iban": "DE803009905506674757",
                        "swift": "DEUTDEFFXXX"
                    }
                ],
                "erdat": "2003-06-11",
                "ernam": "WEISSANN",
                "udate": "2022-05-17",
                "aenam": "CICEKA"
            }
        },
        {
            "objectok": "X",
            "etlKey": "1000T-K500C01",
            "object": {
                "bukrs": "1000",
                "lifnr": "T-K500C01",
                "name": "TAG Potsdam Gr.01 ",
                "street": "Schopenhauerstraße",
                "erdat": "2003-02-25",
                "ernam": "RENDES",
                "udate": "2020-09-15",
                "aenam": "AIGNERM"
            }
        }
    ]
}

Example response with 1 ETL key wrong, which leads to an objectmessage:

{
    "epo1ok": "X",
    "epo1exp": [
        {
            "objectok": "X",
            "etlKey": "10000000100644",
            "object": {
                "bukrs": "1000",
                "lifnr": "0000100644",
                "name": "Gartner KG. ",
                "street": "Linzerstraße",
                "houseNum1": "40",
                "postCode1": "4650",
                "city1": "Edt bei Lambach",
                "country": "AT",
                "stceg": "ATU24879503",
                "erdat": "2021-12-15",
                "ernam": "KROISSW",
                "udate": "2021-12-15",
                "aenam": "KROISSW"
            }
        },
        {
            "objectmessage": [
                {
                    "type": "E",
                    "id": "/EPO1/ETL_MESSAGES",
                    "number": 12,
                    "message": "BUKRS and LIFNR combination in ETL_KEY not found: 1000T-K500E001",
                    "messageV1": "1000T-K500E001",
                    "system": "T90CLNT090"
                }
            ]
        }
    ]
}


Example error response when the request payload has got wrong structure:

Wrong Request

{
    "etlKeyT_got_it_wrong": [
        "10000000100644",
        "1000T-K500E00"
    ]
}


{
    "callstatus": {
        "code": 999,
        "type": "E",
        "subject": "EPO XML Connector class exception",
        "description": "No valid source context supplied",
        "transactionid": "0000100000077776",
        "mandt": "800",
        "sysid": "WK1"
    }
}





getDefinition API


getDefinition Request

HTTP Method: GET

Authentication: Depending on SAP Server setting in SICF. E.g. HTTP Basic Authentication with a SAP User and Password.

URL: https://[SAP Server:Port]/epo1soa/jsonhandler/[EPO Connector Service]/getDefinition/[ETL Object]

URL Part Optional Description
http or https no Protocol
[SAP Server:Port] no Name or IP of the SAP server or the proxy server (e.g. SAP Web Dispatcher). See transaction SMICM in SAP.
/epo1soa/jsonhandler/ no EPO Connector JSON handler. See transaction SICF in SAP. Check also for the authentication methods here.
[EPO Connector Service] no EPO Service, which has to be customized in SAP.
/getDefinition/ no API for getting the definition of the getData API for an object
[ETL Object] no Object, which is called. The object has to be customized in SAP. Objects can be anything from master data, document data or database table data.
/object yes Only the fields of the object will be returned. All other fields except "epo1ok" will be skipped. The field names will be returned without object. prefix.


Request Example:

Getting the definition for the getData API for the object ELOVendor


Full API definition:

https://sap.epoconsulting.com/epo1soa/jsonhandler/elo2sap/getDefinition/ELOVendor


API definition reduced to object (simplified)

https://sap.epoconsulting.com/epo1soa/jsonhandler/elo2sap/getDefinition/ELOVendor/object

getDefinition Response

Response to all ETL calls can have the following 3 root elements:

  1. "epo1ok": Is "X", when the call was successful (e.g. object was found and the definition was returned)
  2. "epo1message": Contains messages of type E=error, I=info, W=warnung. Type A=abort and type X=fatal error should not be used. "epo1message" will be skipped, if the path /object is added to the API call.
  3. "epo1exp": Contains the definition data. If the path /object is added to the API call, the API will return only the fields of the structurce "object" and the returned field names will be without the prefix object. For example instead of object.bukrs it will be just bukrs in field "name".


Structure of epo1ok

"epo1ok": "X", when the call was ok. "" or not existent, when an error occured.

Structure of epo1message (SAP type BAPIRET2_T)

"epo1message": [{ elements... }] is an array of objects, containing the following elements

  1. "type": "E" for error, "I" for info, "W" for warning
  2. "id": containing the SAP message class
  3. "number": containing the SAP number (in JSON number format)
  4. "message": containing the message from SAP
  5. "logNo": SAP application log number (normally empty)
  6. "logMsgNo": SAP application log message (normally empty)
  7. "messageV1": First variable of message
  8. "messageV2": Second variable of message
  9. "messageV3": Third variable of message
  10. "messageV4": Fourth variable of message
  11. "parameter": A parameter of the message (normally empty)
  12. "row": Indicating the row number of a table (normally empty) (in JSON number format)
  13. "field": Indicating the field name of a table (normally empty)
  14. "system": containing the SAP system identification
Structure of epo1exp for the getDefinition API

"epo1exp": [{ elements... }] is an array of objects, containing the following elements

  1. "name": name of the element
  2. "type": type of the element. You may need to map the SAP types to your local types. STRING can have a maximum length (see outputlen).
  3. "length": not in use, must be described (in JSON number format)
  4. "decimals": not in use, must be described (in JSON number format)
  5. "sign": not in use, must be described (in JSON boolean format)
  6. "outputlen": The maximum length of the element (in JSON number format)
  7. "description": Description of the element


EPO standard ETL objects will contain the following 4 fields on root level (returned in field "name")

a) "objectok": Is "X", when the object was read successful.

b) "objectmessage": Contains messages for the object. It has the same structure as epo1message.

c) "etlKey": It contains the key of the object.

d) "object": The object contains the response structure of the EPO ETL API. If the path /object is added to the API call, the returned field names will be without the prefix object. For example instead of object.bukrs it will be just bukrs.


getDefinition Response Example

Example successful response for ELOVendor.

Like described above the element "epo1exp" contains the 4 elements "objectok", "objectmessage", "etlKey" and "object".

Only the "object" element will be different for different object types.

  1{
  2    "epo1ok": "X",
  3    "epo1exp": [
  4        {
  5            "name": "objectok",
  6            "type": "CHAR",
  7            "outputlen": 1,
  8            "sign": false,
  9            "bytelength": 2,
 10            "isKey": false,
 11            "alwaysFilled": false,
 12            "description": "Indicator"
 13        },
 14        {
 15            "name": "objectmessage",
 16            "type": "ARRAY",
 17            "sign": false,
 18            "isKey": false,
 19            "alwaysFilled": false
 20        },
 21        {
 22            "name": "objectmessage[].type",
 23            "type": "CHAR",
 24            "outputlen": 1,
 25            "sign": false,
 26            "bytelength": 2,
 27            "isKey": false,
 28            "alwaysFilled": false,
 29            "description": "Message type"
 30        },
 31        {
 32            "name": "objectmessage[].id",
 33            "type": "CHAR",
 34            "outputlen": 20,
 35            "sign": false,
 36            "bytelength": 40,
 37            "isKey": false,
 38            "alwaysFilled": false,
 39            "description": "Message Class"
 40        },
 41        {
 42            "name": "objectmessage[].number",
 43            "type": "INT",
 44            "outputlen": 3,
 45            "sign": false,
 46            "bytelength": 6,
 47            "isKey": false,
 48            "alwaysFilled": false,
 49            "description": "Message number"
 50        },
 51        {
 52            "name": "objectmessage[].message",
 53            "type": "CHAR",
 54            "outputlen": 220,
 55            "sign": false,
 56            "bytelength": 440,
 57            "isKey": false,
 58            "alwaysFilled": false,
 59            "description": "Message text"
 60        },
 61        {
 62            "name": "objectmessage[].logNo",
 63            "type": "CHAR",
 64            "outputlen": 20,
 65            "sign": false,
 66            "bytelength": 40,
 67            "isKey": false,
 68            "alwaysFilled": false,
 69            "description": "Log number"
 70        },
 71        {
 72            "name": "objectmessage[].logMsgNo",
 73            "type": "INT",
 74            "outputlen": 6,
 75            "sign": false,
 76            "bytelength": 12,
 77            "isKey": false,
 78            "alwaysFilled": false,
 79            "description": "Message serial no."
 80        },
 81        {
 82            "name": "objectmessage[].messageV1",
 83            "type": "CHAR",
 84            "outputlen": 50,
 85            "sign": false,
 86            "bytelength": 100,
 87            "isKey": false,
 88            "alwaysFilled": false,
 89            "description": "Message Variable"
 90        },
 91        {
 92            "name": "objectmessage[].messageV2",
 93            "type": "CHAR",
 94            "outputlen": 50,
 95            "sign": false,
 96            "bytelength": 100,
 97            "isKey": false,
 98            "alwaysFilled": false,
 99            "description": "Message Variable"
100        },
101        {
102            "name": "objectmessage[].messageV3",
103            "type": "CHAR",
104            "outputlen": 50,
105            "sign": false,
106            "bytelength": 100,
107            "isKey": false,
108            "alwaysFilled": false,
109            "description": "Message Variable"
110        },
111        {
112            "name": "objectmessage[].messageV4",
113            "type": "CHAR",
114            "outputlen": 50,
115            "sign": false,
116            "bytelength": 100,
117            "isKey": false,
118            "alwaysFilled": false,
119            "description": "Message Variable"
120        },
121        {
122            "name": "objectmessage[].parameter",
123            "type": "CHAR",
124            "outputlen": 32,
125            "sign": false,
126            "bytelength": 64,
127            "isKey": false,
128            "alwaysFilled": false,
129            "description": "Parameter Name"
130        },
131        {
132            "name": "objectmessage[].row",
133            "type": "INT",
134            "outputlen": 10,
135            "sign": true,
136            "bytelength": 4,
137            "isKey": false,
138            "alwaysFilled": false,
139            "description": "Lines in parameter"
140        },
141        {
142            "name": "objectmessage[].field",
143            "type": "CHAR",
144            "outputlen": 30,
145            "sign": false,
146            "bytelength": 60,
147            "isKey": false,
148            "alwaysFilled": false,
149            "description": "Field name"
150        },
151        {
152            "name": "objectmessage[].system",
153            "type": "CHAR",
154            "outputlen": 10,
155            "sign": false,
156            "bytelength": 20,
157            "isKey": false,
158            "alwaysFilled": false,
159            "description": "Logical system (source of message)"
160        },
161        {
162            "name": "etlKey",
163            "type": "CHAR",
164            "outputlen": 255,
165            "sign": false,
166            "bytelength": 510,
167            "isKey": false,
168            "alwaysFilled": false,
169            "description": "Key"
170        },
171        {
172            "name": "object.bukrs",
173            "type": "CHAR",
174            "outputlen": 4,
175            "sign": false,
176            "bytelength": 8,
177            "isKey": true,
178            "alwaysFilled": true,
179            "description": "Company Code"
180        },
181        {
182            "name": "object.lifnr",
183            "type": "CHAR",
184            "outputlen": 10,
185            "sign": false,
186            "bytelength": 20,
187            "isKey": true,
188            "alwaysFilled": true,
189            "description": "Vendor"
190        },
191        {
192            "name": "object.name",
193            "type": "VARCHAR",
194            "sign": false,
195            "isKey": false,
196            "alwaysFilled": true,
197            "description": "Name"
198        },
199        {
200            "name": "object.street",
201            "type": "CHAR",
202            "outputlen": 60,
203            "sign": false,
204            "bytelength": 120,
205            "isKey": false,
206            "alwaysFilled": false,
207            "description": "Street"
208        },
209        {
210            "name": "object.houseNum1",
211            "type": "CHAR",
212            "outputlen": 10,
213            "sign": false,
214            "bytelength": 20,
215            "isKey": false,
216            "alwaysFilled": false,
217            "description": "House Number"
218        },
219        {
220            "name": "object.postCode1",
221            "type": "CHAR",
222            "outputlen": 10,
223            "sign": false,
224            "bytelength": 20,
225            "isKey": false,
226            "alwaysFilled": false,
227            "description": "Postal Code"
228        },
229        {
230            "name": "object.city1",
231            "type": "CHAR",
232            "outputlen": 40,
233            "sign": false,
234            "bytelength": 80,
235            "isKey": false,
236            "alwaysFilled": false,
237            "description": "City"
238        },
239        {
240            "name": "object.country",
241            "type": "CHAR",
242            "outputlen": 3,
243            "sign": false,
244            "bytelength": 6,
245            "isKey": false,
246            "alwaysFilled": true,
247            "description": "Country Key"
248        },
249        {
250            "name": "object.smtpAddr",
251            "type": "CHAR",
252            "outputlen": 241,
253            "sign": false,
254            "bytelength": 482,
255            "isKey": false,
256            "alwaysFilled": false,
257            "description": "E-Mail Address"
258        },
259        {
260            "name": "object.telNumber",
261            "type": "CHAR",
262            "outputlen": 30,
263            "sign": false,
264            "bytelength": 60,
265            "isKey": false,
266            "alwaysFilled": false,
267            "description": "Telephone"
268        },
269        {
270            "name": "object.faxNumber",
271            "type": "CHAR",
272            "outputlen": 30,
273            "sign": false,
274            "bytelength": 60,
275            "isKey": false,
276            "alwaysFilled": false,
277            "description": "Fax"
278        },
279        {
280            "name": "object.stceg",
281            "type": "CHAR",
282            "outputlen": 20,
283            "sign": false,
284            "bytelength": 40,
285            "isKey": false,
286            "alwaysFilled": false,
287            "description": "VAT Registration No."
288        },
289        {
290            "name": "object.stcd1",
291            "type": "CHAR",
292            "outputlen": 16,
293            "sign": false,
294            "bytelength": 32,
295            "isKey": false,
296            "alwaysFilled": false,
297            "description": "Tax Number 1"
298        },
299        {
300            "name": "object.busab",
301            "type": "CHAR",
302            "outputlen": 2,
303            "sign": false,
304            "bytelength": 4,
305            "isKey": false,
306            "alwaysFilled": false,
307            "description": "Clerk Abbreviation"
308        },
309        {
310            "name": "object.bank",
311            "type": "ARRAY",
312            "sign": false,
313            "isKey": false,
314            "alwaysFilled": false
315        },
316        {
317            "name": "object.bank[].banka",
318            "type": "CHAR",
319            "outputlen": 60,
320            "sign": false,
321            "bytelength": 120,
322            "isKey": false,
323            "alwaysFilled": false,
324            "description": "Bank name"
325        },
326        {
327            "name": "object.bank[].iban",
328            "type": "CHAR",
329            "outputlen": 34,
330            "sign": false,
331            "bytelength": 68,
332            "isKey": false,
333            "alwaysFilled": false,
334            "description": "IBAN"
335        },
336        {
337            "name": "object.bank[].swift",
338            "type": "CHAR",
339            "outputlen": 11,
340            "sign": false,
341            "bytelength": 22,
342            "isKey": false,
343            "alwaysFilled": false,
344            "description": "SWIFT/BIC"
345        },
346        {
347            "name": "object.erdat",
348            "type": "DATE",
349            "outputlen": 10,
350            "sign": false,
351            "bytelength": 16,
352            "isKey": false,
353            "alwaysFilled": false,
354            "description": "Created on"
355        },
356        {
357            "name": "object.ernam",
358            "type": "CHAR",
359            "outputlen": 12,
360            "sign": false,
361            "bytelength": 24,
362            "isKey": false,
363            "alwaysFilled": false,
364            "description": "Created by"
365        },
366        {
367            "name": "object.udate",
368            "type": "DATE",
369            "outputlen": 10,
370            "sign": false,
371            "bytelength": 16,
372            "isKey": false,
373            "alwaysFilled": false,
374            "description": "Date"
375        },
376        {
377            "name": "object.aenam",
378            "type": "CHAR",
379            "outputlen": 12,
380            "sign": false,
381            "bytelength": 24,
382            "isKey": false,
383            "alwaysFilled": false,
384            "description": "Changed by"
385        },
386        {
387            "name": "object.erpsy",
388            "type": "CHAR",
389            "outputlen": 7,
390            "sign": false,
391            "bytelength": 14,
392            "isKey": false,
393            "alwaysFilled": false,
394            "description": "ERP-System"
395        },
396        {
397            "name": "object.dunningData",
398            "type": "STRUCT",
399            "sign": false,
400            "isKey": false,
401            "alwaysFilled": false
402        },
403        {
404            "name": "object.dunningData.mandt",
405            "type": "CHAR",
406            "outputlen": 3,
407            "sign": false,
408            "bytelength": 6,
409            "isKey": false,
410            "alwaysFilled": false,
411            "description": "Client"
412        },
413        {
414            "name": "object.dunningData.lifnr",
415            "type": "CHAR",
416            "outputlen": 10,
417            "sign": false,
418            "bytelength": 20,
419            "isKey": false,
420            "alwaysFilled": false,
421            "description": "Vendor"
422        },
423        {
424            "name": "object.dunningData.bukrs",
425            "type": "CHAR",
426            "outputlen": 4,
427            "sign": false,
428            "bytelength": 8,
429            "isKey": false,
430            "alwaysFilled": false,
431            "description": "Company Code"
432        },
433        {
434            "name": "object.dunningData.maber",
435            "type": "CHAR",
436            "outputlen": 2,
437            "sign": false,
438            "bytelength": 4,
439            "isKey": false,
440            "alwaysFilled": false,
441            "description": "Dunning Area"
442        },
443        {
444            "name": "object.dunningData.mahna",
445            "type": "CHAR",
446            "outputlen": 4,
447            "sign": false,
448            "bytelength": 8,
449            "isKey": false,
450            "alwaysFilled": false,
451            "description": "Dunning Procedure"
452        },
453        {
454            "name": "object.dunningData.mansp",
455            "type": "CHAR",
456            "outputlen": 1,
457            "sign": false,
458            "bytelength": 2,
459            "isKey": false,
460            "alwaysFilled": false,
461            "description": "Dunning Block"
462        },
463        {
464            "name": "object.dunningData.madat",
465            "type": "DATE",
466            "outputlen": 10,
467            "sign": false,
468            "bytelength": 16,
469            "isKey": false,
470            "alwaysFilled": false,
471            "description": "Last Dunned"
472        },
473        {
474            "name": "object.dunningData.mahns",
475            "type": "INT",
476            "outputlen": 1,
477            "sign": false,
478            "bytelength": 2,
479            "isKey": false,
480            "alwaysFilled": false,
481            "description": "Dunning Level"
482        },
483        {
484            "name": "object.dunningData.lfrma",
485            "type": "CHAR",
486            "outputlen": 10,
487            "sign": false,
488            "bytelength": 20,
489            "isKey": false,
490            "alwaysFilled": false,
491            "description": "Dunn.recipient"
492        },
493        {
494            "name": "object.dunningData.gmvdt",
495            "type": "DATE",
496            "outputlen": 10,
497            "sign": false,
498            "bytelength": 16,
499            "isKey": false,
500            "alwaysFilled": false,
501            "description": "Legal dunn.proc.from"
502        },
503        {
504            "name": "object.dunningData.busab",
505            "type": "CHAR",
506            "outputlen": 2,
507            "sign": false,
508            "bytelength": 4,
509            "isKey": false,
510            "alwaysFilled": false,
511            "description": "Dunning clerk"
512        }
513    ]
514}


getDefinition Response Example when called with path /object

Example successful response for ELOVendor.

Like described above the element "epo1exp" contains the 4 elements "objectok", "objectmessage", "etlKey" and "object".

Only the "object" element will be different for different object types.

  1{
  2    "epo1ok": "X",
  3    "epo1exp": [
  4        {
  5            "name": "bukrs",
  6            "type": "CHAR",
  7            "outputlen": 4,
  8            "sign": false,
  9            "bytelength": 8,
 10            "isKey": true,
 11            "alwaysFilled": true,
 12            "description": "Company Code"
 13        },
 14        {
 15            "name": "lifnr",
 16            "type": "CHAR",
 17            "outputlen": 10,
 18            "sign": false,
 19            "bytelength": 20,
 20            "isKey": true,
 21            "alwaysFilled": true,
 22            "description": "Vendor"
 23        },
 24        {
 25            "name": "name",
 26            "type": "VARCHAR",
 27            "sign": false,
 28            "isKey": false,
 29            "alwaysFilled": true,
 30            "description": "Name"
 31        },
 32        {
 33            "name": "street",
 34            "type": "CHAR",
 35            "outputlen": 60,
 36            "sign": false,
 37            "bytelength": 120,
 38            "isKey": false,
 39            "alwaysFilled": false,
 40            "description": "Street"
 41        },
 42        {
 43            "name": "houseNum1",
 44            "type": "CHAR",
 45            "outputlen": 10,
 46            "sign": false,
 47            "bytelength": 20,
 48            "isKey": false,
 49            "alwaysFilled": false,
 50            "description": "House Number"
 51        },
 52        {
 53            "name": "postCode1",
 54            "type": "CHAR",
 55            "outputlen": 10,
 56            "sign": false,
 57            "bytelength": 20,
 58            "isKey": false,
 59            "alwaysFilled": false,
 60            "description": "Postal Code"
 61        },
 62        {
 63            "name": "city1",
 64            "type": "CHAR",
 65            "outputlen": 40,
 66            "sign": false,
 67            "bytelength": 80,
 68            "isKey": false,
 69            "alwaysFilled": false,
 70            "description": "City"
 71        },
 72        {
 73            "name": "country",
 74            "type": "CHAR",
 75            "outputlen": 3,
 76            "sign": false,
 77            "bytelength": 6,
 78            "isKey": false,
 79            "alwaysFilled": true,
 80            "description": "Country Key"
 81        },
 82        {
 83            "name": "smtpAddr",
 84            "type": "CHAR",
 85            "outputlen": 241,
 86            "sign": false,
 87            "bytelength": 482,
 88            "isKey": false,
 89            "alwaysFilled": false,
 90            "description": "E-Mail Address"
 91        },
 92        {
 93            "name": "telNumber",
 94            "type": "CHAR",
 95            "outputlen": 30,
 96            "sign": false,
 97            "bytelength": 60,
 98            "isKey": false,
 99            "alwaysFilled": false,
100            "description": "Telephone"
101        },
102        {
103            "name": "faxNumber",
104            "type": "CHAR",
105            "outputlen": 30,
106            "sign": false,
107            "bytelength": 60,
108            "isKey": false,
109            "alwaysFilled": false,
110            "description": "Fax"
111        },
112        {
113            "name": "stceg",
114            "type": "CHAR",
115            "outputlen": 20,
116            "sign": false,
117            "bytelength": 40,
118            "isKey": false,
119            "alwaysFilled": false,
120            "description": "VAT Registration No."
121        },
122        {
123            "name": "stcd1",
124            "type": "CHAR",
125            "outputlen": 16,
126            "sign": false,
127            "bytelength": 32,
128            "isKey": false,
129            "alwaysFilled": false,
130            "description": "Tax Number 1"
131        },
132        {
133            "name": "busab",
134            "type": "CHAR",
135            "outputlen": 2,
136            "sign": false,
137            "bytelength": 4,
138            "isKey": false,
139            "alwaysFilled": false,
140            "description": "Clerk Abbreviation"
141        },
142        {
143            "name": "bank",
144            "type": "ARRAY",
145            "sign": false,
146            "isKey": false,
147            "alwaysFilled": false
148        },
149        {
150            "name": "bank[].banka",
151            "type": "CHAR",
152            "outputlen": 60,
153            "sign": false,
154            "bytelength": 120,
155            "isKey": false,
156            "alwaysFilled": false,
157            "description": "Bank name"
158        },
159        {
160            "name": "bank[].iban",
161            "type": "CHAR",
162            "outputlen": 34,
163            "sign": false,
164            "bytelength": 68,
165            "isKey": false,
166            "alwaysFilled": false,
167            "description": "IBAN"
168        },
169        {
170            "name": "bank[].swift",
171            "type": "CHAR",
172            "outputlen": 11,
173            "sign": false,
174            "bytelength": 22,
175            "isKey": false,
176            "alwaysFilled": false,
177            "description": "SWIFT/BIC"
178        },
179        {
180            "name": "erdat",
181            "type": "DATE",
182            "outputlen": 10,
183            "sign": false,
184            "bytelength": 16,
185            "isKey": false,
186            "alwaysFilled": false,
187            "description": "Created on"
188        },
189        {
190            "name": "ernam",
191            "type": "CHAR",
192            "outputlen": 12,
193            "sign": false,
194            "bytelength": 24,
195            "isKey": false,
196            "alwaysFilled": false,
197            "description": "Created by"
198        },
199        {
200            "name": "udate",
201            "type": "DATE",
202            "outputlen": 10,
203            "sign": false,
204            "bytelength": 16,
205            "isKey": false,
206            "alwaysFilled": false,
207            "description": "Date"
208        },
209        {
210            "name": "aenam",
211            "type": "CHAR",
212            "outputlen": 12,
213            "sign": false,
214            "bytelength": 24,
215            "isKey": false,
216            "alwaysFilled": false,
217            "description": "Changed by"
218        },
219        {
220            "name": "erpsy",
221            "type": "CHAR",
222            "outputlen": 7,
223            "sign": false,
224            "bytelength": 14,
225            "isKey": false,
226            "alwaysFilled": false,
227            "description": "ERP-System"
228        },
229        {
230            "name": "dunningData",
231            "type": "STRUCT",
232            "sign": false,
233            "isKey": false,
234            "alwaysFilled": false
235        },
236        {
237            "name": "dunningData.mandt",
238            "type": "CHAR",
239            "outputlen": 3,
240            "sign": false,
241            "bytelength": 6,
242            "isKey": false,
243            "alwaysFilled": false,
244            "description": "Client"
245        },
246        {
247            "name": "dunningData.lifnr",
248            "type": "CHAR",
249            "outputlen": 10,
250            "sign": false,
251            "bytelength": 20,
252            "isKey": true,
253            "alwaysFilled": true,
254            "description": "Vendor"
255        },
256        {
257            "name": "dunningData.bukrs",
258            "type": "CHAR",
259            "outputlen": 4,
260            "sign": false,
261            "bytelength": 8,
262            "isKey": true,
263            "alwaysFilled": true,
264            "description": "Company Code"
265        },
266        {
267            "name": "dunningData.maber",
268            "type": "CHAR",
269            "outputlen": 2,
270            "sign": false,
271            "bytelength": 4,
272            "isKey": false,
273            "alwaysFilled": false,
274            "description": "Dunning Area"
275        },
276        {
277            "name": "dunningData.mahna",
278            "type": "CHAR",
279            "outputlen": 4,
280            "sign": false,
281            "bytelength": 8,
282            "isKey": false,
283            "alwaysFilled": false,
284            "description": "Dunning Procedure"
285        },
286        {
287            "name": "dunningData.mansp",
288            "type": "CHAR",
289            "outputlen": 1,
290            "sign": false,
291            "bytelength": 2,
292            "isKey": false,
293            "alwaysFilled": false,
294            "description": "Dunning Block"
295        },
296        {
297            "name": "dunningData.madat",
298            "type": "DATE",
299            "outputlen": 10,
300            "sign": false,
301            "bytelength": 16,
302            "isKey": false,
303            "alwaysFilled": false,
304            "description": "Last Dunned"
305        },
306        {
307            "name": "dunningData.mahns",
308            "type": "INT",
309            "outputlen": 1,
310            "sign": false,
311            "bytelength": 2,
312            "isKey": false,
313            "alwaysFilled": false,
314            "description": "Dunning Level"
315        },
316        {
317            "name": "dunningData.lfrma",
318            "type": "CHAR",
319            "outputlen": 10,
320            "sign": false,
321            "bytelength": 20,
322            "isKey": false,
323            "alwaysFilled": false,
324            "description": "Dunn.recipient"
325        },
326        {
327            "name": "dunningData.gmvdt",
328            "type": "DATE",
329            "outputlen": 10,
330            "sign": false,
331            "bytelength": 16,
332            "isKey": false,
333            "alwaysFilled": false,
334            "description": "Legal dunn.proc.from"
335        },
336        {
337            "name": "dunningData.busab",
338            "type": "CHAR",
339            "outputlen": 2,
340            "sign": false,
341            "bytelength": 4,
342            "isKey": false,
343            "alwaysFilled": false,
344            "description": "Dunning clerk"
345        }
346    ]
347}

EPO Connector Customizing for ETL SAP Inbound Calls

The EPO Connector can be called with SAP transaction /epo1/exc (add it to your favorites)

  1. Set up an EPO Connector Service
  2. Set up the 3 APIs getList, getData and getDefinition

EPO Connector Service and Operation.png

Set up an EPO Connector Service

Transaction /EPO1/SERVICES12

For example create an EPO Connector Service with name "elo2sap"

EPO ETL Inbound Service.png

Set up the 3 APIs getList, getData and getDefinition

Transaction /EPO1/EPORTIN12

and Transaction /EPO1/GFMCOP12


Transaction /EPO1/EPORTIN12

API: getList

GetList.png


Transaction /EPO1/EPORTIN12

API: getData

GetData.png


Transaction /EPO1/EPORTIN12

API: getDefinition

GetDefinition.png


Transaction /EPO1/GFMCOP12

Assign function modules to the operations

Elo2sap Assign Operation.png


ETL Customizing

ETL Customizing is done with transaction SM30 for the following 4 customizing tables (table /EPO1/ETLOBJ_OUT is not relevant):

ETL Object Customizing tables
Table Description Detail
/EPO1/ETLOBJ Definition of an ETL object
/EPO1/ETLOBJ_IN ETL Inbound: Function and structure for ETL objects Only relevant for ETL Inbound scenarios
/EPO1/ETLOBJ_OUT ETL Outbound: Class and Realtime definition for ETL objects Only relevant for ETL Outbound scenarios
/EPO1/ETLOBJ_SID Object settings by SAP System ID No deletion of an object entry after reading/sending
/EPO1/ETLOBJ_FLD Define key fields and always filled fields Relevant only for API getDefinition

ETL Object Definition in Table /EPO1/ETLOBJ

Definition of ETL objects

ETL Object Definition.png

ETL Inbound Function in Table /EPO1/ETLOBJ_IN

Definition of the processing function module and its EPO1EXP exporting structure.

"Fill log" flag means, that it updates object entries (inserted into table /EPO1/ETLLOG) when API getList is called.

Note: With the EPO ETL solution there are 2 other options for filling table /EPO1/ETL. First there is a report provided and second there is the method /EPO1/CL_ETL_LOG->ADD_KEY, which can be used in SAP User-Exits for real-time updates.


ETL Object IN.png

ETL Settings per SAP System ID in Table /EPO1/ETLOBJ_SID

By default object entries will be cleared out of table /EPO1/ETLLOG when API getData reads it.

ETL Object SID.png

ETL Fields in Table /EPO1/ETLOBJ_FLD

Table entries for setting key fields and obligatory fields for the getDefinition API.

ETL Fields Table.png