improve performance Kundensuche, Versuch 1

This commit is contained in:
2026-02-16 12:50:52 +01:00
parent 96f94bd80f
commit 75c9d6ed49
2 changed files with 325 additions and 60 deletions

View File

@@ -279,7 +279,7 @@ Public Class frmFormulare
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Vollmacht", FormularManagerArten.DE_Vollmacht))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht (EV)", FormularManagerArten.AT_Vollmacht_EV))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Export Vollmacht", FormularManagerArten.VERAG_EXPORT))
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("(indirekt) DE VM", FormularManagerArten.DE_Vollmacht_indirekt))
'MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("(indirekt) DE VM", FormularManagerArten.DE_Vollmacht_indirekt)) -> nicht mehr laut Math. Lux (16.02.2026)
MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Fiskal-Vollmacht", FormularManagerArten.DE_Fiskal))
MyListBox2.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("VUB", FormularManagerArten.VUB))
MyListBox2.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Importaviso Vorauskasse", FormularManagerArten.Importaviso_VK))

View File

@@ -1,5 +1,6 @@
Imports System.ComponentModel
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
'Imports System.Threading
@@ -152,7 +153,7 @@ Public Class KdSearchBox
Eingabe_verarbeitet = False
last_eingabe = Now
doKeyDown(Now, topKunden)
DoKeyDownNew(Now, topKunden)
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name,, "Es ist ein Fehler beim Kunden-Such-Feld aufgetreten!",,,, "ERR_KDS_02")
@@ -183,7 +184,7 @@ Public Class KdSearchBox
'TIMER_SEARCH
If TIMER_SEARCH Then
If span_last_search < 600 And span_last_eingabe < 600 Then
If span_last_search < 600 AndAlso span_last_eingabe < 600 Then
Exit Sub
End If
End If
@@ -317,6 +318,129 @@ Public Class KdSearchBox
End Try
End Sub
Private Sub DoKeyDownNew(searchDate As DateTime, Optional topKunden As Integer = 10)
Try
' --- Guard Clauses ---
If usrcntl Is Nothing Then Exit Sub
If Eingabe_verarbeitet Then Exit Sub
Dim spanLastSearch As Integer = CInt((searchDate - last_search).TotalMilliseconds)
Dim spanLastInput As Integer = CInt((searchDate - last_eingabe).TotalMilliseconds)
If TIMER_SEARCH AndAlso (spanLastSearch < 600 Or spanLastInput < 400) Then
Exit Sub
End If
' --- Initialize UserControl Position ---
If Not usrcntl.Visible Then
InitializeUserControlPosition()
End If
' --- Configure Active Grid ---
If usrcntl.dgvKundenAktiv IsNot Nothing Then
If Not usrcntl.Visible Then
ConfigureGrid(usrcntl.dgvKundenAktiv)
End If
ThreadInitAKTIV_NEW(topKunden)
End If
' --- Configure Inactive Grid ---
If nurAktive Then
usrcntl.dgvKundenInAktiv.Visible = False
usrcntl.Panel1.Visible = False
ElseIf usrcntl.dgvKundenInAktiv IsNot Nothing Then
If Not usrcntl.Visible Then
ConfigureGrid(usrcntl.dgvKundenInAktiv, isInactive:=True)
End If
ThreadInitINAKTIV_NEW()
End If
' --- Visibility Handling ---
If _hideIfListEmpty Then
Dim isEmpty As Boolean =
usrcntl.dgvKundenAktiv.RowCount = 0 AndAlso
usrcntl.dgvKundenInAktiv.RowCount = 0
setObjectVisible(usrcntl, Not isEmpty)
Else
usrcntl.Visible = True
usrcntl.Show()
usrcntl.BringToFront()
End If
Eingabe_verarbeitet = True
last_search = DateTime.Now
Catch ex As Exception
MsgBox(ex.Message & Environment.NewLine & ex.StackTrace)
End Try
End Sub
' -----------------------------
' Helper Methods
' -----------------------------
Private Sub InitializeUserControlPosition()
usrcntl.Width = usrcntlWIDTH
usrcntl.Height = usrcntlHEIGHT
If Me.FindForm Is Nothing Then Exit Sub
Dim locationOnForm As Point =
Me.FindForm.PointToClient(Me.Parent.PointToScreen(Me.Location))
If dgvpos = "RIGHT" Then
locationOnForm.X -= (usrcntl.Width - Me.Width)
End If
If locationOnForm.Y + usrcntl.Height + Me.Height >
form.ClientRectangle.Height Then
usrcntl.Height =
form.ClientRectangle.Height - locationOnForm.Y - Me.Height
End If
usrcntl.Location = locationOnForm
usrcntl.Top += Me.Height
End Sub
Private Sub ConfigureGrid(grid As DataGridView,
Optional isInactive As Boolean = False)
With grid
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.AllowUserToOrderColumns = False
.AllowUserToResizeColumns = False
.AllowUserToResizeRows = False
.ReadOnly = True
.MultiSelect = False
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.BackgroundColor = Color.White
.ForeColor = Color.Black
Try
.GridColor = Color.White
Catch
' Some environments throw an exception here
End Try
If isInactive Then
.DefaultCellStyle.ForeColor = Color.Gray
End If
End With
End Sub
Public Sub hideDgv(o) '(sender As Object, e As EventArgs)
If o IsNot Nothing Then
Me.searchActive = False
@@ -326,6 +450,7 @@ Public Class KdSearchBox
End Sub
'old???!!!!!!
Sub ThreadInitAKTIV_COMP()
Try
If usrcntl Is Nothing Then Exit Sub
@@ -396,14 +521,6 @@ Public Class KdSearchBox
End If
'If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "FRONTOFFICE" Then 'Keine
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5701') "
'ElseIf VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "VERAG" And VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "ATILLA" Then
' SQLstr &= " AND Kunden.[FilialenNr]='" & VERAG_PROG_ALLGEMEIN.cAllgemein.STAMMFILIALE & "' "
'Else
' 'SQLstr &= " AND isnull(Kunden.[FilialenNr],0)<>'5501' "
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5501','5601','5701','5801') "
'End If
If Not _displayWoelflKd Then SQLstr &= " AND AdressenNr NOT LIKE '15%'"
SQLstr &= " order by Ordnungsbegriff "
@@ -416,6 +533,7 @@ Public Class KdSearchBox
End Try
End Sub
'old???!!!!!!
Sub ThreadInit_ALLCOPMP_AND_INAKTIV()
Try
If usrcntl Is Nothing Then Exit Sub
@@ -447,21 +565,7 @@ Public Class KdSearchBox
If srch2 <> "" Then
SQLstr &= " AND (Filialen.Firma LIKE '" & srch2 & "%' OR ( Adressen.PLZ LIKE '" & srch2 & "%' OR Adressen.Ort LIKE '" & srch2 & "%' OR Adressen.LandKz LIKE '" & srch2 & "%' OR Adressen.Straße LIKE '" & srch2 & "%' )) "
End If
' SQLstr &= " AND [Auswahl]='I' "
'If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "FRONTOFFICE" Then 'Keine
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5701') "
'ElseIf VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "VERAG" And VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "ATILLA" Then
' SQLstr &= " AND Kunden.[FilialenNr]='" & VERAG_PROG_ALLGEMEIN.cAllgemein.STAMMFILIALE & "' "
'Else
' 'SQLstr &= " AND isnull([FilialenNr],0)<>'5501' "
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5501','5601','5701','5801') "
'End If
'If VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER <> "" Then
' SQLstr &= " AND (Filialen.Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' OR Filialen.CLUSTER='" & VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER & "') "
'Else
' SQLstr &= " AND Filialen.Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' "
'End If
SQLstr &= " AND '" & VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER & "' IN (Filialen.Firma,Filialen.Cluster) " ' Wenn die Firmenbezeichnung im CLUSter vorkommt .--> Frontoffice
@@ -572,20 +676,6 @@ Public Class KdSearchBox
SQLstrEnd &= " ) "
End If
''AUSNAHME BIS BESSERE LÖSUNG:
'If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "FRONTOFFICE" Then
' SQLstr &= " and Filialen.Firma NOT IN ('AMBAR') "
'End If
'If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "FRONTOFFICE" Then 'Keine
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5701') "
'ElseIf VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "VERAG" And VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "ATILLA" Then
' SQLstr &= " AND Kunden.[FilialenNr]='" & VERAG_PROG_ALLGEMEIN.cAllgemein.STAMMFILIALE & "' "
'Else
' 'SQLstr &= " AND isnull(Kunden.[FilialenNr],0)<>'5501' "
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5501','5601','5701','5801') "
'End If
If Not _displayWoelflKd Then SQLstrEnd &= " AND AdressenNr NOT LIKE '15%'"
Dim searchstring = SQLstr & SQLstrEnd & " order by Ordnungsbegriff "
@@ -629,20 +719,6 @@ Public Class KdSearchBox
SQLstr &= " ) "
If srch2 <> "" Then SQLstr &= " AND (Filialen.Firma LIKE '" & srch2 & "%' OR ( Adressen.PLZ LIKE '" & srch2 & "%' OR Adressen.Ort LIKE '" & srch2 & "%' OR Adressen.LandKz LIKE '" & srch2 & "%' OR Adressen.Straße LIKE '" & srch2 & "%' )) "
SQLstr &= " AND [Auswahl]='I' "
'If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "FRONTOFFICE" Then 'Keine
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5701') "
'ElseIf VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "VERAG" And VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA <> "ATILLA" Then
' SQLstr &= " AND Kunden.[FilialenNr]='" & VERAG_PROG_ALLGEMEIN.cAllgemein.STAMMFILIALE & "' "
'Else
' 'SQLstr &= " AND isnull([FilialenNr],0)<>'5501' "
' SQLstr &= " AND isnull(Kunden.[FilialenNr],0) NOT IN ('5501','5601','5701','5801') "
'End If
'If VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER <> "" Then
' SQLstr &= " AND (Filialen.Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' OR Filialen.CLUSTER='" & VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER & "') "
'Else
' SQLstr &= " AND Filialen.Firma='" & VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA & "' "
'End If
If _AlleFirmenCLUSTER Then
SQLstr &= " AND '" & VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER & "' IN (Filialen.Firma,Filialen.Cluster) " ' Wenn die Firmenbezeichnung im CLUSter vorkommt .--> Frontoffice
@@ -666,11 +742,6 @@ Public Class KdSearchBox
End If
'AUSNAHME BIS BESSERE LÖSUNG
'If VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "FRONTOFFICE" Then
' SQLstr &= " and Filialen.Firma NOT IN ('AMBAR') "
'End If
If Not _displayWoelflKd Then SQLstr &= " AND AdressenNr NOT LIKE '15%'"
SQLstr &= " order by Ordnungsbegriff "
@@ -683,6 +754,200 @@ Public Class KdSearchBox
End Try
End Sub
Private Sub ThreadInitAKTIV_NEW(Optional topKunden As Integer = 10)
Try
If usrcntl?.dgvKundenAktiv Is Nothing Then Exit Sub
Dim search = ParseSearch(Me.Text)
Dim topCount As Integer = If(nurAktive, 16, topKunden)
Dim sql = BuildCustomerSql(search, topCount, auswahl:="A", includeAviso:=_displayAVISO_Email)
Dim countSql = "SELECT COUNT(Ordnungsbegriff) " & sql.SqlEnd.ToString.Replace("ORDER BY Ordnungsbegriff", "")
setDS(True, usrcntl.dgvKundenAktiv, (New SQL).loadDgvBySql(sql.FullSql, "FMZOLL"), topCount, If(search.Primary.Length > 2, (New SQL).getValueTxtBySql(countSql, "FMZOLL"), ""))
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name,, "Fehler im Kunden-Such-Feld!",,,, "ERR_KDS_03")
End Try
End Sub
Private Sub ThreadInitINAKTIV_NEW()
Try
If usrcntl?.dgvKundenInAktiv Is Nothing Then Exit Sub
Dim search = ParseSearch(Me.Text)
Dim sql = BuildCustomerSql(search, topCount:=4, auswahl:="I", includeAviso:=False)
setDS(False, usrcntl.dgvKundenInAktiv, (New SQL).loadDgvBySql(sql.FullSql, "FMZOLL"), 4)
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name,, "Fehler im Kunden-Such-Feld!",,,, "ERR_KDS_04")
End Try
End Sub
Private Function ParseSearch(input As String) As (Primary As String, Secondary As String)
Dim cleaned = input.Replace("'", "").Trim()
Dim primary = cleaned
Dim secondary As String = ""
If cleaned.Contains(",") Then
Dim parts = cleaned.Split(","c)
primary = parts(0).Trim()
secondary = parts(1).Trim()
End If
If primary.StartsWith("*") Then
primary = "%" & primary.Substring(1)
End If
If secondary.StartsWith("*") Then
secondary = "%" & secondary.Substring(1)
End If
Return (primary, secondary)
End Function
Private Function BuildCustomerSql(
search As (Primary As String, Secondary As String),
topCount As Integer,
auswahl As String,
includeAviso As Boolean) _
As (FullSql As String, SqlEnd As String)
Dim avisoField As String = ""
If includeAviso Then
avisoField = ", (SELECT CASE WHEN COUNT(*) > 0 THEN 'JA' ELSE '' END FROM tblEmailBenachrichtigung WHERE eb_KundenNr = AdressenNr) AS [E-Mail]"
End If
Dim selectPart = $"SELECT TOP {topCount}
Ordnungsbegriff AS Firma,
AdressenNr AS KdNr,
Adressen.[LandKz] + ' ' +
Adressen.[PLZ] + ' - ' +
Adressen.[Ort] + ' ' +
Adressen.[Straße] AS Adresse
{avisoField}"
If ShouldIncludeFirmaIntern() Then
selectPart &= ", Filialen.Firma AS Firma_Intern"
End If
Dim sqlEnd As New StringBuilder()
sqlEnd.AppendLine(" FROM Adressen")
sqlEnd.AppendLine(" INNER JOIN Kunden ON KundenNr = AdressenNr")
sqlEnd.AppendLine(" INNER JOIN Filialen ON Filialen.FilialenNr = COALESCE(Kunden.FilialenNr, 4803)")
sqlEnd.AppendLine(" WHERE 1=1")
' Search
sqlEnd.AppendLine(" AND (")
sqlEnd.AppendLine($" Ordnungsbegriff_AI LIKE '{search.Primary}%'")
If IsNumeric(search.Primary) Then
sqlEnd.AppendLine($" OR AdressenNr LIKE '{search.Primary}%'")
End If
If _searchName1 Then
sqlEnd.AppendLine($" OR Adressen.[Name 1] LIKE '{search.Primary}%'")
End If
sqlEnd.AppendLine(" )")
If search.Secondary <> "" Then
sqlEnd.AppendLine(
$" AND (
Filialen.Firma LIKE '{search.Secondary}%'
OR Adressen.PLZ LIKE '{search.Secondary}%'
OR Adressen.Ort LIKE '{search.Secondary}%'
OR Adressen.LandKz LIKE '{search.Secondary}%'
OR Adressen.Straße LIKE '{search.Secondary}%'
)")
End If
sqlEnd.AppendLine($" AND Auswahl = '{auswahl}'")
AppendFirmaFilter(sqlEnd)
If Not _displayWoelflKd Then
sqlEnd.AppendLine(" AND AdressenNr NOT LIKE '15%'")
End If
sqlEnd.AppendLine(" ORDER BY Ordnungsbegriff")
Return (selectPart & sqlEnd.ToString(), sqlEnd.ToString())
End Function
Private Sub AppendFirmaFilter(sql As StringBuilder)
If _AlleFirmenCLUSTER Then
sql.AppendLine(
$" AND '{VERAG_PROG_ALLGEMEIN.cAllgemein.CLUSTER}'
IN (Filialen.Firma, Filialen.Cluster)")
ElseIf _UseFIRMA <> "" Then
sql.AppendLine(
$" AND '{_UseFIRMA}'
IN (Filialen.Firma, Filialen.Cluster)")
Else
sql.AppendLine(" AND (")
sql.AppendLine(
$" '{VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA.Replace("ATILLA", "VERAG")}'
IN (Filialen.Firma, Filialen.Cluster)")
If VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("AVISO_IMEX", "AVISO") Then
sql.AppendLine(" OR Filialen.Firma IN ('IMEX')")
End If
If VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("OFFERTE_FREMD_VERAGIMEX", "SDL") Then
sql.AppendLine(" OR Filialen.Firma IN ('IMEX','VERAG')")
End If
If VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("OFFERTE_FREMD_UNISPED_BREXIT", "SDL") Then
sql.AppendLine(" OR (Filialen.Firma IN ('UNISPED') AND Kunden.FilialenNr = 7002)")
End If
If VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("FAKTURIERUNG_FRONTOFFICE", "SDL") Then
sql.AppendLine(" OR Filialen.Firma IN ('FRONTOFFICE')")
End If
sql.AppendLine(" )")
End If
End Sub
Private Function ShouldIncludeFirmaIntern() As Boolean
Return VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "FRONTOFFICE" _
OrElse VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "VERIMEX" _
OrElse _AlleFirmenCLUSTER _
OrElse _UseFIRMA <> "" _
OrElse VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("AVISO_IMEX", "AVISO") _
OrElse VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("OFFERTE_FREMD_VERAGIMEX", "SDL")
End Function
'threadsicherer Aufruf
' Delegate Sub setLabelCallback(l As DataGridView, t As DataTable)
Private Sub setDS(aktiveKunden As Boolean, l As DataGridView, t As DataTable, topKunden As Integer, Optional anzahlKunden As String = "")
@@ -866,7 +1131,7 @@ Public Class KdSearchBox
Try
If e.KeyCode = Keys.Return Or e.KeyCode = Keys.Enter Or e.KeyCode = Keys.Tab Then
last_search = Now.AddSeconds(-10)
doKeyDown(Now) ' Damit Suche-Timer sicherausgelöst wurde
DoKeyDownNew(Now) ' Damit Suche-Timer sicherausgelöst wurde
' System.Threading.Thread.Sleep(5000)
End If
@@ -1140,7 +1405,7 @@ Public Class KdSearchBox
End Sub
Private Sub tmr_Search_Tick(sender As Object, e As EventArgs) Handles tmr_Search.Tick
If TIMER_SEARCH Then doKeyDown(Now)
If TIMER_SEARCH Then DoKeyDownNew(Now)
End Sub
End Class