| |
VB.NET - Ein- und UmsteigerLinq2Dataset Abfrage mit 'Null' Werten | | | Autor: Theo_kkv | Datum: 14.04.20 18:41 |
| Hallo,
ich habe diese Linq2Dataset Abfrage, die im wesentlichen anschlägt, wenn die Summe aus Zahlung1 und Zahlung2 < als der Rechnungsbetrag sind.
Return (From rechnungen In loc_ds.Tables("Rechnungen").AsEnumerable()
Where rechnungen.Field(Of Decimal)("Rechnungsbetrag") > ( _
rechnungen.Field(Of Nullable(Of Decimal))("Zahlung1") + _
rechnungen.Field(Of Nullable(Of Decimal))("Zahlung2"))
Select New Class_rechnung With
{.Rechnungsbetrag = rechnungen.Field(Of Decimal)( _
"Rechnungsbetrag")}).ToList Sofern für Zahlung1 und Zahlung2 die Werte '0' eingetragen sind, klappt alles prima. Sind die Felder jedoch leer, wird die Abfrage nicht durchgeführt.
Gibt es eine Möglichkeit in die Linq Abfrage etwas einzufügen, dass für die Bedingungsabfrage aus dbNull '0' macht?
Vielen Dank für Hinweise.
Tom | |
Re: Linq2Dataset Abfrage mit 'Null' Werten | | | Autor: Manfred X | Datum: 14.04.20 20:31 |
| Hallo!
Du benötigst eine Funktion,die als Parameter eine Nullable of Decimal übernimmt
und ggf. eine 0 oder den Wert zurückliefert. Diese Funktion rufst Du in der
Linq-Abfrage für die Felder auf.
Ob diese Strategie tatsächlich sachlich sinnvoll ist, mußt Du entscheiden. | |
Re: Linq2Dataset Abfrage mit 'Null' Werten | | | Autor: Theo_kkv | Datum: 15.04.20 14:00 |
| Danke Manfred X für diesen ersten Ansatz. Ich habe mal eine kleine Funktion zusammengestellt, die gleich prüft, ob Nullwerte übergeben werden, die Summenbildung macht und entsprechend der Bedingung 'true' oder 'false' zurück gibt.
Public Shared Function umwandler(ByVal Zahlung1 As Nullable(Of Decimal), ByVal _
Zahlung2 As Nullable(Of Decimal), ByVal Rechnungsbetrag As Decimal) As Boolean
If Zahlung1.HasValue Then
If Zahlung2.HasValue Then
If Zahlung1.Value + Zahlung2.Value < Rechnungsbetrag Then
Return True
Else
Return False
End If
Return False
End If
Return False
End If
Return False
End Function Das ist der ganze Codebereich aus der Where Klausel von meiner obigen LINQ Abfrage. Wie kann ich diese Funktion jetzt in die LINQ Abfrage einbauen?
Grüße Tom | |
Re: Linq2Dataset Abfrage mit 'Null' Werten | | | Autor: Manfred X | Datum: 15.04.20 18:54 |
| Hier ein Beispiel für eine Funktion in der Linq-Abfrage in Windows.Form:
Public Class frmAdjustNull
Dim dt As New DataTable
Private Sub frmAdjustNull_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
'Einige Beispieldaten
dt.Columns.Add("Rechnungsbetrag", GetType(Decimal))
dt.Columns.Add("Zahlung1", GetType(Decimal))
dt.Columns.Add("Zahlung2", GetType(Decimal))
dt.Rows.Add(1000, 100, 100)
dt.Rows.Add(2000, 200, Nothing)
dt.Rows.Add(3000, Nothing, 300)
Dim betrag As List(Of Decimal) =
(From rechnungen In dt.AsEnumerable()
Let Differenz As Decimal =
Adjustnothing(rechnungen.Field(Of Decimal)("Rechnungsbetrag")) - (
Adjustnothing(rechnungen.Field(Of Nullable(Of Decimal))("Zahlung1")) +
Adjustnothing(rechnungen.Field(Of Nullable(Of Decimal))("Zahlung2")))
Select Differenz).ToList
End Sub
Private Function Adjustnothing(vl As Nullable(Of Decimal)) As Decimal
If vl.HasValue Then
Return vl.Value
Else
Return 0
End If
End Function
End Class | |
Re: Linq2Dataset Abfrage mit 'Null' Werten | | | Autor: Theo_kkv | Datum: 18.04.20 12:24 |
| Hallo,
Dein Beispiel hat teilweise zur Aufhellung beigetragen. Ich habe dennoch versucht, die Funktion in die LINQ Abfrage einzubauen. Es ging nach etwas probieren doch überraschend gut mit diesem Code.
Dim res = (From rechnungen In loc_ds.Tables("Rechnungen").AsEnumerable()
Where Where umwandler(rechnungen.Field(Of Nullable(Of Decimal))( _
"Zahlung1"), rechnungen.Field(Of Nullable(Of Decimal))("Zahlung2"), _
rechnungen.Field(Of Decimal)("Rechnungsbetrag")) = True)
Select New Class_rechnung With
{.Rechnungsbetrag = rechnungen.Field(Of Decimal)( _
"Rechnungsbetrag")}).ToList
Return res Die Funktion 'umwandler' reagiert jedoch nicht bei der Eigenschaft 'hasvalue', weil bei Leerwerten 'Nothing' übergeben wird.
Public Shared Function umwandler(ByVal Zahlung1 As Nullable(Of Decimal), ByVal _
Zahlung2 As Nullable(Of Decimal), ByVal Rechnungsbetrag As Decimal) As _
Boolean
If Zahlung1 Is Nothing Then
Zahlung1 = 0
If Zahlung2 Is Nothing Then
Zahlung2 = 0
If Zahlung1.Value + Zahlung2.Value < Rechnungsbetrag Then
Return True
End If
Else
If Zahlung1.Value + Zahlung2.Value < Rechnungsbetrag Then
Return True
Else
Return False
End If
End If
Return False
Else
If Zahlung2 Is Nothing Then
Zahlung2 = 0
If Zahlung1.Value + Zahlung2.Value < Rechnungsbetrag Then
Return True
Else
Return False
End If
Else
If Zahlung1.Value + Zahlung2.Value < Rechnungsbetrag Then
Return True
Else
Return False
End If
End If
End If
Return False
End Function Mit diesem Code läuft alles wie erhofft und gewollt. Für mich war es ein Lernerfolg, wie eine Funktion in LINQ eingefügt werden kann. Ich denke, damit künftig komplexere Vorgänge auslagern zu können.
Nochmals Dank an Manfred X für den Denkanstoss.
Grüße
Tom | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|