Announcement

Collapse
No announcement yet.

DataTable.Select mit Function

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataTable.Select mit Function

    Guten Morgen,
    in unserer App gibt es eine Function, die das Patientenalter berechnet, mit einem Wert aus der DB vergleicht und einen String zurückgibt, der entweder leer ist oder einen Meldungstext enthält. Es bestehen noch Abhängigkeiten von mehreren weiteren Parametern, die in die Function eingebaut sind. Im Prinzip ist der Aufruf wie folgt:
    Code:
    mess &= AlterPruefen(CStr(tbl.Rows(0)("C3304")), patAlter)
    Ich brauche nun eine DataTable, die nur Datensätze enthält, bei denen diese Function abhängig vom Feld C3304 einen Leerstring zurückgibt. Das heisst, im dt.Select müsste die Function eingebaut werden. Alle meine Versuche, das zu realisieren, scheitern kläglich. Vielleicht geht es mit LINQ, aber da bin ich noch eine absolute Niete. Kann jemand helfen? Danke.
    Gruß Norbert

  • #2
    Ich helf mir jetzt aus der Patsche, indem ich die Tabelle ohne Altersprüfung erstelle und dann alle Datensätze mit Prüfung nochmal durchlaufe:
    Code:
                For Each rw As DataRow In tbl.Rows
                    If AlterPruefen(CStr(rw("C3304")), patAlter) <> "" Then
                        rw.Delete
                    End If
                Next
    Mist, wenn man so wenig Ahnung hat

    Comment


    • #3
      Wenn ich die Frage wirklich verstehen würde könnte ich vielleicht helfen

      Wenn du nur die Daten aus der Datenbank abrufen willst die deinen Filterkriterium (deine AlterPruefen Methode) entsprechen dann muss das auf der Datenbank ausgeführt werden und nicht in deiner Anwendung. Also entweder sind die Kriterien so darstellbar das man die in der SQL Abfrage verstecken kann die du zur Datenbank schickst oder du hast die AlterPruefen Methode schon passend in der Datenbank mit den entsprechenden von der Datenbank vorgegebenen Möglichkeiten implementiert.

      Wenn du nur lokal filtern kannst, aufgrund der Komplexität von AlterPruefen oder weil es dafür Informationen benutzt die nicht aus dieser Datenbank kommen, dann ist zumindest performancemäßig nicht viel zu verbessern als das was du tust. Explizit Delete aufzurufen um die Daten zu löschen die du nicht sehen willst ist möglicherweise problematisch wenn du diese gefilterte Datenmenge noch bearbeiten willst und diese Änderungen in die Datenbank zurückspielen willst. Dann solltest du zumindest hier nach der Schleife noch AcceptChanges aufrufen damit diese ganze Daten nicht auch aus irgendeinem Grund noch aus der Datenbank gelöscht werden was du vermutlich nicht willst.

      Wenn du nur filtern willst dann könnte tatsächlich Linq helfen das kompakt darzustellen. Eine gefilterte Datenmenge wäre dann ja eine DataView (genau das was am Ende auch rausfällt wenn man einen RowFilter benutzt was wir glaube ich mit dir schon woanders hatten).
      In c# sähe ein passender Linq Ausdruck so aus.

      Code:
      DataView dv=tbl.AsEnumerable().Where(!string.IsNullOrEmpty(AlterPruefen((string)rw("C3304")), patAlter)).AsDataView();
      Das wäre aber nur kompakter letztlich würden auch erst alle Daten aus der Datenbank geholt werden um dann lokal Sachen wieder wegzufiltern. Von der Performance sollte es also gleichwertig zu deiner Lösung sein.

      Comment


      • #4
        Vielen Dank Ralf, Du Unermüdlicher
        hab Dir wieder etwas von Deinem Lebenszeit-Konto geraubt. Aber es hat mir wirklich Klarheit verschafft und Du hast mein Problem absolut verstanden.
        Die Funktion in die DB zu verlagern geht nicht (mehr). Dazu ist sie zu komplex (will sagen, sie wird von vielen Klassen und von unterschiedlichen Programmstellen aus genutzt). In diesem Fall brauche ich sie nur, um eine Anzeige in einer patient-spezifischen TreeView (Heilmittelkatalog) zu steuern. Es dürfen da nur Knoten angezeigt werden, die bestimmten Kriterien entsprechen. Und dabei ist auch das Alter eins davon. Die Table ist nur eine Sprosse auf der Leiter. Sie lebt nur ganz kurz. AcceptChanges ist daher nicht nötig. Beruhigend für mich ist nun, dass mein Vorgehen auch nicht teurer ist, als alle anderen. Also wird es so verkauft (nur an meine Tochter, sie ist leider mein einziger Kunde).
        Viele Grüße
        Norbert

        Comment

        Working...
        X