Imports System.Data.SqlClient Imports System.Xml ''' ''' Zum Suchen von LSV-BEs eines Partners mit Hilfe von zusäztlichen Kriterein (Selektoren). ''' Grundlage für die Klasse bildet die Tatsache, dass man mit einem SELECT Statement wie ''' select d.dokumentid, diw.inhalt from dbo.dokument d ''' inner join dbo.dokumentinfo_wert diw on d.dokumentid = diw.dokumentid ''' where d.dokumenttypnr = 1176 ''' and d.nrpar00= 1339632 ''' and diw.inhalt in ( 'IBAN;CH4400784013396322002', 'Paginatornummer;02180305004720', 'BE_LSV-ID_gueltig_ab;20180305', 'LSV-ID;SCW1W', 'Referenz1;60211909') ''' schon sehr gut eine LSV-BE finden kann und auch sieht, ob alle Suchkriterien aus dbo.dokumentinfo_wert mitberücksichtigt wurden. ''' Public Class DokumentList Public Sub New(xmlDocument As XmlDocument, ByVal partnerNr As Int32) Me.XmlDocument = xmlDocument Me.PartnerNr = partnerNr Me.Selektors = New List(Of DokumentSelektor)() End Sub Public Sub AddSelektor(xmlTagId As String, dokumentWertInhaltId As String, Optional ignoreSpaces As Boolean = False, Optional useValueIndex As Integer = -1, Optional isDate As Boolean = False) Dim dokumentSelektor As DokumentSelektor = New DokumentSelektor() dokumentSelektor.XmlTagId = xmlTagId dokumentSelektor.DokumentWertInhaltId = dokumentWertInhaltId dokumentSelektor.Wert = XmlHelper.GetItemValueByTagName(Me.XmlDocument, dokumentSelektor.XmlTagId) If Not String.IsNullOrEmpty(dokumentSelektor.Wert) Then If ignoreSpaces Then dokumentSelektor.Wert = dokumentSelektor.Wert.Replace(" ", "") End If If useValueIndex >= 0 Then Dim values As String() = dokumentSelektor.Wert.Split(";") dokumentSelektor.Wert = values(useValueIndex) End If If isDate Then dokumentSelektor.Wert = GetInhaltDatumFromXmlDatum(dokumentSelektor.Wert) End If Me.Selektors.Add(dokumentSelektor) End If End Sub Private Function GetInhaltDatumFromXmlDatum(wert As String) As String Dim ret As String = "" ret = wert.Substring(6, 2) + "." + wert.Substring(4, 2) + "." + wert.Substring(0, 4) Return ret End Function Public Sub Fill() DokumentIds = New List(Of String) Dim connectionString As String = Globals.sConnectionString_edoka Me.SelektorFromInhalt = New Dictionary(Of String, DokumentSelektor) Using connection As New SqlConnection(connectionString), dtDokument As New DataTable, daDokument As New SqlDataAdapter, scDokument As New SqlCommand scDokument.Connection = connection Dim selektorString As String = "" Dim counter As Integer = 0 ' Mit den Selektoren das SqlCommand parametrisieren For Each selektor As DokumentSelektor In Me.Selektors Dim paramName As String = "@Inhalt" + counter.ToString() If selektorString.Length > 0 Then selektorString = selektorString + "," End If selektorString = selektorString + paramName Dim paramValue As String = selektor.DokumentWertInhaltId + ";" + selektor.Wert Me.SelektorFromInhalt.Item(paramValue) = selektor scDokument.Parameters.AddWithValue(paramName, paramValue) counter = counter + 1 Next If counter > 0 Then ' wenigstens ein Selektor muss vorhanden sein Dim commandTextFormat As String = "select d.dokumentid, diw.inhalt from dbo.dokument d inner join dbo.dokumentinfo_wert diw on d.dokumentid = diw.dokumentid where d.dokumenttypnr = 1176 and d.nrpar00= {0} and diw.inhalt in ({1}) order by d.dokumentid, diw.inhalt" Dim commandText As String = String.Format(commandTextFormat, PartnerNr, selektorString) scDokument.CommandText = commandText daDokument.SelectCommand = scDokument daDokument.Fill(dtDokument) ' In der Tabelle darf nur eine DokumentId aufgeführt sein und zu dieser DokumentId ' müssen alle Selektoren aufgeführt (Property Filled) sein Dim lastDokumentId As String = "" For Each row As DataRow In dtDokument.Rows Dim dokumentId As String = row.Item(0) If lastDokumentId = "" Then lastDokumentId = dokumentId End If If lastDokumentId <> dokumentId Then If Me.AllSelektorsFilled() Then DokumentIds.Add(lastDokumentId) End If Me.EmptyAllSelektors() lastDokumentId = dokumentId End If If lastDokumentId = dokumentId Then Dim inhalt As String = row.Item(1) Dim selektor As DokumentSelektor = New DokumentSelektor If SelektorFromInhalt.TryGetValue(inhalt, selektor) Then selektor.Filled = True End If End If Next If lastDokumentId <> "" Then If Me.AllSelektorsFilled() Then DokumentIds.Add(lastDokumentId) End If End If End If End Using End Sub Private Function AllSelektorsFilled() As Boolean Dim ret As Boolean = True For Each selektor As DokumentSelektor In Selektors If Not selektor.Filled Then ret = False Exit For End If Next Return ret End Function Private Sub EmptyAllSelektors() For Each selektor As DokumentSelektor In Selektors selektor.Filled = False Next End Sub Public Property Selektors As List(Of DokumentSelektor) Public Property SelektorFromInhalt As Dictionary(Of String, DokumentSelektor) Public Property XmlDocument As XmlDocument Public Property PartnerNr As Int32 Public Property DokumentIds As List(Of String) End Class