Code zusammenfassen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Code zusammenfassen

    Hallo Community,
    kann man unten angeführte Beispiel-Routinen, die in ihrer Funktion gleich arbeiten, noch weiter zusammenfassen?
    Momentan stehen sie in verschiedenen Überladungen...

    VB.NET-Quellcode

    1. Private Sub CopyChildRows(ParentRow As OberTabelleRow, Tabelle As ErsteUnterTabelleDataTable, Column As Func(Of ErsteUnterTabelleRow, Integer))
    2. For Each e In (From r In Tabelle Where r.RowState <> DataRowState.Deleted AndAlso r.OberGruppeID = ParentRow.OberGruppeID Select Column(r)).Distinct.ToList
    3. Dim newRow = Tabelle.NewErsteUnterTabelleRow
    4. newRow.OberGruppeID = ParentRow.OberGruppeID
    5. newRow.UnterGruppeID = ParentRow.UnterGruppeID
    6. newRow.WertA = e
    7. Tabelle.AddErsteUnterTabelleRow(newRow)
    8. Next
    9. End Sub
    10. Private Sub CopyChildRows(ParentRow As OberTabelleRow, Tabelle As ZweiteUnterTabelleDataTable, Column As Func(Of ZweiteUnterTabelleRow, Integer))
    11. For Each e In (From r In Tabelle Where r.RowState <> DataRowState.Deleted AndAlso r.OberGruppeID = ParentRow.OberGruppeID Select Column(r)).Distinct.ToList
    12. Dim newRow = Tabelle.NewZweiteUnterTabelleRow
    13. newRow.OberGruppeID = ParentRow.OberGruppeID
    14. newRow.UnterGruppeID = ParentRow.UnterGruppeID
    15. newRow.WertB = e
    16. Tabelle.AddZweiteUnterTabelleRow(newRow)
    17. Next
    18. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    VB1963 schrieb:

    zusammenfassen
    ich denk schon.
    Gib ErsteUnterTabelleDataTable und ZweiteUnterTabelleDataTable eine gemeinsame Basisklasse und fasse dort die Properties NewErsteUnterTabelleRow und NewZweiteUnterTabelleRow zusammen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB1963 schrieb:

    Wie geht man da vor?
    Das ist was für den @ErfinderDesRades
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    jo, zunächstmal braucht man dafür kein Linq, sondern ChildRows kann man doch direkt abrufen, ohne das typisierte System zu verlassen.
    Fast dasselbe ist übrigens in 4Views, Film#8 gecodet- nur wird nicht in eine annere Table kopiert, sondern in dieselbe, unter eine annere ParentRow.

    Aber nur fast dasselbe, weil du willst den ganzen kram ja in annere DataTables kopieren - das ist vom Datenmodell her sehr fragwürdig, also frag ich: Warum?
    (in der Hoffnung, mehr relational gedachte Alternativen zu finden)

    Ansonsten müsstest du halt das typisierte System verlassen und - was Rod sagt - über die Basisklasse gehen. Die gibts halt schon - die untypisierte DataTable, und die verfügt auch über geeignete Methoden, aber halt untypisiert, da wäre also eine Ausnahme zu machen, musst du wissen, obs dir das wert ist.
    Denkbar ist eine Copy-Methode, die eine ParentRow angibt, eine DataRelation und eine Ziel-DataTable.

    Da ist u.U. auch recht listenreiches möglich, etwa mittm ItemArray, aber vordringlich zu klären finde ich wirklich, obs im relationalen Modell nicht andere Möglichkeiten gibt als so ein ChildRow-geklone.
    Danke für eure Hinweise.
    Zum besseren Verständnis ist im Anhang ein Tabellenschema angehängt.
    In den Sub's werden Daten von der jeweiligen Untertabelle nur in Abhängigkeit der Obergruppe zusammengefasst
    und dann wieder in eine Untergruppe der selben Obergruppe kopiert.
    Da kann man nicht mit ParentRow.getErsteUntertabelleRows arbeiten, weil da dann auch die Untergruppe mitberücksichtigt wird.
    Bei einer neu angelegten Parentrow mit neuer Untergruppe können dann noch keine Daten in den UnterTabellen vorhanden sein.
    Daher auch die Copy-Prozedur, damit man vorschlagsweise die Daten von den anderen Untergruppen der selben Obergruppe kopieren kann.

    Im obigen Code könnte ich mir den Selektor für die Column sparen, weil es nur eine Column in den Untertabellen zum auswählen gibt.
    Auf Grund eurer Antworten glaub ich, dass es keine einfache Möglichkeit geben wird, auch so einen Selektor für Tabellen in der Signatur anzugeben...
    Bilder
    • CodeZusammenfassen.PNG

      18,24 kB, 675×242, 126 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    VB1963 schrieb:

    Da kann man nicht mit ParentRow.getErsteUntertabelleRows arbeiten, weil da dann auch die Untergruppe mitberücksichtigt wird.
    naja - du könntest eine andere Relation machen. Es ist auch möglich mehrere Relationenen zwischen dieselben Tabellen zu setzen.
    Mache ich in seltenen Fällen, und dann vorzugsweise "nur Beziehung". Dann kann man ChildRows zwar abrufen, hat aber keine Löschweitergabe und sowas.

    VB1963 schrieb:

    Auf Grund eurer Antworten glaub ich, dass es keine einfache Möglichkeit geben wird, auch so einen Selektor für Tabellen in der Signatur anzugeben...
    na, ich hab doch gesagt: mit untypisierten DataTables ist ein Selector durchaus möglich.

    Ich peile immer noch nicht recht, was das ganze soll, aber eine Methode mit folgender Signatur müsste die 3 Kopiervorgänge über einen Kamm scheren können:

    VB.NET-Quellcode

    1. Private Sub CopyChildRows(ParentRow As OberTabelleRow, Tabelle As DataTable, Column As Func(Of DataRow, Integer))
    Es ist auch möglich mehrere Relationenen zwischen dieselben Tabellen zu setzen.

    Danke für diesen Hinweis, jetzt habe ich die Prozeduren damit weiter verkürzen können. Da kann man's bei den einzelnen Überladungen schon belassen und trotzdem typisiert vorgehen.
    Wie du gesagt hast, eine zweite Relation ohne den UnterGruppen-Schlüssel anlegen und es wird ein zusätzliches Get...By...Rows generiert :)

    VB.NET-Quellcode

    1. Private Sub CopyEntity(ParentRow As OberTabelleRow, Entity As ErsteUnterTabelleDataTable)
    2. For Each e In ParentRow.GetErsteUnterTabelleDataTableRowsByOberTabelleRow_ErsteUnterTabelleDataTable.Select(Function(r) r.WertA).Distinct.ToList
    3. Entity.AddErsteUnterTabelleRow(ParentRow.OberGruppeID, ParentRow.UnterGruppeID, e)
    4. Next
    5. End Sub
    6. Private Sub CopyEntity(ParentRow As OberTabelleRow, Entity As ZweiteUnterTabelleDataTable)
    7. For Each e In ParentRow.GetZweiteUnterTabelleDataTableRowsByOberTabelleRow_ZweiteUnterTabelleDataTable.Select(Function(r) r.WertB).Distinct.ToList
    8. Entity.AddZweiteUnterTabelleRow(ParentRow.OberGruppeID, ParentRow.UnterGruppeID, e)
    9. Next
    10. End Sub

    Ich möchte damit Daten von einer der Untertabellen in die selbe Untertabelle kopieren, wo nur die Daten der aktuellen Obergruppe berücksichtigt werden und die dann als Vorschlag hernehmen.
    Wenn die angewählte Zeile in der Obertabelle eine bereits vorhandene Obergruppe hat und eine neue Untergruppe angegeben wurde, gibt es daher noch keine Daten für diese neue Gruppenangabe....

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()