/////////////////////////////////////////////////////////// // X08_SAP_Objednavky.cs // Implementation of the Class X08_SAP_Objednavky // Created on: 1.6.2009 // Original author: Miroslav Brousek /////////////////////////////////////////////////////////// using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using KZ.SapNeos.Engine.Resources; using KZ.SapNeos.Engine.Exceptions; using KZ.SapNeos.Engine.Transactions; using KZ.SapNeos.Engine.Data; using KZ.SapNeos.Engine.Alerts; using KZ.SapNeos.WebServices.SAP.ZNEOS_ALL; namespace KZ.SapNeos.Engine.DataExchange { /// /// Třída zajišťující zápis dat objednávek z interní DB /// do cílového systému (SAP) prostřednictvím určeného rozhraní ..... . /// Načtení musí být uskutečněno v rámci spuštěné transakce. /// Odkaz na spuštěnou transakci se předává parametrem konstruktoru. /// class X08_SAP_Objednavky { /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Konstruktory a "destruktor" Dispose. /////////////////////////////////////////////////////////////////////////////////////////////////////////////// public X08_SAP_Objednavky(SITransaction Transaction) { this.InitComponents(Transaction); } /// /// Uvolnění prostředků alokovaných třídou. /// public void Dispose() { this.DoneComponents(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Public properties & methods /////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal Properties & methods /////////////////////////////////////////////////////////////////////////////////////////////////////////////// internal string CurrentOrderNo { get {return _CurrentOrderNo; }} /// /// Zapíše data načtená do DB v rámci spuštěné transakce do cílového systému (SAP) /// prostřednictvím služby rozhraní SR07 /// internal void Write(bool AllRecs) { this.doWrite(AllRecs); } internal void Commit() { this.doCommit(); } internal void Rollback(string ErrorMessage) { this.doRollback(ErrorMessage); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private properties & attributes declaration /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ---- Private attributes ------------------------------------------------------------------------------------ private SIExceptions _Exceptions = SIExceptions.Instance; private SITransaction _Transaction; private KZ.SapNeos.Engine.Data.Objednavka _ObjednavkaNeOS; private KZ.SapNeos.Engine.Data.Objednavka _ObjednavkaResponse; private ZNEOS_ALL _WebService; private ArrayList _Headers; private ArrayList _Items; private KZ_PurchaseOrdersNeOS_INResponse _WebServiceResponse; private KZ_PurchaseOrdersNeOS_IN _Orders; private ObjednavkaIOResult _ObjednavkaIOResult; private string _CurrentOrderNo; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private methods implementations /////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ---- Public properties Get.. & Set.. methods --------------------------------------------------------------- // ---- Internal properties Get.. & Set.. methods ------------------------------------------------------------- // ---- Private metods implementation ------------------------------------------------------------------------- private void InitComponents(SITransaction Transaction) { _Transaction = Transaction; if (_Transaction == null) _Exceptions.ThrowException(802, SIResourceStrings.sE0802_TransactionIDMissing); if (_Transaction.TransactionState != TransactionStates.Running) _Exceptions.ThrowException(803, SIResourceStrings.sE0803_TransactionIsNotActive); _ObjednavkaNeOS = new KZ.SapNeos.Engine.Data.Objednavka(); _ObjednavkaResponse = new KZ.SapNeos.Engine.Data.Objednavka(); _Orders = new KZ_PurchaseOrdersNeOS_IN(); if (SISetup.Instance.Echo || SISetup.Instance.Test || SISetup.Instance.ReadOnly) _Orders.I_FCODE = "99"; else _Orders.I_FCODE = "01"; _Orders.I_TRANS_ID = _Transaction.TransactionID.ToString(); _WebService = new ZNEOS_ALL(); _WebService.Url = SISetup.Instance.SAP_ZNeosServiceURL; _WebService.Credentials = new NetworkCredential(SISetup.Instance.SAPServiceUserName, SISetup.Instance.SAPServicePswd); _WebService.Timeout = SISetup.Instance.SAPServiceTimeout; _Headers = new ArrayList(); _Items = new ArrayList(); _ObjednavkaIOResult = new ObjednavkaIOResult(); _ObjednavkaIOResult.UID_Transaction = _Transaction.TransactionID; } private void DoneComponents() { try { if (_Items != null) _Items.Clear(); if (_Headers != null) _Headers.Clear(); if (_WebService != null) _WebService.Dispose(); if (_ObjednavkaNeOS != null) _ObjednavkaNeOS.Dispose(); if (_ObjednavkaResponse != null) _ObjednavkaResponse.Dispose(); if (_ObjednavkaIOResult != null) _ObjednavkaIOResult.Dispose(); } catch (Exception e) { if (_Exceptions != null) _Exceptions.HandleException(e); } finally { _ObjednavkaIOResult = null; _ObjednavkaNeOS = null; _ObjednavkaResponse = null; _WebService = null; _Items = null; _Headers = null; } } private void addHeader(string ID) { ZINV_HEADER Header = new ZINV_HEADER(); Header.INTID = "SR08"; Header.OBJID = ID.Trim(); Header.TSTMP = SIDateUtils.ToSAPDate(DateTime.Now); _Headers.Add(Header); } private void addItem(string ID, string Key, string Value) { if (Value != null) { ZINV_ITEM Item = new ZINV_ITEM(); Item.INTID = "SR08"; Item.OBJID = ID.Trim(); Item.PARNA = Key.Trim(); Item.PARVA = Value.Trim(); _Items.Add(Item); } } private void fillCurrentRec() { this.addHeader(_ObjednavkaNeOS.CisloPor); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.cenamj", _ObjednavkaNeOS.CenaMJ.ToString().Replace(',', '.')); this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.cislopor", _ObjednavkaNeOS.CisloPor ); // this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.cislopor", this.getCisloPor()); this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.datum", SIDateUtils.ToSAPDate(_ObjednavkaNeOS.Datum)); this.addItem(_ObjednavkaNeOS.CisloPor, "catsupplier.id_biztran", _ObjednavkaNeOS.ID_BizTran ); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.idcatitem", _ObjednavkaNeOS.IDCatItem ); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.ssup", _ObjednavkaNeOS.Sup ); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.sean", _ObjednavkaNeOS.EAN ); this.addItem(_ObjednavkaNeOS.CisloPor, "oddeleni.kod", _ObjednavkaNeOS.Kod ); this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.odber", _ObjednavkaNeOS.Odber); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.sSubSumObj", _ObjednavkaNeOS.SubSumObj); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.typKoduPolozky", _ObjednavkaNeOS.TypKoduPolozky); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.mj", _ObjednavkaNeOS.MJ ); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.mnozstvi", _ObjednavkaNeOS.Mnozstvi.ToString().Replace(',', '.')); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.nazev", _ObjednavkaNeOS.Nazev ); this.addItem(_ObjednavkaNeOS.CisloPor, "catsupplier.SAP_KodDod", _ObjednavkaNeOS.SAP_KodDod ); this.addItem(_ObjednavkaNeOS.CisloPor, "polozka.SAP_SkupMat", _ObjednavkaNeOS.SAP_SkupMat ); // this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.zakazka", _ObjednavkaNeOS.Zakazka ); this.addItem(_ObjednavkaNeOS.CisloPor, "objednavka.zpracovatel", _ObjednavkaNeOS.Zpracovatel ); } private void fillData() { _Items.Clear(); _Headers.Clear(); bool Continue = _ObjednavkaNeOS.First(); while (Continue) { this.fillCurrentRec(); Continue = _ObjednavkaNeOS.Next(); } } /// /// Volání služby pro zápis dat do cílového systému. /// Při výjimce opakuje tři pokusy. /// private void callService() { _Orders.IT_HEADERS = (ZINV_HEADER[])_Headers.ToArray(typeof(ZINV_HEADER)); _Orders.IT_ITEMS = (ZINV_ITEM[])_Items.ToArray(typeof(ZINV_ITEM)); Exception CurrentException = null; int Attempt = 0; bool OK = false; while ((!OK) && (Attempt < SISetup.Instance.MaxAttempts)) { try { _WebServiceResponse = _WebService.KZ_PurchaseOrdersNeOS_IN(_Orders); OK = true; } catch (Exception e) { // Zaznamená pouze první výjimku, následná již můžre být touto ovlivněna a tudíž nevypovídající if (CurrentException == null) CurrentException = e; Attempt++; _Transaction.Warning(String.Format(SIResourceStrings.sW0801_CallServiceAtemptFailed, e.Message, Attempt)); } } if (!OK) { if (CurrentException != null) throw CurrentException; else throw new SIException(804, SIResourceStrings.sE0804_CallSAPWebServiceError); } } private void addResponseItem(ZINV_ITEM Item) { if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_TYP") _ObjednavkaResponse.SAP_Typ = Item.PARVA; else if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_OBJEKT") _ObjednavkaResponse.SAP_Objekt = Item.PARVA; else if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_POLOZKA") _ObjednavkaResponse.SAP_Polozka = Item.PARVA; else if (Item.PARNA.Trim().ToUpper() == "POLOZKA.SAP_CENA") // _ObjednavkaResponse.SAP_Cena = Convert.ToDecimal(Item.PARVA.Replace('.',',')); _ObjednavkaResponse.SAP_Cena = Convert.ToDecimal(Item.PARVA); } /// /// Zapíše do DB vrácené hodnoty. /// private void updateReturnValues() { if (_WebServiceResponse != null) { _ObjednavkaResponse.UID_Transaction = _Transaction.TransactionID; _ObjednavkaResponse.Init(); foreach (ZINV_ITEM Item in _WebServiceResponse.ET_ITEMS) { if ((_ObjednavkaResponse.CisloPor != null) && (Item.OBJID != _ObjednavkaResponse.CisloPor)) _ObjednavkaResponse.Write(); _ObjednavkaResponse.CisloPor = Item.OBJID; this.addResponseItem(Item); } if (_ObjednavkaResponse.CisloPor != null) _ObjednavkaResponse.Write(); } } /// /// Zapíše do DB výsledky přenosu. /// private void updateResults() { if (_WebServiceResponse != null) { foreach (ZINV_BAPIRET_S Result in _WebServiceResponse.ET_RETURN) { _ObjednavkaIOResult.MarkResult(Result.OBJID, Result); } } } /// /// Zkontroluje výsledek přenosu a v případě chyby odešle výstrahu. /// private void checkResults() { string AlertText = ""; if (_WebServiceResponse != null) { foreach (ZINV_BAPIRET_S Result in _WebServiceResponse.ET_RETURN) { if (Result.TYPE.Trim().ToUpper() == "E") AlertText += "E: " + Result.OBJID.Trim() + " - " + Result.MESSAGE.Trim() + Environment.NewLine; } } if (AlertText != "") { KZ.SapNeos.Engine.Alerts.Alert ExchangeAlert = new KZ.SapNeos.Engine.Alerts.Alert(); try { ExchangeAlert.Kind = AlertKinds.DataFailure; ExchangeAlert.Header = SIResourceStrings.sAlertDataErrorLabel + SIResourceStrings.sAlertOrders2; ExchangeAlert.Body = SIResourceStrings.sAlertOrdersDataErrorHeader + Environment.NewLine + Environment.NewLine + AlertText + Environment.NewLine + SIResourceStrings.sAlertOrdersDataErrorFooter; ExchangeAlert.Send(); } finally { ExchangeAlert.Dispose(); } } } private void doWriteAll() { _ObjednavkaNeOS.UID_Transaction = _Transaction.TransactionID; //Chkpt 01 - Fill data _Transaction.CheckPoint(SIResourceStrings.sTM0811_SAPReadingData); this.fillData(); //Chkpt 02 - Call WebService _Transaction.CheckPoint(SIResourceStrings.sTM0812_SAPCallServiceStart); throw new Exception("Zkus"); this.callService(); //Chkpt 03 - Updating response _Transaction.CheckPoint(SIResourceStrings.sTM0813_SAPUpdatingResults); this.updateResults(); //Chkpt 04 - Updating returned values _Transaction.CheckPoint(SIResourceStrings.sTM0814_SAPUpdatingReturnValues); this.updateReturnValues(); //Chkpt 05 - Checking results _Transaction.CheckPoint(SIResourceStrings.sTM0816_SAPCheckingResults); this.checkResults(); //Chkpt 05 - Data reading finished _Transaction.CheckPoint(SIResourceStrings.sTM0815_SAPDataTransferFinishedAll); } private void doSendOrder() { try { this.callService(); this.updateResults(); this.updateReturnValues(); this.checkResults(); } finally { _Items.Clear(); _Headers.Clear(); } _Transaction.CheckPoint(String.Format(SIResourceStrings.sTM0815_SAPDataTransferFinishedOne, _CurrentOrderNo)); } private void doWritePerPartes() { _Transaction.CheckPoint(SIResourceStrings.sTM0811_SAPReadingData); _ObjednavkaNeOS.UID_Transaction = _Transaction.TransactionID; _CurrentOrderNo = ""; _Items.Clear(); _Headers.Clear(); //Do SQL pro načtení bylo 13.1.2011 doplněno "ORDER BY CisloNeOS", //takže by měly záznamy jedné objednávky chodit "vcelku" zasebou. bool Continue = _ObjednavkaNeOS.First(); while (Continue) { if (_CurrentOrderNo != _ObjednavkaNeOS.CisloNeOS) { if (_CurrentOrderNo != "") doSendOrder(); _CurrentOrderNo = _ObjednavkaNeOS.CisloNeOS; } this.fillCurrentRec(); Continue = _ObjednavkaNeOS.Next(); } if (_CurrentOrderNo != "") doSendOrder(); } /// /// Zápis dat do cílového systému. /// Data se zapisují po jednotlivých záznamech. /// Výsledek každého volání služby se dokumentuje v DB. /// private void doWrite(bool AllRecs) { if (AllRecs) doWriteAll(); else doWritePerPartes(); } private void doCommit() { XX_SAP_TransConfirmation TransConfirmation = new XX_SAP_TransConfirmation(_Transaction); try { TransConfirmation.Commit(); } finally { TransConfirmation.Dispose(); } } private void doRollback(string ErrorMessage) { XX_SAP_TransConfirmation TransConfirmation = new XX_SAP_TransConfirmation(_Transaction); try { TransConfirmation.Rollback(ErrorMessage); } finally { TransConfirmation.Dispose(); } } // ------------------------------------------------------------------------------------------------------------ } }