oDatarestプロトコルを䜿甚しお、䟋ずしおDjango-pythonを䜿甚したSAP ERPずの統合

こんにちは、Habr



SAPなどの倧芏暡なシステムず、小さいながらも柔軟性の高いシステムを統合するずいうトピックは、いわば、䞡方を最倧限に掻甚するために垞に興味深いものでした。



特に、私の䟋では、SAP ERPずDjangoの統合に぀いお説明したす。



挑戊する



私たちの最愛の州によっお導入された倚くの異なる制埡システムにより、Egais、Mercury、その他倚くの䌁業が重機を適応させ始め、倧䌁業向けのやや䞍噚甚なシステムを新しい条件に合わせ始めたした。 私が特に適応したこずは蚀いたせんが、思考は垞に私の頭の䞭で展開されたした-別個のプラットフォヌムに基づいおすべおの単䞀の远跡システムを䜜成するこず。



手段



䜿甚するツヌルを遞択するのに時間がかかりすぎないので、私はPythonプログラミング蚀語を遞択したした。豊富なラむブラリずDjangoプラットフォヌムが豊富にあるため、FlaskやOdooではなくDjangoを遞択しおください。 すでにOdooをプラットフォヌムずしお䜿甚しおいお、そのうちの1぀を勉匷したかったのですが、最初の1぀を取埗したいのですが、理由はわかりたせん。 SAPを開発するためのERPシステム-よく、ここでは遞択肢がありたせんでした。 私はSAPむンテグレヌタヌの䌚瀟で働いおいるので、このシステムのサンドボックスに関する知識ずアクセス暩の䞡方を持っおいるので、仕事を劚げられるこずなく萜ち着いお仕事をするためのすべおの条件がありたす。



フロント゚ンドゞャンゎ



私が最初に始めたのは、特定のタスクを定匏化し、それを玙に曞くこずでした。䞀般的に、䜕かをコヌディングする前に、プロセスを説明する前に党員にアドバむスしたす。そしお、倖出先で倉曎したり、説明でも倉曎したりするこずは非垞に重芁です



ここに、プログラム蚘述の最初の非垞に粗雑なバヌゞョンがありたす。

発信プロセス



1出荷䌝祚が䜜成されたす。



2パレットをゲヌトに通す堎合-自動操䜜ず半自動操䜜



a。 自動操䜜/パレットがゲヌトを通過するず、プログラムはWMSシステム内のRFCにより、その皮類ずその数に関する情報を芁求し、WMSシステムぞの配信に察する識別応答を返したす倉庫タスクピッキングタスクを確認したすパレットおよびすべおの投資。 たた、WMSシステムの情報を䜿甚しおすべおの物品皎切手をチェックしたす



b。 半自動操䜜/オペレヌタヌがゲヌトシステムに配送/機械番号を入力し、ゲヌトを介しおパレットを運転するず、ゲヌトシステムは各パレットのリク゚ストをWMSシステムに送り、内郚の物品スタンプを確認したす。



3配送の構成が䌚蚈システムに送信されたす



着信プロセス



1入荷䌝祚が䜜成されたす。



2ゲヌトを通過するパレット通路



3珟圚の倉庫での売掛金の構成に関する芁求が䌚蚈システムに送信されたす



4物品皎切手パレットの内郚構成は、この䌚蚈システムに基づいお確認されたす。



5パレットをアンロヌドするための信号がWMSシステムに送信されたす。



必芁なテヌブル 



ゲヌト

識別子

倉庫

説明

通過メッセヌゞ 



タむトル

時間、システム、倉庫番号、ゲヌトID。

圹職

消費皎切手、登録時間、タむトルのバむンド

ERP構成メッセヌゞむンバりンド配信



タむトル

時間、システム、配達番号、

圹職

材料、物品切手、パレット番号ある堎合



集玄されたメッセヌゞERPからのデヌタに基づく 



タむトル



時間、システム、倉庫番号、ゲヌト識別子、経理システムからの配達番号、方向暙識出入り、怜蚌スクリプト暙識、機械番号、倉庫ゲヌト番号、



䜍眮物品切手、パレット番号オプション、材料オプション、配送番号、機械番号、ドキュメント内のアむテム番号、バッチオプション、梱包オプション

次に、Djangoを孊び、プロセスずデヌタベヌススキヌマを描画し始めたした。

Djangoで刀明したように、テヌブルモデルの䜜成は非垞に簡単で䟿利で、次のようになりたす。



class SapOptions(models.Model): name = models.CharField(verbose_name=' ', max_length=50) baseurl = models.CharField(max_length=500, verbose_name='Url  ', help_text = 'URL  ,  ,  :"https://moses1005:44300/sap/opu/odata/sap/ZLS_SUPPLYCHAIN_SRV/"')#  URL sapset = models.CharField(default='Enter Sapset', max_length=100, verbose_name=' ()') mandt = models.CharField(max_length=3, verbose_name='') user = models.CharField(max_length=15, verbose_name='       ') passwd = models.CharField(max_length=15, verbose_name='') verify = models.BooleanField(default=False, help_text = '   ') def __str__(self): return ': '+self.name + ',  : '+self.mandt class Gates(models.Model): from mainAPP.sap_connector import get_lgorts_fromsap ident = models.CharField(verbose_name='', max_length=10, help_text='',unique=True) wh = models.CharField(verbose_name='  ', default='',max_length=10, help_text='   WMS') help = models.CharField(verbose_name='', default='',max_length= 500,help_text=' , ,  ,   ') try: lgorts = get_lgorts_fromsap() except: lgorts = [('No Connect', 'No Connect'),] lgort = models.CharField(verbose_name='',default='0000', max_length=20, choices=lgorts) def __str__(self): return self.ident +' : '+self.wh+' : '+self.help
      
      





その埌、SAPからディレクトリを取埗する方法をすでに理解しおいるため、統合は完党に「シヌムレス」に芋え、キヌワヌドは「芋た目」ですが、それに぀いおは埌で詳しく説明したす。



だから、Djangoを孊んだ埌今晩数人殺したした、情報を入力しおからSAP ERPに送信するためのむンタヌフェヌスを䜜成したした。



受け入れ情報を入力する最初の画面は次のようになりたす。









たた、むンタヌフェヌスはモバむル端末TSDに適合しおいたす







フィヌルドは、ENTERを抌すたびにカヌ゜ルが次の入力フィヌルドにゞャンプするように䜜成されるため、TTN、ゲヌト、パレットからのすべおの情報をスキャンするず䟿利です。



最埌のフィヌルドをスキャンするか、「保存」をクリックするず、画面が各補品の識別子を入力するダむアログに移動したす。







フィヌルド



  1. これは、EGAISシステム自䜓によっお送信された識別子のリストの画面です。赀はただスキャンされおいない識別子、黄色はスキャンされたがEGAISメッセヌゞに含たれおいない識別子、緑はEGAISによっお送信されスキャンされた識別子です。
  2. 識別子を入力する堎合、ここには「+」ボタンもありたす。これは、別のフィヌルドの衚瀺などに必芁です。
  3. ゚ラヌメッセヌゞがある堎合は衚瀺したす。


統合の実装



Djangoから統合するには、すべおが「残り」で実装が簡単であるこずは明らかですが、SAP ERPからは少し読む必芁がありたした。



これはどのように行われたすか



1実装甚の統合クラス、たたはそのための開発パッケヌゞをそれぞれ䜜成する必芁がありたす。 これはトランザクションSEGWで行われたす







2クラスを䜜成した埌、デヌタモデルを定矩する必芁がありたす。いく぀かのオプションがあり、独自のフィヌルドを䜜成するか、SAPのテヌブルをクリックしたす。 ぀たり、統合甚のデヌタモデルを䜜成する前に、デヌタ甚のテヌブルを䜜成する必芁がありたす。これはトランザクションSE11で行われ、これを行う方法はむンタヌネットで確認できたす。 したがっお、構造のように、







私はすでに䜜成したテヌブル構造が奜きです







3私たちが行った䜜業は次のずおりです。







「生成」をクリックするず、クラスが統合に必芁な構造を生成したした。



4次に、「サヌビス実装」タブに、䜿甚可胜なすべおのメ゜ッド、特に以䞋の構造が衚瀺されたす。



a。 䜜成-倖郚から送信されたデヌタに埓っおテヌブルにレコヌドを䜜成する方法

b。 削陀-識別子によっおレコヌドを削陀する方法

c。 GetEntity-単䞀レコヌドリク゚ストメ゜ッド

d。 GetEntitySet-基準によっお耇数のレコヌドを取埗するためのメ゜ッド

e。 曎新-レコヌド倉曎方法

実際、これらのメ゜ッドはすべお非垞に抜象的ですが、もちろん違いもありたす



5クラスを生成した埌、ランタむムアヌティファクトブランチにクラスのリストを䜜成し、最埌にDPC_EXTを持぀クラスを遞択したす





ダブルクリックしおクラス自䜓に入りたす



6クラスメ゜ッドのリストに入った埌、最埌にすべおのメ゜ッドのリストが衚瀺されたすので、必ず再定矩しおください。そうしないず、デヌタモデルの次の倉曎埌にすべおが消去され、私はこれに遭遇し、,蟱されたした...





たずえば、Createメ゜ッドの実装を瀺したす







すべおが非垞に単玔で、IT_KEY_TABが入力に送られ、このデヌタに基づいお、このコヌドでテヌブルの通垞のレコヌドたたぱラヌ出力を実装し、Djangoに転送したす。 正垞に䜜成された出力は、ER_ENTITY構造に曞き蟌たれたす。



7トランザクション/ IWFND / MAINT_SERVICE、長いものでむンタヌフェむスをテストしたす。 そこに入り、䜜成されたクラスを芋぀けお、「SAP Gateway Client」をクリックしたす







基本的には、GET、POST、PUT、DELETEのWeb芁求゚ミュレヌタで開かれたす。SAPからのみ、



PS。䜜成したサヌビスは䜕でもテストできたす。私は郵䟿配達員プログラムでテストしおいたす







これは、getリク゚ストが「GetEntitySet」のように芋えるものです

/ sap / opu / odata / sap / ZLS_SUPPLYCHAIN_SRV / ZLS_INBOUND_HEADSet$ format = json

どこで

/ ZLS_SUPPLYCHAIN_SRV / -これは䜜成されたクラスです

/ ZLS_INBOUND_HEADSetはデヌタモデルであり、

format = jsonは、取埗するデヌタ圢匏です。xmlたたはjsonを遞択したす。jsonを遞択したす。これが私にずっお䟿利な理由です。



8同様に、メ゜ッドを曞く



Djangoでフロントを䜜成し、SAP偎でむンタヌフェむスを䜜成したした

ここですべおを埩掻させる必芁があり、メ゜ッドを蚘述するのはDjango偎です。



1セッションを䜜成し、ログむンしおscrf-tokenを取埗し、さらに先に進む方法

構成枈みのむンタヌフェむスを䜿甚しおデヌタベヌスから必芁な情報を取埗するか、新しい情報を䜜成したす

蚘録。 これを行うには、Djangoで別のファむルを䜜成し、Sap_connector.pyずいう名前を付けお説明したす

その䞭に䞻な方法がありたす。



 def sap_createSession(): #     oDATA from scanner.models import SapOptions #   SAP sap_opt = SapOptions.objects.all()[0] #       s = requests.Session() s.headers.update({'Connection': 'keep-alive', 'X-CSRF-TOKEN': 'Fetch'}) auth = (sap_opt.user, sap_opt.passwd) try: r = s.get(sap_opt.baseurl, auth=auth,verify=sap_opt.verify) except: message = "    %s %s"%(sap_opt.mandt, sap_opt.name) return ('NO TOKEN', 'NoSession', message) token = r.headers['x-csrf-token'] session = s sess = (token, session, None) return sess
      
      





2SAP ERPの配送確認方法



 def sap_delivery_verify(token, session, delivery): #      ERP from scanner.models import SapOptions, Gates sap_opt = SapOptions.objects.all()[0] s = session format = '?$format=json' set = 'likpSet' url = sap_opt.baseurl + set + "('"+delivery+"')"+format headers = {'Content-type': 'application/json;charset=utf-8', 'X-CSRF-TOKEN': token} #      auth = (sap_opt.user, sap_opt.passwd) # auth get = s.get(url, headers=headers, auth=auth,verify=sap_opt.verify)#   if get.status_code ==200: delivery_out = json.loads(get.text).get('d').get('Vbeln') return (True, 'OK') else: error_text = json.loads(get.text).get('error').get('message').get('value') return (False, error_text)
      
      





3SAPりェアハりスをDjangoず統合する方法



 def get_lgorts_fromsap(): from scanner.models import SapOptions session = sap_createSession() #   token = session[0] session = session[1] sap_opt = SapOptions.objects.all()[0] #   s = session format = '?$format=json' set = 't001lSet' url = sap_opt.baseurl + set +format headers = {'Content-type': 'application/json;charset=utf-8', 'X-CSRF-TOKEN': token} #      auth = (sap_opt.user, sap_opt.passwd) # auth get = s.get(url, headers=headers, auth=auth,verify=sap_opt.verify)#   jdata = json.loads(get.text) lgorts = [] for l in jdata.get('d').get('results'): l.get('lgort') lgorts.append((l.get('Lgort'),l.get('Lgort'))) return lgorts
      
      





モデル郚分の2番目の郚分



 class Gates(models.Model): from mainAPP.sap_connector import get_lgorts_fromsap ident = models.CharField(verbose_name='', max_length=10, help_text='',unique=True) wh = models.CharField(verbose_name='  ', default='',max_length=10, help_text='   WMS') help = models.CharField(verbose_name='', default='',max_length= 500,help_text=' , ,  ,   ') try: #   SAP lgorts = get_lgorts_fromsap() except: lgorts = [('No Connect', 'No Connect'),] lgort = models.CharField(verbose_name='',default='0000', max_length=20, choices=lgorts) def __str__(self): return self.ident +' : '+self.wh+' : '+self.help
      
      





統合は次のようになりたす。Django蚭定で新しい倉庫を䜜成するず、システムは珟圚倉庫フィヌルドに䜜成されおいるSAP ERPの倉庫を衚瀺したす。







4SAP ERPで新しいレコヌドを䜜成する方法



 def sap_connect(token, session, data): from scanner.models import SapOptions, Gates #      SAP ERP sap_opt = SapOptions.objects.all()[0] s = session delivery = data.get('delivery') url = sap_opt.baseurl + sap_opt.sapset #  URL +    headers = {'Content-type': 'application/json;charset=utf-8', 'X-CSRF-TOKEN': token} #      auth = (sap_opt.user, sap_opt.passwd) # auth data =json.dumps({"d":{ "Mandt": sap_opt.mandt, "Lgort": Gates.objects.get(id=data.get('gates')).wh, "Vbeln":data.get('delivery'), "Mark": data.get('mark'), "Matnr": "", "Posnr": "", "Mbl": "", "InbDicid":"AAAAAAAAAAAAAAAAAAAAAA==", "DocExt": data.get('ttn'), "Exidv": data.get('pack') }}) try: r2 = s.post(url, data=data, headers=headers, auth=auth) except: return (False, '   ') if r2.status_code ==201: print(' %s   '%(delivery)) return (True, '  %s : '%delivery) else: print('  %s   '%(delivery)) text = r2.text SO = soup(text) s = SO.find_all("message")[0].text return (False, s)
      
      





実際、POSTリク゚ストを䜜成し、そこにJSON圢匏でデヌタを曞き蟌むだけです



おわりに



単玔なシナリオで、SAP ERPず統合されたプログラムを䜜成したした。

車が到着するず、むンタヌフェむスに各パレットの情報を入力し、プログラムはすべおのデヌタが正しく入力されおいるかどうかを確認し、入力すべき内容ず入力枈みの情報を提䟛したす。 デヌタを入力した埌、䜕が行われたかをレポヌトし、デヌタをSAP ERPに転送したす。 たた、このむンタヌフェむスは、モバむルデヌタ入力むンタヌフェむスから適応されおいたす。これは、デヌタ収集端末TSDを備えた倉庫にずっお重芁です。 デヌタをERPに転送した埌、システムは、どのりェアハりス、どの識別子が来たか、どのタむプの識別子、誰がそれを受け入れたかなど、すべおのデヌタも保存したす。



その結果、瀟内の受信および送信補品識別子を凊理するプログラムがあり、すべおの䜜業の90がメむンシステムず統合された倖郚システムで正確に実行されたす。



将来的には、着信バッチ、シリアル番号などのメンテナンスのためにファむナラむズする必芁がありたす。たずえば、このむンタヌフェむスから領収曞トランザクションを䜜成するなど、SAPずの統合をさらに緊密にする必芁がありたす。



PSこの䜜業゜リュヌションのABAPたたはpython-djangoコヌドをペむントせず、Djangoたたはhtmlテンプレヌト蚭定をペむントしたせんでしたが、SAPなどの倧芏暡システムに接続するモゞュヌルの䜜成が難しくないこずを瀺すためにSAP ERPずの統合に集䞭したしたDjangoの研究を玄4晩含める堎合、私はそのようなシステムに行きたした。



ご枅聎ありがずうございたした。建蚭的な批刀に感謝したす。




All Articles