You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
6.3 KiB

Imports System.Data.SqlClient
Imports System.Xml
''' <summary>
''' 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.
''' </summary>
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