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
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
|