I will be doing a series of projects for a company called Zimt Apps. They’ve built an API for SAP that allows devs like me to easily do stuff with SAP data. Full disclosure, my father works for Zimt.
My old man has been in the ERP game a long time. Most recently he ran an ERP team for Cap Gemini creating new front ends that talked to SAP. Then one day, him and a fellow engineer caught that old entrepreneurial bug and set out to make it easier to allow developers to communicate with SAP in a more modern fashion. So myself being a developer, I decided I oughta put it to the test and see how it goes.
They’ve got a demo instance all set up, so my plan is to create a web app that is easy to use, leverages a modern development platform (.NET) in this case.
I’ve been experiementing a bit with the technology and basically it works like I would expect an api should. Basically there are a bunch of different functions to call that they call “zpacks”. You make a call to a zpack and pass it a json string of data, the Zimt software does its thing in SAP and sends you back a json response.
For example, to get a list of purchase orders, I would post to the zpack ZIMT.ZPACK.MM.POLIST and the body would look like
{ "AGENT": "AROSENTHAL" }
and the response comes back like
{ "JSON": { "RESPONSE": [ { "PO_NUMBER": "4500022392", "VENDORNUMBER": "T-K515A14", "CATEGORY": "", "TYPE": "NB", "CREATOR": "AROSENTHAL", "STATUS": "9", "PURCHASEORG": "1000", "PURCHASEGRP": "001", "NETVALUE": 6000, "CURRENCY": "EUR", "LINEITEMS": [ { "LINEITEM": "00010", "CHANGEDON": "0000-00-00", "SHORTTEXT": "Rohling für Spiralgehäuse", "MATERIALNUMBER": "", "CO_CODE": "", "PLANT": "1000", "STORAGELOCATION": "0001", "TRACKINGNUMBER": "", "MATERIALGROUP": "001", "VENDORMATNUMBER": "", "TARGETQUANTITY": 0, "QUANTITY": 100, "UOM": "ST", "ORDERPRICEUNIT": "ST", "NETPRICE": 10, "PRICEUNIT": 1, "NETVALUE": 0, "GROSSVALUE": 0, "GRTIMEINDAYS": 0, "SALESTAX": "", "STOCKTYPE": "", "ITEMCATEGORY": "0", "BASEUOM": "", "CUSTOMER": "", "ACCASSIGNMENT": "" }, { "LINEITEM": "00020", "CHANGEDON": "0000-00-00", "SHORTTEXT": "Flachdichtung", "MATERIALNUMBER": "", "CO_CODE": "", "PLANT": "1000", "STORAGELOCATION": "0001", "TRACKINGNUMBER": "", "MATERIALGROUP": "001", "VENDORMATNUMBER": "", "TARGETQUANTITY": 0, "QUANTITY": 100, "UOM": "ST", "ORDERPRICEUNIT": "ST", "NETPRICE": 50, "PRICEUNIT": 1, "NETVALUE": 0, "GROSSVALUE": 0, "GRTIMEINDAYS": 0, "SALESTAX": "", "STOCKTYPE": "", "ITEMCATEGORY": "0", "BASEUOM": "", "CUSTOMER": "", "ACCASSIGNMENT": "" } ] }, { "PO_NUMBER": "4500022393", "VENDORNUMBER": "0000001000", "CATEGORY": "", "TYPE": "NB", "CREATOR": "AROSENTHAL", "STATUS": "9", "PURCHASEORG": "1000", "PURCHASEGRP": "001", "NETVALUE": 11707.2, "CURRENCY": "USD", "LINEITEMS": [ { "LINEITEM": "00010", "CHANGEDON": "0000-00-00", "SHORTTEXT": "Slug for spiral casing", "MATERIALNUMBER": "", "CO_CODE": "", "PLANT": "1000", "STORAGELOCATION": "0001", "TRACKINGNUMBER": "", "MATERIALGROUP": "001", "VENDORMATNUMBER": "", "TARGETQUANTITY": 0, "QUANTITY": 100, "UOM": "ST", "ORDERPRICEUNIT": "ST", "NETPRICE": 10, "PRICEUNIT": 767, "NETVALUE": 0, "GROSSVALUE": 0, "GRTIMEINDAYS": 0, "SALESTAX": "", "STOCKTYPE": "", "ITEMCATEGORY": "0", "BASEUOM": "", "CUSTOMER": "", "ACCASSIGNMENT": "" }, { "LINEITEM": "00020", "CHANGEDON": "0000-00-00", "SHORTTEXT": "Flat gasket", "MATERIALNUMBER": "", "CO_CODE": "", "PLANT": "1000", "STORAGELOCATION": "0001", "TRACKINGNUMBER": "", "MATERIALGROUP": "001", "VENDORMATNUMBER": "", "TARGETQUANTITY": 0, "QUANTITY": 200, "UOM": "ST", "ORDERPRICEUNIT": "ST", "NETPRICE": 50, "PRICEUNIT": 767, "NETVALUE": 0, "GROSSVALUE": 0, "GRTIMEINDAYS": 0, "SALESTAX": "", "STOCKTYPE": "", "ITEMCATEGORY": "0", "BASEUOM": "", "CUSTOMER": "", "ACCASSIGNMENT": "" }, { "LINEITEM": "00030", "CHANGEDON": "0000-00-00", "SHORTTEXT": "Casings", "MATERIALNUMBER": "", "CO_CODE": "", "PLANT": "1000", "STORAGELOCATION": "", "TRACKINGNUMBER": "", "MATERIALGROUP": "001", "VENDORMATNUMBER": "", "TARGETQUANTITY": 0, "QUANTITY": 2, "UOM": "ST", "ORDERPRICEUNIT": "ST", "NETPRICE": 176.8, "PRICEUNIT": 1, "NETVALUE": 0, "GROSSVALUE": 0, "GRTIMEINDAYS": 0, "SALESTAX": "", "STOCKTYPE": "", "ITEMCATEGORY": "0", "BASEUOM": "", "CUSTOMER": "", "ACCASSIGNMENT": "" }, { "LINEITEM": "00040", "CHANGEDON": "0000-00-00", "SHORTTEXT": "Casings", "MATERIALNUMBER": "", "CO_CODE": "", "PLANT": "1000", "STORAGELOCATION": "", "TRACKINGNUMBER": "", "MATERIALGROUP": "001", "VENDORMATNUMBER": "", "TARGETQUANTITY": 0, "QUANTITY": 2, "UOM": "ST", "ORDERPRICEUNIT": "ST", "NETPRICE": 176.8, "PRICEUNIT": 1, "NETVALUE": 0, "GROSSVALUE": 0, "GRTIMEINDAYS": 0, "SALESTAX": "", "STOCKTYPE": "", "ITEMCATEGORY": "0", "BASEUOM": "", "CUSTOMER": "", "ACCASSIGNMENT": "" } ] }, ...
So, my goal is to do three things, display this list of POs, when the user clicks one, make another call to the zpack ZIMT.ZPACK.MM.PO which will get me all the details for that PO, and let the user edit or create a new puchase order.