' CompleteOrder() ' ---------------------------------------------------------------------------- ' Schließt die Prüfung ab und erstellt einen Lieferschein ' ' Returns: CompleteOrder : Boolean ' ---------------------------------------------------------------------------- ' Copyright (c) 2021 by Digital Data GmbH ' ' Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim ' Tel.: 0641/202360 • E-Mail: info-flow(at)digitaldata.works ' ---------------------------------------------------------------------------- ' Creation Date / Author: 01.09.2020 / JJ ' Version Date / Editor: 01.06.2023 / JJ/MP ' Version Number: 4.1.0.0 Function CompleteOrder() Set mywin = CWLStart.CurrentModule.Windows.Item(WINDOW_ID) Set Conn = CWLStart.CurrentCompany.Connection Set Grid = mywin.Controls.Item(GRID_ID).Grid If MACRO_ARTICLE_COUNTER > 0 Then Dim MacroArticleReseted : MacroArticleReseted = False CheckMacroArticlesComplete() For MacroArrayIndex = 0 To Ubound(MACRO_ARTICLE_LIST, 2) If (MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_COMPLETE, MacroArrayIndex) = False) AND _ (MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_SCAN_FLAG, MacroArrayIndex) = True) Then questionText = "Der Package-Artikel [" & MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_NUMBER, MacroArrayIndex) & "] ist unvollständig!" & vbNewLine & vbNewLine Answer = MsgBox(questionText & "Soll das gesamte Package zurückgesetzt werden?", vbYesno + vbQuestion, DEFAULT_TITLE) If Answer = vbYes Then ResetValuesByMacroLineNumber MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_LINE_NUMBER, MacroArrayIndex) MacroArticleReseted = True Else CompletedPackages = Cint(InputBox("Wieviele Package-Artikel von insgesamt [" & MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_AMOUNT_REMAINING, MacroArrayIndex) & "] werden damit ausgeliefert?", "Anzahl fertige Packages", "0")) MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_AMOUNT_COMPLETED, MacroArrayIndex) = CompletedPackages End If End If If (MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_COMPLETE, MacroArrayIndex) = True) Then MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_AMOUNT_COMPLETED, MacroArrayIndex) = MACRO_ARTICLE_LIST(COLUMN_MACRO_ARTICLE_AMOUNT_REMAINING, MacroArrayIndex) End If Next If MacroArticleReseted = True Then Answer = MsgBox("Einer oder mehrere Package-Artikel wurden zurückgesetzt. Soll die Lieferscheinerstellung abgebrochen werden?", vbYesno + vbQuestion, DEFAULT_TITLE) If Answer = vbYes Then CompleteOrder = False Exit Function End If End If ' Übertrage Macro-Daten zurück ins Grid TransferMacroData() End If ' Übertrage die Grid-Daten zurück in die Order-Datenstruktur TransferGridData() ' Eine letzte Möglichkeit die Auftragsdaten zu tunen UpdateOrderDataBeforeDelNote() Dim OrderId, AccountSQL, MandatorId, RunningNumber If DEBUG_ON = True Then AddDebugLine "Completing order.. " & vbNewline ShowDebugBox "CompleteOrder" End If OrderId = mywin.Controls.Item(ORDER_INPUT).ScreenContents AccountSQL = "SELECT DISTINCT c021 FROM t025 (NOLOCK) WHERE c044 = '" & OrderId & "' " & SQLQuery_OrderWhere Set AccountResult = Connection.Select(AccountSQL) If DEBUG_ON = True Then AddDebugLine "Querying for CustomerAccountId.. " & vbNewline AddDebugLine "Result Columns: " & AccountResult AddDebugLine "Result Rows: " & AccountResult.RowCount AddDebugLine "SQL: " & AccountSQL ShowDebugBox "CompleteOrder" End If MandatorId = AccountResult.Value("c021") RunningNumber = RUNNING_NUMBER_PREFIX & OrderId BelegKey = Cstr(DateDiff("s", "01/01/1970 00:00:00", Now)) ' ===================== KOPFDATEN ===================== Dim Request, URL, XML Dim NowObject : NowObject = Now Dim DateString : DateString = Year(NowObject) & "-" & GetLeftPad(Month(NowObject)) & "-" & GetLeftPad(Day(NowObject)) Dim TimeString : TimeString = GetLeftPad(Hour(NowObject)) & ":" & GetLeftPad(Minute(NowObject)) & ":" & GetLeftPad(Second(NowObject)) Dim UserNumber : UserNumber = Cwlstart.Currentuser.Number Dim ComputerName : ComputerName = GetWindowsEnvironment("COMPUTERNAME") ' === WEB SERVICES ======================= XML = "" XML = XML & "" XML = XML & "" XML = XML & "<__VORLAGE__T025>" XML = XML & "" & BelegKey & "" XML = XML & "" & MandatorId & "" XML = XML & "" & RunningNumber & "" XML = XML & "" & OrderId & "" XML = XML & "" & DateString & "" If USE_ADDITIONAL_DBFIELDS = True Then XML = XML & "" & UserNumber & "" XML = XML & "" & DateString & " " & TimeString & "" XML = XML & "" & ComputerName & "" XML = XML & "" & PACKTISCH_VERSION & "" End If XML = XML & "" ' === EXIM TABELLE ======================= HeadSQL = "INSERT INTO " & SQLDB_for_EXIM & "." & SQLHeadTB_for_EXIM & " " HeadSQL = HeadSQL & "(BELEGKEY, Kontonummer, Laufnummer, Auftragsnummer, Belegdatum) " HeadSQL = HeadSQL & "VALUES("& BelegKey &", '"& MandatorId &"', '"& RunningNumber &"', '"& OrderId &"', GETDATE())" HeadResult = Conn.ExecuteSQL(HeadSQL) If DEBUG_ON = True Then AddDebugLine "Inserting Head Data" & vbNewline AddDebugLine "Result: " & HeadResult AddDebugLine "SQL: " & HeadSQL ShowDebugBox "CompleteOrder" End If ' ===================== ENDE KOPFDATEN ===================== ' ============================ MITTEDATEN ============================ Dim ArticleNumber, AmountScanned, SerialNumber, StorageLocation, LineNumber For OrderArrayIndex = 0 To Ubound(ORDER_ARTICLE_DATA, 2): Do IsSerialNumberArticle = Cint(ORDER_ARTICLE_DATA(INDEX_IS_SERIAL_NUMBER, OrderArrayIndex)) ArticleNumber = ORDER_ARTICLE_DATA(INDEX_ARTICLE_NUMBER, OrderArrayIndex) SerialNumber = ORDER_ARTICLE_DATA(INDEX_SERIAL_NUMBER, OrderArrayIndex) PseudoSN = ORDER_ARTICLE_DATA(INDEX_PSEUDO_SN, OrderArrayIndex) AmountScanned = CInt(ORDER_ARTICLE_DATA(INDEX_AMOUNT_SCANNED, OrderArrayIndex)) LineNumber = CInt(ORDER_ARTICLE_DATA(INDEX_LINE_NUMBER, OrderArrayIndex)) DataType = CInt(ORDER_ARTICLE_DATA(INDEX_DATA_TYPE, OrderArrayIndex)) VKPreisEinzel = Replace(ORDER_ARTICLE_DATA(INDEX_PRICE_VK_EINZEL, OrderArrayIndex), ",", ".") IsOpen = ORDER_ARTICLE_DATA(INDEX_IS_OPEN, OrderArrayIndex) ' Sonderfall - Artikel mit negativen Mengen If (ORDER_ARTICLE_DATA(INDEX_AMOUNT_ORDERED, OrderArrayIndex) - ORDER_ARTICLE_DATA(INDEX_AMOUNT_DELIVERED, OrderArrayIndex)) < 0 Then AmountScanned = ORDER_ARTICLE_DATA(INDEX_AMOUNT_ORDERED, OrderArrayIndex) IsOpen = True End If ' Sonderfall - Artikel aus nicht-relevanter Artikelgruppe hat Nachkommastellen (z.B. Zeit) If CheckArticleGroupIsRelevant(ORDER_ARTICLE_DATA(INDEX_ARTICLE_GROUP, OrderArrayIndex)) = False Then AmountOrdered = ORDER_ARTICLE_DATA(INDEX_AMOUNT_ORDERED, OrderArrayIndex) AmountDelivered = ORDER_ARTICLE_DATA(INDEX_AMOUNT_DELIVERED, OrderArrayIndex) AmountScanned = AmountOrdered - AmountDelivered AmountScanned = Replace(AmountScanned, ",", ".") End If If DEBUG_ON = True Then AddDebugLine "Processing Article: " & ArticleNumber AddDebugLine "SerialNumber: " & SerialNumber AddDebugLine "PseudoSN: " & PseudoSN AddDebugLine "LineNumber: " & LineNumber AddDebugLine "DataType: " & DataType AddDebugLine "IsOpen: " & IsOpen ShowDebugBox "CompleteOrder - MITTEDATEN" End If ' Text-Artikel werden nicht übergeben If DataType = 3 Then Exit Do End If ' Artikeldaten abhängig von PseudoSN laden If Len(PseudoSN) = 0 Then StorageLocation = GetWinLineStorageLocation(ArticleNumber, SerialNumber, IsSerialNumberArticle) InternalArticleNumber = GetWinLineInternalProductNumber(ArticleNumber, SerialNumber) Else StorageLocation = GetWinLineStorageLocation(ArticleNumber, PseudoSN, IsSerialNumberArticle) InternalArticleNumber = GetWinLineInternalProductNumber(ArticleNumber, PseudoSN) End If ' Lock Tabelle updaten, PseudoNr-Positionen vorbereiten, wenn die Position gescannt wurde If IsSerialNumberArticle = 1 And Len(SerialNumber) > 0 Then If DEBUG_ON = True Then AddDebugLine "OrderArrayIndex: " & OrderArrayIndex AddDebugLine "PseudoSN: " & PseudoSN AddDebugLine "SerialNumber: " & SerialNumber ShowDebugBox "CompleteOrder - UpdatePacktischHistoryRow" End If UpdatePacktischHistoryRow OrderId, ArticleNumber, PseudoSN, "Scanned", SerialNumber End If ' === EXIM TABELLE ======================= MidSQL = "INSERT INTO " & SQLDB_for_EXIM & "." & SQLMiddleTB_for_EXIM & " " MidSQL = MidSQL & "(BELEGKEY, Artikelnummer, Hauptartikelnummer, Zeilennummer, Datentyp, Mengegeliefert, ChargeIdentnummer, Lagerort, Einzelpreis) " MidSQL = MidSQL & "VALUES (" & BelegKey & ", '" & ArticleNumber & "', '" & ArticleNumber & "', " If IsSerialNumberArticle = 1 Then MidSQL = MidSQL & LineNumber Else MidSQL = MidSQL & " NULL" End If MidSQL = MidSQL & ", '1', " & AmountScanned & ", '" & SerialNumber & "', " & StorageLocation& ", " & VKPreisEinzel & ")" MidResult = Conn.ExecuteSQL(MidSQL) ' === WEB SERVICES ======================= MidXML = "" ' Abgeschlossene Belegzeilen werden nicht an den WebService übergeben If IsOpen = True Then MidXML = MidXML & "<__VORLAGE__T026>" MidXML = MidXML & "" & BelegKey & "" MidXML = MidXML & "" & InternalArticleNumber & "" MidXML = MidXML & "" & ArticleNumber & "" MidXML = MidXML & "" & LineNumber & "" MidXML = MidXML & "" & "1" & "" MidXML = MidXML & "" & AmountScanned & "" MidXML = MidXML & "" & SerialNumber & "" MidXML = MidXML & "" & StorageLocation & "" MidXML = MidXML & "" & VKPreisEinzel & "" MidXML = MidXML & "" End If If DEBUG_ON = True Then AddDebugLine "Inserting Middle Data" & vbNewline AddDebugLine "For Article " & ArticleNumber AddDebugLine "And Amount " & AmountScanned AddDebugLine "Result: " & MidResult & vbNewline AddDebugLine "SQL: " & MidSQL & vbNewline AddDebugLine "XML: " & MidXML ShowDebugBox "CompleteOrder - XML" End If XML = XML & MidXML Loop While False: Next XML = XML & "" XML = Replace(XML, "__VORLAGE__", WEB_VORLAGE) XML = Replace(XML, "__TYPE__", WEB_TYPE) XML = Replace(XML, "__PRINT__", WEB_PRINT) XML = Replace(XML, "__OPTION__", WEB_OPTION) If USE_WEBSERVICE_WITH_FILES = True Then Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") BasePath = CWLStart.CurrentCompany.Value(MDFLDNO_MODULE_PATH) FileName = BelegKey & ".xml" AbsoluteImportPath = BasePath & "\..\" & RELATIVE_IMPORT_PATH AbsoluteImportPath = CreateDateDirectory(AbsoluteImportPath) RelativeImportFilePath = RELATIVE_IMPORT_PATH & "\" & GetRelativDateDirectoryName() & "\" & FileName AbsoluteImportFilePath = AbsoluteImportPath & "\" & FileName If DEBUG_ON = True Then AddDebugLine "Creating Absolute Path" AddDebugLine "AbsoluteImportPath: " & AbsoluteImportPath AddDebugLine "RelativeImportFilePath: " & RelativeImportFilePath AddDebugLine "AbsoluteImportFilePath: " & AbsoluteImportFilePath ShowDebugBox "CompleteOrder" End If If FSO.FolderExists(AbsoluteImportPath) = False Then MsgBox("Import Pfad [" & AbsoluteImportPath & "] existiert nicht. Import wird abgebrochen.") CompleteOrder = False Exit Function End If Set OutPutFile = FSO.OpenTextFile(AbsoluteImportFilePath, 2, True) OutPutFile.WriteLine(XML) If DEBUG_ON = True Then AddDebugLine "Writing XML File:" AddDebugLine "SUCCESS" ShowDebugBox "CompleteOrder" End If Set FSO = Nothing ' Import mit Datei WEB_BYREF = 1 WEB_DATA = RelativeImportFilePath Else ' Import per URL WEB_BYREF = 0 WEB_DATA = XML End If URL = "http://__SERVER__/ewlservice/import?User=__USER__&Password=__PASSWORD__&Company=__COMPANY__&Type=30&Vorlage=__VORLAGE__&Actioncode=__ACTIONCODE__&byref=__BYREF__&Data=__DATA__" URL = Replace(URL, "__SERVER__", WEB_SERVER) URL = Replace(URL, "__USER__", WEB_USER) URL = Replace(URL, "__PASSWORD__", WEB_PASS) URL = Replace(URL, "__COMPANY__", WEB_COMPANY) URL = Replace(URL, "__VORLAGE__", WEB_VORLAGE) URL = Replace(URL, "__BYREF__", WEB_BYREF) URL = Replace(URL, "__ACTIONCODE__", WEB_ACTIONCODE) URL = Replace(URL, "__DATA__", WEB_DATA) ' ======================= ENDE MITTEDATEN ======================= ' Pseudo-SN mit echter SN im Artikelstamm ersetzen If ReplacePseudoSerialNumbers(OrderId, "Scanned") = False Then ' Wenn beim Ersetzen ein Fehler auftritt, ' wird die Verarbeitung dieses Auftrags abgebrochen. MsgBox("Es ist ein Fehler beim Verarbeiten der Seriennummern aufgetreten. Import wird abgebrochen.") CompleteOrder = False Exit Function End If ' ===================== HTTP REQUEST ===================== If DEBUG_ON = True Then AddDebugLine "Sending Request to WebServices.." AddDebugLine "URL: " & URL AddDebugLine "WEB_PRINT: " & WEB_PRINT AddDebugLine "WEB_OPTION: " & WEB_OPTION ShowDebugBox "CompleteOrder" End If Dim ReturnValue ReturnValue = SendWebserviceRequest(URL) Success = ReturnValue(0) Message = ReturnValue(1) ' ===================== ABSCHLUSS ===================== If Success = True Then UpdatePacktischHistoryRowsAfterSuccess(OrderId) DeletePacktischHistoryRows() MsgBox Message, vbInformation, DEFAULT_TITLE CompleteOrder = True Else ' Positionen wieder auf Pseudo-SN zurücksetzen ReplacePseudoSerialNumbers OrderId, "Replaced" MsgBox Message, vbExclamation, DEFAULT_TITLE & " - Fehler bei Abschluss" CompleteOrder = False End If End Function Function SendWebserviceRequest(URL) Dim ReturnValue Set Request = CreateObject("MSXML2.XMLHTTP") ' Open Request Object On Error Resume Next Request.Open "POST", URL, False If Err.Number > 0 Then ReturnValue = Array(False, "Abfrageobjekt für Webservice konnte nicht geöffnet werden") SendWebserviceRequest = ReturnValue Exit Function End If On Error Goto 0 ' Send Request On Error Resume Next Request.Send If Err.Number > 0 Then ReturnValue = Array(False, "Webserviceanfrage konnte nicht gesendet werden!") SendWebserviceRequest = ReturnValue Exit Function End If On Error Goto 0 Response = Request.ResponseText Status = Request.Status If DEBUG_ON = True Then AddDebugLine "Response from WebServices!" AddDebugLine "Status: " & Status AddDebugLine "Body: " & Response ShowDebugBox "CompleteOrder" End If ' =================== ENDE HTTP REQUEST ================== If Status = 200 Then If TestIsWebserviceResponseSuccessful(Response) = True Then ReturnValue = Array(True, "Lieferschein wurde übertragen!") SendWebserviceRequest = ReturnValue Else Message = "Lieferschein wurde nicht übertragen! Fehlerdetails: " & vbNewline & vbNewline & Response ReturnValue = Array(False, Message) SendWebserviceRequest = ReturnValue End If Else Message = "Fehler beim Zugriff auf Webservices aufgetreten!" & vbNewline & vbNewline & "Status: " & Status ReturnValue = Array(False, Message) SendWebserviceRequest = ReturnValue Error = True End If End Function