Include (KZLibrary, KZISSetup) ///

Projekt: KZIS ///

Author : M. Brousek ///

Created: 10.9.2010 ///

Description: Služba pro přenos dat ze SAPu předaných prostřednictvím CSV souboru. ///

Viz též výkonná metoda OnProcessInput ///

Třída zachycuje a zpracovává události typu KZIS.Data.TS.Events.ekCSVFile Class KZIS.BS.SAP.SHandleCSVFile Extends Ens.BusinessService [ ProcedureBlock ] { Parameter ADAPTER = "EnsLib.File.InboundAdapter"; /// Přesune soubor ze sdílené složky do interní složky systému k následnému zpracování. Method MoveFile(pIncomingFile As %String, pFileName As %String) { set tDataFileName = $$$KZISDataFullPath_$$$SAPIncomingDir_pFileName if ##class(%File).Exists(tDataFileName) do ##class(%File).Delete(tDataFileName) set tSC = ##class(%File).Rename(pIncomingFile, tDataFileName) if 'tSC $$$LOGERROR("Could not move '"_pIncomingFile_"' to KZIS internal directory: "_tDataFileName) } /// Spustí proces, který importuje data do interní DB systému následně je v rámci téže transakce přenese do systému Apothéké. /// Přenášená datová entita (a tedy i daný soubor) je dána kódem typu příslušné transakce, /// zdanému v parametru pTansKindCode Method ProcessSAPCodebooksToApo(pTansKindCode As %String) { set tRequest = ##class(KZIS.Msg.MW.BPDataRequest).%New() set tRequest.TransactionKindCode = pTansKindCode set tRequest.Event = ##class(KZIS.Data.TS.Events.ekCSVFile).MarkEvent() // Call operation async set tSC = ..SendRequestSync("PSAPCodebooksToApo", tRequest) // Quit on error if $$$ISERR(tSC) { do %System.Status.Decompose(tSC, .tErrList) $$$LOGERROR(.tErrList) quit tSC } quit tSC } /// Spustí proces, který importuje data do interní DB systému. /// Přenášená datová entita (a tedy i daný soubor) je dána kódem typu příslušné transakce, /// zdanému v parametru pTansKindCode Method ProcessSAPImportCSVFile(pTansKindCode As %String) { set tRequest = ##class(KZIS.Msg.MW.BPDataRequest).%New() set tRequest.TransactionKindCode = pTansKindCode set tRequest.Event = ##class(KZIS.Data.TS.Events.ekCSVFile).MarkEvent() // Call operation async set tSC = ..SendRequestSync("PSAPImportCodebookFiles", tRequest) // Quit on error if $$$ISERR(tSC) { do %System.Status.Decompose(tSC, .tErrList) $$$LOGERROR(.tErrList) quit tSC } quit tSC } /// Zkontroluje délku souboru, jehož jméno je zadáno v parametru pFileName /// V případě, že je daný soubor prázdný nebo neexistuje vrátí hodnotu True a zapíše /// informaci do logu jako WARNING. V případě existující neprázdného souboru vraci False. Method CheckEmptyFile(pFileName As %String) As %Boolean { q:(##class(%File).GetFileSize(pFileName)>0) 0 $$$LOGWARNING("SAP incoming file error: File is empty '"_pFileName_"'") q 1 } /// Zpracovává soubory, nacházející se ve sdílené složce vyhrazené systému SAP. /// Názvy složek, kde se soubory očekávají, a maska názvů souborů jsou uloženy v definici /// KZISSetup.inc a v setupu projektu KZIS.MW.Setup. /// Defaultní název cesty je "shared_files/kzis/sap/in", defaultní hodnota masky pak "SAP_*". ///

Zpracovávané soubory jsou přesunuty do interní složky systému a následně je spuštěn proces, /// který dané soubory zpracuje. Ze zpracování jsou vyloučeny soubory s nulovou délkou. /// Jejich výskyt je zaznamenán do logu jako WARNING. Stejně tak jsou do logu zaznamenány soubory, /// jejichž název neodpovídá žádnému zpracovávanému souboru. Method OnProcessInput(pInput As %FileCharacterStream, pOutput As %RegisteredObject) As %Status { set FileName = ##class(%File).GetFilename(pInput.Filename) if FileName = $$$SAPCostCentersFileName { q:..CheckEmptyFile(pInput.Filename) $$$OK do ..MoveFile(pInput.Filename, $$$SAPCostCentersFileName) do ..ProcessSAPCodebooksToApo($$$tkcSAPCostCenters) } elseif FileName = $$$SAPVendorsFileName { q:..CheckEmptyFile(pInput.Filename) $$$OK do ..MoveFile(pInput.Filename, $$$SAPVendorsFileName) do ..ProcessSAPCodebooksToApo($$$tkcSAPVendors) } elseif FileName = $$$SAPCustomersFileName { q:..CheckEmptyFile(pInput.Filename) $$$OK do ..MoveFile(pInput.Filename, $$$SAPCustomersFileName) do ..ProcessSAPCodebooksToApo($$$tkcSAPCustomers) } elseif FileName = $$$SAPBookingOrdersFileName { q:..CheckEmptyFile(pInput.Filename) $$$OK do ..MoveFile(pInput.Filename, $$$SAPBookingOrdersFileName) do ..ProcessSAPCodebooksToApo($$$tkcSAPBookingOrders) } elseif FileName = $$$SAPMGroupXBClassFileName { q:..CheckEmptyFile(pInput.Filename) $$$OK do ..MoveFile(pInput.Filename, $$$SAPMGroupXBClassFileName) do ..ProcessSAPImportCSVFile($$$tkcSAPMGroupXBClass) } else { $$$LOGWARNING("SAP incoming file error: Unexpected filename '"_pInput.Filename_"'") } quit $$$OK } /// Callback method called just after %OnNew() ///

Metoda zajistí načtení nastavení (settings) FilePath a FileSpec z hodnot, /// uložených v definici KZISSetup.inc a v Setupu projektu (globals). /// Viz též třída KZIS.MW.Setup, /// která zprostředkovává přístup k hodnotám stupu, uložených v golobals. Method OnInit() As %Status { set ..Adapter.FilePath = $$$SharedFilesFullPath_$$$SAPIncomingDir set ..Adapter.FileSpec = $$$SAPIncomingCSVFilesSpec $$$LOGINFO("SAP incoming files full path: "_..Adapter.FilePath) $$$LOGINFO("SAP incoming codebook files spec: "_..Adapter.FileSpec) Quit $$$OK } }