vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Linq2Dataset 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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