' ArticleExists(Identifier: String) ' ---------------------------------------------------------------------------- ' Findet Artikelnummer anhand von versch. Kriterien ' - Artikel-Nummer, Alternative Artikel-Nummer, EAN-Code, Seriennummer ' - Gibt die Zeile im Grid zurück in der Artikel das erste Mal gefunden wurde ' ' Returns: ArticleExists: Int ' ---------------------------------------------------------------------------- ' 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: 13.12.2021 / MP ' Version Number: 4.0.0.0 Const ARTICLE_EXISTS_NO_STOCK = -99 Const ARTICLE_EXISTS_NO_SERIALNUMBER = -98 Const ARTICLE_EXISTS_NO_ARTICLE_EAN = -97 Const ARTICLE_EXISTS_NO_REGEX_MATCH = -96 Const ARTICLE_EXISTS_OVERSCANNED = -95 Function ArticleExists(Identifier) ArticleExists = 0 HasError = False CURRENT_SERIALNUMBER = "" Set mywin = CWLStart.CurrentModule.Windows.Item(WINDOW_ID) Set amountBox = mywin.Controls.Item(AMOUNT_INPUT) Set Grid = mywin.Controls.Item(GRID_ID).Grid ' ===================== SERIENNUMMER ===================== ' Zuerst prüfen wir, ob es ein Seriennummerartikel ist Set ResultSeriennummer = GetSeriennummerRow(Identifier) If ResultSeriennummer.RowCount > 0 Then SerialNumberString = ResultSeriennummer.Value("C068") MainArticleNumber = ResultSeriennummer.Value("C011") SQL = "" SQL = SQL & "(C002 = '" & MainArticleNumber & "') " ' Nach Mandant und Wirtschaftsjahr filtern SQL = SQL & SQLQuery_BasicWhere Set ResultMainArticle = CWLStart.CurrentCompany.SearchRecord(TABLE_21, SQL) If ResultMainArticle.RowCount > 0 Then ' Default: ART_REGEX_FLDBEZ = C222 SerialNumberPattern = ResultMainArticle.Value(ART_REGEX_FLDBEZ) End If If DEBUG_ON = True Then AddDebugLine "Preparing Regex Check. " & vbNewline AddDebugLine "SerialNumberString: " & SerialNumberString AddDebugLine "SerialNumberPattern: " & SerialNumberPattern AddDebugLine "MainArticleNumber: " & MainArticleNumber ShowDebugBox "ArticleExists" End If If Len(SerialNumberPattern) > 0 And Len(SerialNumberString) > 0 Then Set SerialNumberRegex = New Regexp With SerialNumberRegex .Pattern = SerialNumberPattern .IgnoreCase = False .Global = False End With Set RegexMatch = SerialNumberRegex.Execute(SerialNumberString) Set FirstMatch = RegexMatch.Item(0) If DEBUG_ON = True Then AddDebugLine "Checked Serialnumber against Regex. (1/2)" & vbNewline AddDebugLine "FirstMatch.Length: " & FirstMatch.Length AddDebugLine "Len(SerialNumberString): " & Len(SerialNumberString) AddDebugLine "FirstMatch.FirstIndex: " & FirstMatch.FirstIndex ShowDebugBox "ArticleExists" End If If Not (FirstMatch.Length = Len(SerialNumberString) And FirstMatch.FirstIndex = 0) Then ArticleExists = ARTICLE_EXISTS_NO_REGEX_MATCH HasError = True End If If DEBUG_ON = True Then AddDebugLine "Checked Serialnumber against Regex. (2/2)" & vbNewline AddDebugLine "Result: " & SerialNumberRegex.Test(SerialNumberString) AddDebugLine "Serialnumber: " & SerialNumberString AddDebugLine "Regex: " & SerialNumberPattern ShowDebugBox "ArticleExists" End If End If CURRENT_SERIALNUMBER = Identifier Set Result = ResultSeriennummer Else ' ===================== ARTIKEL NUMMER / EAN-CODE ===================== ' Wenn es kein Ausprägeartikel ist, suchen wir im Artikelstamm Set Result = GetArticleRow(Identifier) End If '========================================================== If HasError = True Then ' Just skip the rest of the function and return the current error Elseif Result.RowCount > 0 Then ' Wir brauchen die Hauptartikelnummer, weil die Prüfung sonst bei SN-Artikeln fehlschlägt MainArticleNumber = Result.Value("C011") RealArticleNumber = Result.Value("C002") AmountStocked = GetWinLineStockedAmount(RealArticleNumber, False) If DEBUG_ON = True Then AddDebugLine "Checking stock of product: " & RealArticleNumber & " (" & MainArticleNumber & ")" & vbNewline AddDebugLine "Result Columns: " & Result AddDebugLine "Result Rows: " & Result.RowCount AddDebugLine "Stock: " & AmountStocked AddDebugLine "SQL: " & SQL ShowDebugBox "ArticleExists" End If If AmountStocked > 0 Then If DEBUG_ON = True Then AddDebugLine "Amount stocked: " & AmountStocked End If ' Vorkommen in Tabelle prüfen For GridLineIndex = 1 To Grid.LineCount CurrentArticleNumber = Grid.GetCellValue(GridLineIndex, COLUMN_ARTICLENUMBER) Total = Cint(Grid.GetCellValue(GridLineIndex, COLUMN_TOTAL)) Scanned = Cint(Grid.GetCellValue(GridLineIndex, COLUMN_SCANNED)) Amount = CInt(amountBox.ScreenContents) If CurrentArticleNumber = MainArticleNumber Then If DEBUG_ON = True Then AddDebugLine "CurrentArticleNumber matches MainArticleNumber! (" & CurrentArticleNumber & ")" End If If Total > Scanned Then If DEBUG_ON = True Then AddDebugLine "Product is not yet scanned completely and exists in Row " & GridLineIndex & "!" End If If (Total - Scanned) >= Amount Then ArticleExists = GridLineIndex Exit For Else If GetCountInDuplList(CurrentArticleNumber) <= 1 Then Exit For End If End If Else ArticleExists = ARTICLE_EXISTS_OVERSCANNED End If End If Next Else If DEBUG_ON = True Then AddDebugLine "Amount stocked: 0" End If ArticleExists = ARTICLE_EXISTS_NO_STOCK End If If DEBUG_ON = True Then ShowDebugBox "ArticleExists" End If Else If CURRENT_SERIALNUMBER = "" Then ArticleExists = ARTICLE_EXISTS_NO_ARTICLE_EAN Else ArticleExists = ARTICLE_EXISTS_NO_SERIALNUMBER End If End If End Function Function GetSeriennummerRow(Identifier) Set GetSeriennummerRow = Nothing If Len(Identifier) > 0 Then Set Conn = CWLStart.Connection SQL = "" SQL = SQL & " SELECT TOP 1 C002, C011, C068 " SQL = SQL & " FROM T024 (NOLOCK) " SQL = SQL & " WHERE C068 = '" & Identifier & "' " SQL = SQL & " AND c038 IS NULL " ' Nur aktive Artikel SQL = SQL & SQLQuery_BasicWhere Set GetSeriennummerRow = Conn.Select(SQL) If DEBUG_ON = True Then AddDebugLine "Searching for Article by Article serial number " & vbNewline AddDebugLine "Result Columns: " & GetSeriennummerRow AddDebugLine "Result Rows: " & GetSeriennummerRow.RowCount AddDebugLine "SQL: " & SQL ShowDebugBox "ArticleExists - GetSeriennummerRow" End If End If End Function ' Ruft Daten aus der Tabelle t024 ab, für Artikel OHNE Ausprägung Function GetArticleRow(Identifier) Set GetArticleRow = Nothing If Len(Identifier) > 0 Then Set Conn = CWLStart.Connection SQL = "" SQL = SQL & " SELECT TOP 1 C002, C011 " SQL = SQL & " FROM T024 (NOLOCK) " SQL = SQL & " WHERE (C002 = '" & Identifier & "' OR C075 = '" & Identifier & "' OR C114 = '" & Identifier & "' OR C115 = '" & Identifier & "') " SQL = SQL & " AND c038 IS NULL " ' Nur aktive Artikel SQL = SQL & SQLQuery_BasicWhere Set GetArticleRow = Conn.Select(SQL) If DEBUG_ON = True Then AddDebugLine "Searching for Article by ArticleNo/EAN-Code.. " & vbNewline & vbNewline AddDebugLine "Result Columns: " & GetArticleRow & vbNewline AddDebugLine "Result Rows: " & GetArticleRow.RowCount & vbNewline AddDebugLine "SQL: " & SQL ShowDebugBox "ArticleExists - GetArticleRow" End If End If End Function